[PATCH] Get rid of VTableContext::ComputeMethodVTableIndices() and VTableContext::getNumVirtualFunctionPointers()
Richard Smith
richard at metafoo.co.uk
Mon May 13 12:55:33 PDT 2013
================
Comment at: lib/AST/VTableBuilder.cpp:2319
@@ -2318,3 @@
- // If a class has an implicitly-defined virtual destructor,
- // its entries come after the declared virtual function pointers.
-
----------------
Timur Iskhodzhanov wrote:
> Reid Kleckner wrote:
> > Timur Iskhodzhanov wrote:
> > > Reid Kleckner wrote:
> > > > I don't think Test16::D triggers this case because ~D is overriding ~C, so it goes into the vtable first.
> > > >
> > > > When can you have an implicitly defined virtual dtor without overriding the method of a base class? Is that possible? Good question for Richard or John.
> > > Err, no.
> > > There's no ~D in Test16:D.
> > >
> > > struct C : ... { virtual ~C(); };
> > > struct D : virtual C {
> > > virtual void f();
> > > };
> > >
> > > So C has virtual ~C, thus D should have a virtual dtor.
> > > AFAIU, as there's no explicit ~D, there should be an implicit one.
> > >
> > > Does that sound right?
> > Yes, it's implicit, but it wasn't triggering this code, because it should always hit the codepath for overrides and continue the loop before setting ImplicitVirtualDtor. I'm looking for a counterexample to show that this code isn't dead.
> Errr, it **was** trigerring this code.
>
> I found it by locally replacing the below
>
> if (isMicrosoftABI()) {
>
> with
>
> if (1) {
>
> and it did report an error on Test16::D
If any base class of a class X has a virtual destructor, then X also has a virtual destructor, no matter whether it's declared explicitly or implicitly. If no base class of X has a virtual destructor, and X does not declare a destructor, then its implicit destructor is not virtual. Does that answer the question?
http://llvm-reviews.chandlerc.com/D785
More information about the cfe-commits
mailing list