https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109640
Bug ID: 109640
Summary: Spurious Wdangling-reference for argument to temporary
lambda cast to rvalue reference
Product: gcc
Version: 13.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ed at catmur dot uk
Target Milestone: ---
bool b() {
int a;
int&& i = [](int& r) -> int&& { return static_cast<int&&>(r); }(a);
auto const l = [](int& r) -> int&& { return static_cast<int&&>(r); };
int&& j = l(a);
return &i == &j;
}
<source>: In function 'bool b()':
<source>:3:11: warning: possibly dangling reference to a temporary
[-Wdangling-reference]
3 | int&& i = [](int& r) -> int&& { return static_cast<int&&>(r); }(a);
| ^
<source>:3:68: note: the temporary was destroyed at the end of the full
expression '<lambda closure
object>b()::<lambda(int&)>().b()::<lambda(int&)>(a)'
3 | int&& i = [](int& r) -> int&& { return static_cast<int&&>(r); }(a);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
The heuristic appears to be confused by the lambda itself being a temporary,
even though it is captureless.