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

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2012-02-22 
12:48:04 UTC ---
    b = b.0;
    a = b->a;
    D.2361 = a->b;
    if (D.2361 != 0B) goto <D.2362>; else goto <D.2363>;
    <D.2362>:
    D.2364 = a->b;
    B::~B (D.2364);
    D.2365 = a->b;
    operator delete (D.2365);

which is indeed as if written like:

  a->b->~B();
  operator delete(a->b); // a is already deleted


if 'a' is not a pointer-to-const then instead you get

    b = b.0;
    a = b->a;
    D.2361 = a->b;
    if (D.2361 != 0B) goto <D.2362>; else goto <D.2363>;
    <D.2362>:
    B::~B (D.2361);
    operator delete (D.2361);

calling the destructor and operator delete directly on the value of a->b

Reply via email to