15.2 says "An object that is partially constructed or partially destroyed will
have destructors executed for all of its fully constructed base classes and
non-variant members, that is, for subobjects for which the principal
constructor (12.6.2) has completed execution and the destructor has not yet
begun execution."  We do this for objects that are created via constructor, and
for array initialization, but not for aggregate initialization of a class:

struct A
{ 
  A() {}
  A(const A&) { throw 1; }
};

int bs;
struct B
{
  B() { ++bs; }
  B(const B&) { ++bs; }
  ~B() { --bs; }
};

struct C
{ 
  B b1;
  A a;
  B b2;
};

int main()
{
  {
    B b1, b2;
    A a;

    try {
      C c = { b1, a, b2 };
    } catch (...) {}
  }
  return bs;
}

icc gets this right.


-- 
           Summary: Partial aggregate initialization not cleaned up on
                    exception
           Product: gcc
           Version: 4.5.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jason at gcc dot gnu dot org
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41449

Reply via email to