PR c++/87893 - constexpr ctor ICE on ARM.
authorJason Merrill <jason@redhat.com>
Wed, 23 Jan 2019 13:54:23 +0000 (08:54 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 23 Jan 2019 13:54:23 +0000 (08:54 -0500)
PR c++/88293 - ICE with comma expression.
* constexpr.c (initialized_type): Don't shortcut non-void type.
Handle COMPOUND_EXPR.
(cxx_eval_outermost_constant_expr): Return early for void type.

From-SVN: r268185

gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp0x/constexpr-comma1.C [new file with mode: 0644]

index 111782aeaba1ebd04313dd2f1c7263bd63d0be79..20a54719578151e6aa4b665e05f01faf023b1fc8 100644 (file)
@@ -1,3 +1,11 @@
+2019-01-21  Jason Merrill  <jason@redhat.com>
+
+       PR c++/87893 - constexpr ctor ICE on ARM.
+       PR c++/88293 - ICE with comma expression.
+       * constexpr.c (initialized_type): Don't shortcut non-void type.
+       Handle COMPOUND_EXPR.
+       (cxx_eval_outermost_constant_expr): Return early for void type.
+
 2019-01-21  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/88949
index ed4bbeeb157878bd08721820fc46444dc80dca8b..426814167600c67640a765eb26dc51934ae91a52 100644 (file)
@@ -2848,9 +2848,7 @@ initialized_type (tree t)
   if (TYPE_P (t))
     return t;
   tree type = TREE_TYPE (t);
-  if (!VOID_TYPE_P (type))
-    /* No need to look deeper.  */;
-  else if (TREE_CODE (t) == CALL_EXPR)
+  if (TREE_CODE (t) == CALL_EXPR)
     {
       /* A constructor call has void type, so we need to look deeper.  */
       tree fn = get_function_named_in_call (t);
@@ -2858,6 +2856,8 @@ initialized_type (tree t)
          && DECL_CXX_CONSTRUCTOR_P (fn))
        type = DECL_CONTEXT (fn);
     }
+  else if (TREE_CODE (t) == COMPOUND_EXPR)
+    return initialized_type (TREE_OPERAND (t, 1));
   else if (TREE_CODE (t) == AGGR_INIT_EXPR)
     type = TREE_TYPE (AGGR_INIT_EXPR_SLOT (t));
   return cv_unqualified (type);
@@ -5061,6 +5061,8 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
 
   tree type = initialized_type (t);
   tree r = t;
+  if (VOID_TYPE_P (type))
+    return t;
   if (AGGREGATE_TYPE_P (type) || VECTOR_TYPE_P (type))
     {
       /* In C++14 an NSDMI can participate in aggregate initialization,
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-comma1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-comma1.C
new file mode 100644 (file)
index 0000000..9dd1299
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/88293
+// { dg-do compile { target c++11 } }
+
+struct A
+{ 
+  constexpr A () { }
+};
+
+const A &a = (A (), A ());