semantics.c (cxx_eval_call_expression): Handle trivial value-initialization.
authorJason Merrill <jason@redhat.com>
Thu, 31 Oct 2013 15:45:04 +0000 (11:45 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 31 Oct 2013 15:45:04 +0000 (11:45 -0400)
* semantics.c (cxx_eval_call_expression): Handle trivial
value-initialization.
* typeck2.c (store_init_value): Call maybe_constant_init after
cxx_constant_value.

From-SVN: r204266

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/cp/typeck2.c

index e0611100502473e49567cc9ded402d5269c10ce8..c7a0e5d9dc98de1c5a112653850f2eab2fd958f4 100644 (file)
@@ -1,5 +1,10 @@
 2013-10-31  Jason Merrill  <jason@redhat.com>
 
+       * semantics.c (cxx_eval_call_expression): Handle trivial
+       value-initialization.
+       * typeck2.c (store_init_value): Call maybe_constant_init after
+       cxx_constant_value.
+
        * decl.c (cxx_maybe_build_cleanup): Always set LOOKUP_NONVIRTUAL.
        * decl2.c (build_cleanup): Just call cxx_maybe_build_cleanup.
 
index bbdf81ad961e600430b33d292cfc901bb00a1729..de3e8e7dcb895554cb333b99ff6321864cbcac0c 100644 (file)
@@ -8289,12 +8289,18 @@ cxx_eval_call_expression (const constexpr_call *old_call, tree t,
       return t;
     }
 
-  /* Shortcut trivial copy constructor/op=.  */
-  if (call_expr_nargs (t) == 2 && trivial_fn_p (fun))
+  /* Shortcut trivial constructor/op=.  */
+  if (trivial_fn_p (fun))
     {
-      tree arg = convert_from_reference (get_nth_callarg (t, 1));
-      return cxx_eval_constant_expression (old_call, arg, allow_non_constant,
-                                          addr, non_constant_p, overflow_p);
+      if (call_expr_nargs (t) == 2)
+       {
+         tree arg = convert_from_reference (get_nth_callarg (t, 1));
+         return cxx_eval_constant_expression (old_call, arg, allow_non_constant,
+                                              addr, non_constant_p, overflow_p);
+       }
+      else if (TREE_CODE (t) == AGGR_INIT_EXPR
+              && AGGR_INIT_ZERO_FIRST (t))
+       return build_zero_init (DECL_CONTEXT (fun), NULL_TREE, false);
     }
 
   /* If in direct recursive call, optimize definition search.  */
index d6ff3caf00dcee1f7ddc62fea6428f7b6b8680df..9da8e3de8444f8533470c0c2f6f63ffacad8326c 100644 (file)
@@ -775,7 +775,6 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
     {
       bool const_init;
       value = fold_non_dependent_expr (value);
-      value = maybe_constant_init (value);
       if (DECL_DECLARED_CONSTEXPR_P (decl)
          || DECL_IN_AGGR_P (decl))
        {
@@ -786,6 +785,7 @@ store_init_value (tree decl, tree init, vec<tree, va_gc>** cleanups, int flags)
          else
            value = cxx_constant_value (value);
        }
+      value = maybe_constant_init (value);
       const_init = (reduced_constant_expression_p (value)
                    || error_operand_p (value));
       DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = const_init;