diff options
author | Warren Hunt <whunt@google.com> | 2013-10-14 20:14:09 +0000 |
---|---|---|
committer | Warren Hunt <whunt@google.com> | 2013-10-14 20:14:09 +0000 |
commit | 42be77672a93fb07ece46cd6b253f08dc79740e1 (patch) | |
tree | 75c4ac6a74c925ea26aad4675067f1dca8c86d0e | |
parent | a443563ff09cd4a93257326b685167e36935af49 (diff) | |
download | bcm5719-llvm-42be77672a93fb07ece46cd6b253f08dc79740e1.tar.gz bcm5719-llvm-42be77672a93fb07ece46cd6b253f08dc79740e1.zip |
Correctly check for distructors when realizing vtordisps
This patch fixes the distructor test when checking for vtordisp requirements in
microsoft record layout. A test case is also included.
Addresses:
http://llvm.org/bugs/show_bug.cgi?id=16406#c7
llvm-svn: 192616
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 2 | ||||
-rw-r--r-- | clang/test/Layout/ms-x86-vtordisp.cpp | 19 |
2 files changed, 19 insertions, 2 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 10c7b5d88fb..05eeae154d0 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2989,7 +2989,7 @@ MicrosoftRecordLayoutBuilder::computeVtorDispSet(const CXXRecordDecl *RD) { for (CXXRecordDecl::method_iterator i = RD->method_begin(), e = RD->method_end(); i != e; ++i) - if ((*i)->isVirtual() && (*i) != RD->getDestructor()) + if ((*i)->isVirtual() && !isa<CXXDestructorDecl>(*i)) Work.insert(*i); while (!Work.empty()) { const CXXMethodDecl *MD = *Work.begin(); diff --git a/clang/test/Layout/ms-x86-vtordisp.cpp b/clang/test/Layout/ms-x86-vtordisp.cpp index 45ac6496821..06ace3221a6 100644 --- a/clang/test/Layout/ms-x86-vtordisp.cpp +++ b/clang/test/Layout/ms-x86-vtordisp.cpp @@ -91,7 +91,24 @@ struct __declspec(align(32)) D : virtual B0, virtual B1 { // CHECK: | [sizeof=96, align=32 // CHECK: | nvsize=12, nvalign=4] +struct AT {
+ virtual ~AT(){}
+};
+struct CT : virtual AT {
+ virtual ~CT();
+};
+CT::~CT(){} + +// CHECK: *** Dumping AST Record Layout
+// CHECK: 0 | struct CT
+// CHECK: 0 | (CT vbtable pointer)
+// CHECK: 4 | struct AT (virtual base)
+// CHECK: 4 | (AT vftable pointer)
+// CHECK: | [sizeof=8, align=4
+// CHECK: | nvsize=4, nvalign=4]
+ int a[ sizeof(A)+ sizeof(C)+ -sizeof(D)]; +sizeof(D)+ +sizeof(CT)]; |