-
- Downloads
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.
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