Commit f64e0c02 by Jason Merrill Committed by Jason Merrill

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
parent 90e261e4
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;.
......
...@@ -1665,6 +1665,10 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t, ...@@ -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, ...@@ -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) ...@@ -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
......
// { 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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment