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
This commit is contained in:
parent
88436c83a4
commit
51d72abe5e
6 changed files with 28 additions and 2 deletions
|
@ -1,5 +1,13 @@
|
|||
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;
|
||||
|
|
13
gcc/testsuite/g++.dg/cpp0x/constexpr-ref5.C
Normal file
13
gcc/testsuite/g++.dg/cpp0x/constexpr-ref5.C
Normal file
|
@ -0,0 +1,13 @@
|
|||
// 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;
|
Loading…
Add table
Reference in a new issue