semantics.c (cxx_eval_call_expression): Handle trivial value-initialization.

* 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
This commit is contained in:
Jason Merrill 2013-10-31 11:45:04 -04:00 committed by Jason Merrill
parent b8aaa1a3b9
commit c1c2162ead
3 changed files with 17 additions and 6 deletions

View 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.

View 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. */

View 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;