https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113256

            Bug ID: 113256
           Summary: False -Wdangling-reference positive
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pdimov at gmail dot com
  Target Milestone: ---

The following code
```
#include <utility>
#include <cassert>

template<class M, class T, class A> auto bind( M T::* pm, A a )
{
    return [=]( auto&& x ) -> M const& { return x.*pm; };
}

template<int I> struct arg {};

arg<1> _1;

int main()
{
    std::pair<int, int> pair;
    int const& x = bind( &std::pair<int, int>::first, _1 )( pair );
    assert( &x == &pair.first );
}
```
(https://godbolt.org/z/a555MMTqo)

(reduced from a Boost.Bind test case)

causes

```
<source>:16:16: warning: possibly dangling reference to a temporary
[-Wdangling-reference]
   16 |     int const& x = bind( &std::pair<int, int>::first, _1 )( pair );
      |                ^
```

with GCC 13.2 (but not trunk).

There are indeed two temporaries created in that full expression, but `int
const&` can't possibly bind to any of them.

Reply via email to