constexpr.c (maybe_constant_init): Pull out TARGET_EXPR_INITIAL.

* constexpr.c (maybe_constant_init): Pull out TARGET_EXPR_INITIAL.

	(cxx_eval_outermost_constant_expr): Don't return a CONSTRUCTOR
	with CONSTRUCTOR_NO_IMPLICIT_ZERO.
	(cxx_eval_call_expression): Clear CONSTRUCTOR_NO_IMPLICIT_ZERO.

From-SVN: r241531
This commit is contained in:
Jason Merrill 2016-10-25 13:23:44 -04:00 committed by Jason Merrill
parent 90e261e494
commit f64e0c029c
3 changed files with 43 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2016-10-25 Jason Merrill <jason@redhat.com>
* constexpr.c (maybe_constant_init): Pull out TARGET_EXPR_INITIAL.
(cxx_eval_outermost_constant_expr): Don't return a CONSTRUCTOR
with CONSTRUCTOR_NO_IMPLICIT_ZERO.
(cxx_eval_call_expression): Clear CONSTRUCTOR_NO_IMPLICIT_ZERO.
2016-10-25 Jakub Jelinek <jakub@redhat.com> 2016-10-25 Jakub Jelinek <jakub@redhat.com>
* parser.c (cp_parser_postfix_expression): Adding missing break;. * parser.c (cp_parser_postfix_expression): Adding missing break;.

View File

@ -1665,6 +1665,10 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t,
entry->result = result; entry->result = result;
} }
/* The result of a constexpr function must be completely initialized. */
if (TREE_CODE (result) == CONSTRUCTOR)
CONSTRUCTOR_NO_IMPLICIT_ZERO (result) = false;
pop_cx_call_context (); pop_cx_call_context ();
return unshare_constructor (result); return unshare_constructor (result);
} }
@ -4483,6 +4487,16 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
non_constant_p = true; non_constant_p = true;
} }
if (TREE_CODE (r) == CONSTRUCTOR
&& CONSTRUCTOR_NO_IMPLICIT_ZERO (r))
{
if (!allow_non_constant)
error ("%qE is not a constant expression because it refers to "
"an incompletely initialized variable", t);
TREE_CONSTANT (r) = false;
non_constant_p = true;
}
/* Technically we should check this for all subexpressions, but that /* Technically we should check this for all subexpressions, but that
runs into problems with our internal representation of pointer runs into problems with our internal representation of pointer
subtraction and the 5.19 rules are still in flux. */ subtraction and the 5.19 rules are still in flux. */
@ -4781,6 +4795,8 @@ maybe_constant_init (tree t, tree decl)
t = TREE_OPERAND (t, 0); t = TREE_OPERAND (t, 0);
if (TREE_CODE (t) == INIT_EXPR) if (TREE_CODE (t) == INIT_EXPR)
t = TREE_OPERAND (t, 1); t = TREE_OPERAND (t, 1);
if (TREE_CODE (t) == TARGET_EXPR)
t = TARGET_EXPR_INITIAL (t);
if (!potential_nondependent_static_init_expression (t)) if (!potential_nondependent_static_init_expression (t))
/* Don't try to evaluate it. */; /* Don't try to evaluate it. */;
else else

View File

@ -0,0 +1,20 @@
// { dg-do compile { target c++11 } }
// { dg-final { scan-assembler-not "_ZNSt10unique_ptrC1Ei" } }
namespace std {
struct unique_ptr {
constexpr unique_ptr(int) : p() { }
~unique_ptr() { }
void* p;
};
}
void f()
{
static std::unique_ptr p(1);
}
int main()
{
f();
}