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

            Bug ID: 60262
           Summary: explicit destructor call to destructor of Base
                    accepted without using a qualified-id
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: filip.roseen at gmail dot com

Created attachment 32160
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=32160&action=edit
testcase.cpp

struct Base { };
struct Derived : Base { };

int main () {
  Derived * ptr = new Derived;

  ptr->~Base (); // illegal

  // ...
}

--------------------------------------------------------------------------------

gcc (incorrectly) accepts the above, while clang and icc (among others)
correctly issues a diagnostic saying that the statement marked `// illegal` is
illformed.

Destructors are not inherited and with this the destructor of `Base` is not
found via `ptr->~Base`, as can be read about under [class.virtual]p6:

  "Even though destructors are not inherited, <snip />"

This is not to be confused with a qualified explicit destructor call such as
`ptr->Base::~Base ()`, this is correctly accepted and is legal according to
several sections in the standard, including [class.dtor]p13.

Reply via email to