1 // PR c++/92106 - ICE with structured bindings and -Wreturn-local-addr. 2 // { dg-do compile { target c++17 } } 3 4 template <typename> struct B; 5 template <typename _Tp> struct B<_Tp *> { typedef _Tp& reference; }; 6 struct C { 7 template <typename _Up> using rebind = _Up *; 8 }; 9 template <typename _Iterator, typename> class D { 10 public: 11 typename B<_Iterator>::reference operator*(); 12 void operator++(); 13 }; 14 15 template <typename _Iterator, typename _Container> 16 bool operator!=(D<_Iterator, _Container>, D<_Iterator, _Container>); 17 template <typename _Tp> class F { 18 public: 19 typedef _Tp value_type; 20 }; 21 22 template <typename _Alloc> struct G { 23 template <typename _Tp> struct H { using type = C::rebind<_Tp>; }; 24 using const_pointer = typename H<typename _Alloc::value_type>::type; 25 }; 26 template <typename _Tp, typename _Alloc = F<_Tp>> class I { 27 typedef D<typename G<_Alloc>::const_pointer, int> const_iterator; 28 29 public: 30 const_iterator begin(); 31 const_iterator end(); 32 }; 33 34 struct A { 35 struct J { 36 int name; 37 int value; 38 }; 39 I<J> members; 40 template <typename Key> const int *find(Key) { 41 for (const auto &[name, value] : members) 42 // See <https://gcc.gnu.org/ml/gcc-patches/2019-10/msg01107.html> 43 // for why we don't warn here. 44 return &value; // { dg-bogus "address of local variable" } 45 return nullptr; 46 } 47 }; 48 int main() { 49 A a; 50 a.find(""); 51 } 52