]> granicus.if.org Git - clang/commitdiff
Refine codegen for covariant thunks that return references.
authorMike Stump <mrs@apple.com>
Tue, 3 Nov 2009 19:03:17 +0000 (19:03 +0000)
committerMike Stump <mrs@apple.com>
Tue, 3 Nov 2009 19:03:17 +0000 (19:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85916 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Type.cpp
lib/CodeGen/CGVtable.cpp
test/CodeGenCXX/virt.cpp

index 65ed7675220fbb1cab9129a904a04e4d8075b715..3608d34c691d38f492eb9ffa3a025045a67c4fe7 100644 (file)
@@ -224,6 +224,8 @@ QualType Type::getPointeeType() const {
     return OPT->getPointeeType();
   if (const BlockPointerType *BPT = getAs<BlockPointerType>())
     return BPT->getPointeeType();
+  if (const ReferenceType *RT = getAs<ReferenceType>())
+    return RT->getPointeeType();
   return QualType();
 }
 
index 3980330670917d1a57442d40b713bf8c59f3c8d6..e2e11478de26901dfe205aa744600a5d128e0c72 100644 (file)
@@ -159,8 +159,8 @@ public:
   /// getNVOffset - Returns the non-virtual offset for the given (B) base of the
   /// derived class D.
   Index_t getNVOffset(QualType qB, QualType qD) {
-    qD = qD->getAs<PointerType>()->getPointeeType();
-    qB = qB->getAs<PointerType>()->getPointeeType();
+    qD = qD->getPointeeType();
+    qB = qB->getPointeeType();
     CXXRecordDecl *D = cast<CXXRecordDecl>(qD->getAs<RecordType>()->getDecl());
     CXXRecordDecl *B = cast<CXXRecordDecl>(qB->getAs<RecordType>()->getDecl());
     int64_t o = getNVOffset_1(D, B);
@@ -174,8 +174,8 @@ public:
   /// getVbaseOffset - Returns the index into the vtable for the virtual base
   /// offset for the given (B) virtual base of the derived class D.
   Index_t getVbaseOffset(QualType qB, QualType qD) {
-    qD = qD->getAs<PointerType>()->getPointeeType();
-    qB = qB->getAs<PointerType>()->getPointeeType();
+    qD = qD->getPointeeType();
+    qB = qB->getPointeeType();
     CXXRecordDecl *D = cast<CXXRecordDecl>(qD->getAs<RecordType>()->getDecl());
     CXXRecordDecl *B = cast<CXXRecordDecl>(qB->getAs<RecordType>()->getDecl());
     if (D != Class)
index e0067d6c129f8a7b0b3c1031ae62e0812dd8bd11..4607e6a19ad6a1ace49ae4904b8be88ef9ab2485 100644 (file)
@@ -1113,6 +1113,38 @@ class test17_D : public test17_B2 {
 // CHECK-LP64-NEXT: .quad __ZN9test17_B13barEv
 
 
+struct test18_NV1 {
+  virtual void fooNV1() { }
+virtual void foo_NV1() { }
+  int i;
+};
+
+struct test18_NV2 {
+  virtual test18_NV2& foo1() { return *this; }
+virtual void foo_NV2() { }
+virtual void foo_NV2b() { }
+  int i;
+};
+
+struct test18_B : public test18_NV1, test18_NV2 {
+  virtual test18_B& foo1() { return *this; }
+  virtual test18_B *foo2() { return 0; }
+  virtual test18_B *foo3() { return 0; }
+virtual void foo_B() { }
+  int i;
+};
+
+struct test18_B2 : test18_NV1, virtual test18_B {
+  virtual test18_B2& foo1() { return *this; }
+  virtual test18_B2 *foo2() { return 0; }
+virtual void foo_B2() { }
+  int i;
+};
+
+struct test18_D : test18_NV1, virtual test18_B2 {
+  virtual test18_D& foo1() { return *this; }
+} d;
+
 
 // CHECK-LP64: __ZTV1B:
 // CHECK-LP64-NEXT: .space 8