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.