From dd1eca34b52d7c9239c59e85ecb372051634bc1e Mon Sep 17 00:00:00 2001 From: John McCall Date: Mon, 9 Apr 2012 21:51:56 +0000 Subject: [PATCH] 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 --- clang/lib/Sema/SemaDeclCXX.cpp | 5 +++-- .../test/CXX/class.access/class.protected/p1.cpp | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 704ff834b469..847f03c948a3 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -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(); + const RecordType *RT = VBase->getType()->castAs(); // 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(Dtor)); DiagnoseUseOfDecl(Dtor, Location); diff --git a/clang/test/CXX/class.access/class.protected/p1.cpp b/clang/test/CXX/class.access/class.protected/p1.cpp index 75c3ffffe82e..c9491e1196f9 100644 --- a/clang/test/CXX/class.access/class.protected/p1.cpp +++ b/clang/test/CXX/class.access/class.protected/p1.cpp @@ -501,3 +501,19 @@ namespace test15 { } }; } + +namespace test16 { + class A { + protected: + ~A(); + }; + + class B : public virtual A { + public: + ~B() {} + }; + + class C : public B { + ~C() {} + }; +}