diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2010-08-07 23:11:44 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2010-08-07 23:11:44 +0000 |
commit | 0d30a87e124bb0273fedce3b62401039073fdece (patch) | |
tree | 59eacdf19904cca56fe7d2d2d6d731b3f7a00b8a | |
parent | f84d409903dd4107c8cef5a08fcfce6e5c21d4de (diff) |
PR7800: both virtual and non-virtual bases must be marked as used for VTTs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110526 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/virtual-base-used.cpp | 16 |
2 files changed, 16 insertions, 2 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 08fa97b5e2..94ca031c2a 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -6797,8 +6797,6 @@ void Sema::MarkVirtualMembersReferenced(SourceLocation Loc, e = RD->bases_end(); i != e; ++i) { const CXXRecordDecl *Base = cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl()); - if (i->isVirtual()) - continue; if (Base->getNumVBases() == 0) continue; MarkVirtualMembersReferenced(Loc, Base); diff --git a/test/SemaCXX/virtual-base-used.cpp b/test/SemaCXX/virtual-base-used.cpp new file mode 100644 index 0000000000..c9e3d2f802 --- /dev/null +++ b/test/SemaCXX/virtual-base-used.cpp @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// PR7800 + +class NoDestroy { ~NoDestroy(); }; // expected-note {{declared private here}} +struct A { + virtual ~A(); +}; +struct B : public virtual A { + NoDestroy x; // expected-error {{field of type 'NoDestroy' has private destructor}} +}; +struct D : public virtual B { + virtual void foo(); + ~D(); +}; +void D::foo() { // expected-note {{implicit default destructor for 'B' first required here}} +} |