diff options
author | Patrick Palka <ppalka@redhat.com> | 2025-05-01 11:40:44 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2025-05-01 11:40:44 -0400 |
commit | 9f523d49ada91050445f71821a9a06b0988402f5 (patch) | |
tree | e2bb3aa293ad8cb0013eb7260b619048e5fec1db /gcc/fortran/trans-expr.cc | |
parent | bbc96c9c09921ca7d59564851d0ed6dcd918c300 (diff) | |
download | gcc-9f523d49ada91050445f71821a9a06b0988402f5.zip gcc-9f523d49ada91050445f71821a9a06b0988402f5.tar.gz gcc-9f523d49ada91050445f71821a9a06b0988402f5.tar.bz2 |
c++: poor diag w/ non-constexpr dtor called from constexpr ctor
When diagnosing a non-constexpr constructor call during constexpr
evaluation, explain_invalid_constexpr_fn was passing the genericized
body to require_potential_constant_expression rather than the saved
non-genericized one.
This meant for the below testcase (reduced from PR libstdc++/119282)
in which B::B() is deemed non-constexpr due to the local variable having
a non-constexpr destructor we would then issue the cryptic diagnostic:
constexpr-nonlit19.C:17:16: error: non-constant condition for static assertion
17 | static_assert(f());
| ~^~
constexpr-nonlit19.C:17:16: in ‘constexpr’ expansion of ‘f()’
constexpr-nonlit19.C:13:5: error: ‘constexpr B::B()’ called in a constant expression
13 | B b;
| ^
constexpr-nonlit19.C:6:13: note: ‘constexpr B::B()’ is not usable as a ‘constexpr’ function because:
6 | constexpr B() {
| ^
constexpr-nonlit19.C:8:5: error: ‘goto’ is not a constant expression
8 | for (int i = 0; i < 10; i++) { }
| ^~~
This patch makes us pass the non-genericized body to
require_potential_constant_expression, and so we now emit:
...
constexpr-nonlit19.C:6:13: note: ‘constexpr B::B()’ is not usable as a ‘constexpr’ function because:
6 | constexpr B() {
| ^
constexpr-nonlit19.C:9:3: error: call to non-‘constexpr’ function ‘A::~A()’
9 | }
| ^
constexpr-nonlit19.C:3:12: note: ‘A::~A()’ declared here
3 | struct A { ~A() { } };
| ^
gcc/cp/ChangeLog:
* constexpr.cc (explain_invalid_constexpr_fn): In the
DECL_CONSTRUCTOR_P branch pass the non-genericized body to
require_potential_constant_expression.
gcc/testsuite/ChangeLog:
* g++.dg/cpp23/constexpr-nonlit19.C: New test.
Reviewed-by: Jason Merrill <jason@redhat.com>
Diffstat (limited to 'gcc/fortran/trans-expr.cc')
0 files changed, 0 insertions, 0 deletions