c++: wrong error with static constexpr var in tmpl [PR109876]
Since r8-509, we'll no longer create a static temporary var for the initializer '{ 1, 2 }' for num in the attached test because the code in finish_compound_literal is now guarded by '&& fcl_context == fcl_c99' but it's fcl_functional here. This causes us to reject num as non-constant when evaluating it in a template. Jason's idea was to treat num as value-dependent even though it actually isn't. This patch implements that suggestion. We weren't marking objects whose type is an empty class type constant. This patch changes that so that v_d_e_p doesn't need to check is_really_empty_class. Co-authored-by:Jason Merrill <jason@redhat.com> PR c++/109876 gcc/cp/ChangeLog: * decl.cc (cp_finish_decl): Set TREE_CONSTANT when initializing an object of empty class type. * pt.cc (value_dependent_expression_p) <case VAR_DECL>: Treat a constexpr-declared non-constant variable as value-dependent. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-template12.C: New test. * g++.dg/cpp1z/constexpr-template1.C: New test. * g++.dg/cpp1z/constexpr-template2.C: New test. (cherry picked from commit b5138df9)
Showing
- gcc/cp/decl.cc 10 additions, 3 deletionsgcc/cp/decl.cc
- gcc/cp/pt.cc 7 additions, 0 deletionsgcc/cp/pt.cc
- gcc/testsuite/g++.dg/cpp0x/constexpr-template12.C 38 additions, 0 deletionsgcc/testsuite/g++.dg/cpp0x/constexpr-template12.C
- gcc/testsuite/g++.dg/cpp1z/constexpr-template1.C 25 additions, 0 deletionsgcc/testsuite/g++.dg/cpp1z/constexpr-template1.C
- gcc/testsuite/g++.dg/cpp1z/constexpr-template2.C 25 additions, 0 deletionsgcc/testsuite/g++.dg/cpp1z/constexpr-template2.C
Loading
Please register or sign in to comment