* semantics.c (cxx_eval_call_expression): Handle trivial
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Oct 2013 15:45:04 +0000 (15:45 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 Oct 2013 15:45:04 +0000 (15:45 +0000)
value-initialization.
* typeck2.c (store_init_value): Call maybe_constant_init after
cxx_constant_value.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204266 138bc75d-0d04-0410-961f-82ee72b054a4

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

index e061110..c7a0e5d 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 bbdf81a..de3e8e7 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 d6ff3ca..9da8e3d 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;