aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/AST/RecordLayoutBuilder.cpp5
-rw-r--r--test/CodeGenCXX/virt.cpp39
2 files changed, 44 insertions, 0 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index cfd89eaed3..0aa0180195 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -119,6 +119,11 @@ ASTRecordLayoutBuilder::SelectPrimaryVBase(const CXXRecordDecl *RD,
return;
}
}
+ if (i->isVirtual()) {
+ SelectPrimaryVBase(Base, FirstPrimary);
+ if (PrimaryBase.getBase())
+ return;
+ }
}
}
diff --git a/test/CodeGenCXX/virt.cpp b/test/CodeGenCXX/virt.cpp
index 2717d6cf94..c1cf03609c 100644
--- a/test/CodeGenCXX/virt.cpp
+++ b/test/CodeGenCXX/virt.cpp
@@ -1091,6 +1091,45 @@ struct test22_D : test22_s3 { virtual void dtor() { } };
// CHECK-LP64-NEXT: .quad __ZThn8_N8test22_D4dtorEv
+class test23_s1 {
+ virtual void fun1(char *t) { }
+};
+class test23_s2 {
+ virtual void fun2(char *t) { }
+};
+class test23_s3 {
+ virtual void fun3(char *t) { }
+};
+class test23_s4: virtual test23_s1, test23_s2, test23_s3 {
+ virtual void fun4(char *t) { }
+};
+class test23_D: virtual test23_s4 {
+ virtual void fun5(char *t) { }
+};
+
+
+// CHECK-LP64: __ZTV8test23_D:
+// CHECK-LP64-NEXT: .quad 0
+// CHECK-LP64-NEXT: .quad 8
+// CHECK-LP64-NEXT: .quad 0
+// CHECK-LP64-NEXT: .quad 0
+// CHECK-LP64-NEXT: .quad __ZTI8test23_D
+// CHECK-LP64-NEXT: .quad __ZN9test23_s14fun1EPc
+// CHECK-LP64-NEXT: .quad __ZN8test23_D4fun5EPc
+// CHECK-LP64-NEXT .quad 8
+// CHECK-LP64: .quad 0
+// CHECK-LP64-NEXT: .quad 0
+// CHECK-LP64: .quad 18446744073709551608
+// CHECK-LP64-NEXT: .quad 18446744073709551608
+// CHECK-LP64-NEXT: .quad __ZTI8test23_D
+// CHECK-LP64-NEXT: .quad __ZN9test23_s24fun2EPc
+// CHECK-LP64-NEXT: .quad __ZN9test23_s44fun4EPc
+// CHECK-LP64-NEXT: .quad 18446744073709551600
+// CHECK-LP64-NEXT: .quad __ZTI8test23_D
+// CHECK-LP64-NEXT: .quad __ZN9test23_s34fun3EPc
+
+
+test23_D d23;
test22_D d22;
test21_D d21;
test20_D d20;