Open jakubjelinek opened 10 months ago
Filed this previously as https://github.com/cplusplus/draft/issues/6536
@jicama, @cor3ntin
It seems that all versions of GCC and MSVC on Compiler Explorer accept the code, so changing the standard to ban it seems to have questionable value proposition. I mean I think we should have a core issue for this but we should immediately mark it NAD and say "write a paper for EWG" (where you presumably would attempt to quantify the amount of code that would be broken).
clang rejects it in all versions I've tried.
CWG2838
@t3nsor I would not agree with NAD, but this does somewhat sound like an ewg question, we could send them this issue. (although, as @jakubjelinek mention, this is an unintended consequences of P2036R3, and in that light, we should maybe restore the behavior prior to that paper.
Full name of submitter (unless configured in github; will be published with the issue): Jakub Jelínek
Reference (section label): [basic.scope.block]/2
Link to reflector thread (if any):
Issue description: Is
supposed to be valid after the P2579R0 changes? Before that paper and before P2036R3 this wouldn't be valid, because the capture inhabited the same scope as int i; P2036R3 changed it to inhabit the parameter scope, so parent scope of it and then [basic.scope.block]/2 triggered there. But P2579R0 says that the init capture inhabits lambda scope and isn't that the parent scope of the parameter scope, i.e. grandparent scope of the lambda's compound statement's scope?
And for
auto f = [i = 5] <int N> () { int i; return 0; };
it is even grand-grandparent scope.Suggested resolution: