================
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
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits