https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118856
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Shorter test: struct A { A (); ~A (); }; struct B { B (const A & = A {}); ~B (); }; struct C { C (const B &, const A & = A {}); ~C (); int *begin (); int *end (); }; void foo () { for (auto &i : C { B {} }) ; } This one with latest trunk actually constructs everything, but still in one scope: try { A::A (&D.2705); B::B (&D.2704, &D.2705); A::A (&D.2706); C::C (&D.2703, &D.2704, &D.2706); __for_range = &D.2703; try { try { try { try { __for_begin = C::begin (__for_range); __for_end = C::end (__for_range); goto <D.2712>; <D.2711>: i = __for_begin; __for_begin = __for_begin + 4; <D.2712>: if (__for_begin != __for_end) goto <D.2711>; else goto <D.2709>; <D.2709>: } finally { C::~C (&D.2703); } } finally { A::~A (&D.2706); } } finally { B::~B (&D.2704); } } finally { A::~A (&D.2705); } } finally { D.2703 = {CLOBBER(eos)}; D.2704 = {CLOBBER(eos)}; D.2705 = {CLOBBER(eos)}; D.2706 = {CLOBBER(eos)}; }