forked from OSchip/llvm-project
My original patch missed the virtual-base case for destroying
base-class subojects. Incidentally, thinking about virtual bases makes it clear to me that we're not appropriately computing the access to the virtual base's member because we're not computing the best possible access to the virtual base at all; in fact, we're basically assuming it's public. I'll file a separate PR about that. llvm-svn: 154346
This commit is contained in:
parent
d42742143c
commit
dd1eca34b5
|
@ -3356,7 +3356,7 @@ Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
|
|||
E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
|
||||
|
||||
// Bases are always records in a well-formed non-dependent class.
|
||||
const RecordType *RT = VBase->getType()->getAs<RecordType>();
|
||||
const RecordType *RT = VBase->getType()->castAs<RecordType>();
|
||||
|
||||
// Ignore direct virtual bases.
|
||||
if (DirectVirtualBases.count(RT))
|
||||
|
@ -3373,7 +3373,8 @@ Sema::MarkBaseAndMemberDestructorsReferenced(SourceLocation Location,
|
|||
assert(Dtor && "No dtor found for BaseClassDecl!");
|
||||
CheckDestructorAccess(ClassDecl->getLocation(), Dtor,
|
||||
PDiag(diag::err_access_dtor_vbase)
|
||||
<< VBase->getType());
|
||||
<< VBase->getType(),
|
||||
Context.getTypeDeclType(ClassDecl));
|
||||
|
||||
MarkFunctionReferenced(Location, const_cast<CXXDestructorDecl*>(Dtor));
|
||||
DiagnoseUseOfDecl(Dtor, Location);
|
||||
|
|
|
@ -501,3 +501,19 @@ namespace test15 {
|
|||
}
|
||||
};
|
||||
}
|
||||
|
||||
namespace test16 {
|
||||
class A {
|
||||
protected:
|
||||
~A();
|
||||
};
|
||||
|
||||
class B : public virtual A {
|
||||
public:
|
||||
~B() {}
|
||||
};
|
||||
|
||||
class C : public B {
|
||||
~C() {}
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue