diff mbox series

[Ada] Fix crash on very dynamic record types

Message ID 2158591.NH29ZIx2tU@polaris
State New
Headers show
Series [Ada] Fix crash on very dynamic record types | expand

Commit Message

Eric Botcazou Feb. 8, 2019, 11:21 a.m. UTC
This is a regression present on the mainline and 8 branch: in some specific 
circumstances, you can get a crash when max_size is called from the gimplifier 
on very dynamic record types.  This makes the function a bit more robust.

Tested on x86_64-suse-linux, applied on mainline and 8 branch.


2019-02-08  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/utils.c (max_size) <tcc_unary>: Be prepared for an
	operand with VOID_TYPE.
diff mbox series

Patch

Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 268508)
+++ gcc-interface/utils.c	(working copy)
@@ -3642,7 +3642,10 @@  fntype_same_flags_p (const_tree t, tree
 
 /* EXP is an expression for the size of an object.  If this size contains
    discriminant references, replace them with the maximum (if MAX_P) or
-   minimum (if !MAX_P) possible value of the discriminant.  */
+   minimum (if !MAX_P) possible value of the discriminant.
+
+   Note that the expression may have already been gimplified,in which case
+   COND_EXPRs have VOID_TYPE and no operands, and this must be handled.  */
 
 tree
 max_size (tree exp, bool max_p)
@@ -3714,11 +3717,15 @@  max_size (tree exp, bool max_p)
       return build_int_cst (type, max_p ? 1 : 0);
 
     case tcc_unary:
+      op0 = TREE_OPERAND (exp, 0);
+
       if (code == NON_LVALUE_EXPR)
-	return max_size (TREE_OPERAND (exp, 0), max_p);
+	return max_size (op0, max_p);
+
+      if (VOID_TYPE_P (TREE_TYPE (op0)))
+	return max_p ? TYPE_MAX_VALUE (type) : TYPE_MIN_VALUE (type);
 
-      op0 = max_size (TREE_OPERAND (exp, 0),
-		      code == NEGATE_EXPR ? !max_p : max_p);
+      op0 = max_size (op0, code == NEGATE_EXPR ? !max_p : max_p);
 
       if (op0 == TREE_OPERAND (exp, 0))
 	return exp;