https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118323
Bug ID: 118323 Summary: Unhelpful diagnostic for consteval failure inside lambda that is immediate-escalating Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- This C++20 program gives a nice clear diagnostic: consteval int check(int i) { if (i > 100) throw; return i; } void funk(int) { } void func() { #ifdef LAMBDA []{ funk(check(101)); }(); #else funk(check(101)); #endif } int main() { func(); } But if compiled with -DLAMBDA the diagnostic no longer says what's wrong: esc.cc: In function 'void func()': esc.cc:10:4: error: call to consteval function '<lambda closure object>func()::<lambda()>().func()::<lambda()>()' is not a constant expression 8 | []{ | ~~~ 9 | funk(check(101)); | ~~~~~~~~~~~~~~~~~ 10 | }(); | ~^~ esc.cc:10:4: error: 'func()::<lambda()>' called in a constant expression esc.cc:8:3: note: 'func()::<lambda()>' is not usable as a 'constexpr' function because: 8 | []{ | ^ esc.cc:9:9: error: call to non-'constexpr' function 'void funk(int)' 9 | funk(check(101)); | ~~~~^~~~~~~~~~~~ esc.cc:3:6: note: 'void funk(int)' declared here 3 | void funk(int) { } | ^~~~ esc.cc:9:15: note: 'func()::<lambda()>' was promoted to an immediate function because its body contains an immediate-escalating expression 'check(101)' 9 | funk(check(101)); | ~~~~~^~~~~ This is completely unhelpful. It says nothing about the error inside check(101) which makes it not a constant expression. Obviously the lambda body can't be a constant expression, because it calls func(int) which is not constexpr.