https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116439
Bug ID: 116439
Summary: [14/15 Regression] decltype(auto) in return type of
lambda uses the type of the outer scope, not the
capture
Product: gcc
Version: 14.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: valentin at tolmer dot fr
Target Milestone: ---
$ cat source.cpp
struct S {
S() = default;
S(const S&) = delete;
};
int main() {
S source;
[&] -> decltype(auto) {
return source;
}();
}
$ g++ -std=c++23 source.cpp
source.cpp: In lambda function:
source.cpp:9:12: error: use of deleted function 'S::S(const S&)'
9 | return source;
| ^~~~~~
source.cpp:3:3: note: declared here
3 | S(const S&) = delete;
| ^
source.cpp:9:12: note: use '-fdiagnostics-all-candidates' to display considered
candidates
9 | return source;
| ^~~~~~
Compiler returned: 1
AFAIU, starting from 14.1 the decltype(auto) deduces the type from the `S
source;`, the outer variable, rather than the implicit by-ref capture of the
same name. Writing `return (source);` correctly deduces the reference.
Introducing an explicitly named capture `[&source = source]` correctly deduces
the reference.
GCC 13.3 and below returns a reference.