| // PR c++/92106 - ICE with structured bindings and -Wreturn-local-addr. |
| // { dg-do compile { target c++17 } } |
| |
| template <typename> struct B; |
| template <typename _Tp> struct B<_Tp *> { typedef _Tp& reference; }; |
| struct C { |
| template <typename _Up> using rebind = _Up *; |
| }; |
| template <typename _Iterator, typename> class D { |
| public: |
| typename B<_Iterator>::reference operator*(); |
| void operator++(); |
| }; |
| |
| template <typename _Iterator, typename _Container> |
| bool operator!=(D<_Iterator, _Container>, D<_Iterator, _Container>); |
| template <typename _Tp> class F { |
| public: |
| typedef _Tp value_type; |
| }; |
| |
| template <typename _Alloc> struct G { |
| template <typename _Tp> struct H { using type = C::rebind<_Tp>; }; |
| using const_pointer = typename H<typename _Alloc::value_type>::type; |
| }; |
| template <typename _Tp, typename _Alloc = F<_Tp>> class I { |
| typedef D<typename G<_Alloc>::const_pointer, int> const_iterator; |
| |
| public: |
| const_iterator begin(); |
| const_iterator end(); |
| }; |
| |
| struct A { |
| struct J { |
| int name; |
| int value; |
| }; |
| I<J> members; |
| template <typename Key> const int *find(Key) { |
| for (const auto &[name, value] : members) |
| // See <https://gcc.gnu.org/ml/gcc-patches/2019-10/msg01107.html> |
| // for why we don't warn here. |
| return &value; // { dg-bogus "address of local variable" } |
| return nullptr; |
| } |
| }; |
| int main() { |
| A a; |
| a.find(""); |
| } |