Commit 51d72abe by Jason Merrill Committed by Jason Merrill

re PR c++/50473 ([C++0x] ICE in type_has_nontrivial_copy_init, at cp/tree.c:2574)

	PR c++/50473
	* decl.c (cp_finish_decl): Don't try to process a non-dependent
	constant initializer for a reference.
	* pt.c (value_dependent_expression_p): A reference is always
	dependent.
	* call.c (extend_ref_init_temps_1): Also clear TREE_SIDE_EFFECTS
	on any NOP_EXPRs.

From-SVN: r217672
parent 88436c83
2014-11-17 Jason Merrill <jason@redhat.com>
PR c++/50473
* decl.c (cp_finish_decl): Don't try to process a non-dependent
constant initializer for a reference.
* pt.c (value_dependent_expression_p): A reference is always
dependent.
* call.c (extend_ref_init_temps_1): Also clear TREE_SIDE_EFFECTS
on any NOP_EXPRs.
Handle C++14 constexpr flow control.
* constexpr.c (cxx_eval_loop_expr, cxx_eval_switch_expr): New.
(cxx_eval_statement_list): New.
......
......@@ -9712,9 +9712,11 @@ extend_ref_init_temps_1 (tree decl, tree init, vec<tree, va_gc> **cleanups)
{
tree subinit = NULL_TREE;
*p = set_up_extended_ref_temp (decl, *p, cleanups, &subinit);
recompute_tree_invariant_for_addr_expr (sub);
if (init != sub)
init = fold_convert (TREE_TYPE (init), sub);
if (subinit)
init = build2 (COMPOUND_EXPR, TREE_TYPE (init), subinit, init);
recompute_tree_invariant_for_addr_expr (sub);
}
return init;
}
......
......@@ -6419,6 +6419,7 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
else if (init
&& init_const_expr_p
&& !type_dependent_p
&& TREE_CODE (type) != REFERENCE_TYPE
&& decl_maybe_constant_var_p (decl)
&& !type_dependent_init_p (init)
&& !value_dependent_init_p (init))
......
......@@ -20959,6 +20959,8 @@ value_dependent_expression_p (tree expression)
if (DECL_INITIAL (expression)
&& decl_constant_var_p (expression)
&& (TREE_CODE (DECL_INITIAL (expression)) == TREE_LIST
/* cp_finish_decl doesn't fold reference initializers. */
|| TREE_CODE (TREE_TYPE (expression)) == REFERENCE_TYPE
|| value_dependent_expression_p (DECL_INITIAL (expression))))
return true;
return false;
......
......@@ -3,7 +3,7 @@
struct A
{
static constexpr int&& i = 0; // { dg-error "initialization" }
static constexpr int&& i = 0;
};
int j = A::i;
// PR c++/50473
// { dg-do compile { target c++11 } }
constexpr int f() { return 1; }
template<class T>
struct test
{
static constexpr const auto& value = f();
int a[value];
};
test<int> t;
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