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.

Reply via email to