[PATCH] Get rid of VTableContext::ComputeMethodVTableIndices() and VTableContext::getNumVirtualFunctionPointers()

Timur Iskhodzhanov timurrrr at google.com
Mon May 13 22:04:30 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.
-
----------------
Richard Smith wrote:
> 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?
Almost, thanks!

Am I right that if a virtual base class V of a class X has a virtual destructor and X doesn't have an explicitly defined dtor, Sema will put ~X at the end of X `CXXRecordDecl`'s method list (as one can only tell there's no explicit ~X at the end of X's definition)?

> but it wasn't triggering this code, because it should always hit the codepath for overrides

Hm, the codepath for overrides only looks for overrides in primary bases, right?

  if (const CXXMethodDecl *OverriddenMD = FindNearestOverriddenMethod(MD, PrimaryBases)) {

I'll check what happens in the case of virtual primary bases.


http://llvm-reviews.chandlerc.com/D785



More information about the cfe-commits mailing list