utils.c (max_size): Be prepared for an operand with VOID_TYPE.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 8 Feb 2019 11:20:23 +0000 (11:20 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 8 Feb 2019 11:20:23 +0000 (11:20 +0000)
* gcc-interface/utils.c (max_size) <tcc_unary>: Be prepared for an
operand with VOID_TYPE.

From-SVN: r268675

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c

index c1a0d2499207e675ba656322f2700f082873ee99..b120650cda8c7eab1f3c2ee8dacad57330899817 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-08  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils.c (max_size) <tcc_unary>: Be prepared for an
+       operand with VOID_TYPE.
+
 2019-02-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/trans.c (elaborate_all_entities): Do not elaborate the
index 2ff664ba04e3bfae611b6aa19d86ff52e8c95215..65b7e0f3cac9307da0ab10fcf39ed09d995944fa 100644 (file)
@@ -3642,7 +3642,10 @@ fntype_same_flags_p (const_tree t, tree cico_list, bool return_unconstrained_p,
 \f
 /* 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;