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)};
      }

Reply via email to