]> granicus.if.org Git - clang/commitdiff
More cleanup of data member access and then some.
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 28 Jul 2009 18:54:57 +0000 (18:54 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 28 Jul 2009 18:54:57 +0000 (18:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77351 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
lib/CodeGen/CGExpr.cpp
test/CodeGenCXX/constructor-init.cpp

index d82b97695196fa219b48a5cd79ba295a02147a52..0b22eb49be853e1f8bcafa3501cb2f651eb9084b 100644 (file)
@@ -168,16 +168,23 @@ llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue,
   getContext().getASTRecordLayout(ClassDecl);
   llvm::Type *I8Ptr = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
   unsigned Idx = 0;
+  bool DerivedToBaseConversion = false;
   for (CXXRecordDecl::base_class_const_iterator i = 
          ClassDecl->bases_begin(),
          e = ClassDecl->bases_end(); i != e; ++i, ++Idx) {
     if (!i->isVirtual()) {
         const CXXRecordDecl *Base =
         cast<CXXRecordDecl>(i->getType()->getAsRecordType()->getDecl());
-        if (Base == BaseClassDecl)
-          break;
+      if (Base == BaseClassDecl) {
+        DerivedToBaseConversion = true;
+        break;
+      }
     }
   }
+  if (!DerivedToBaseConversion) {
+    assert(false && "FIXME - Only derived to imm. base convesion is supported");
+    return BaseValue;
+  }
   uint64_t Offset = Layout.getFieldOffset(Idx) / 8;
   llvm::Value *OffsetVal = llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset);
   BaseValue = Builder.CreateBitCast(BaseValue, I8Ptr);
index b0e091bd0aa8885269e3eb5c1267f47a43cd9ad1..ab0f9e9c7449a6f89430f91d78ab04e7cc57b56a 100644 (file)
@@ -993,15 +993,14 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
     if (PTy->getPointeeType()->isUnionType())
       isUnion = true;
     CVRQualifiers = PTy->getPointeeType().getCVRQualifiers();
-    if (CXXThisExpr *ThisExpr = dyn_cast<CXXThisExpr>(BaseExpr)) {
-      QualType ClassTy = ThisExpr->getType();
-      ClassTy = ClassTy->getPointeeType();
-      CXXRecordDecl *ClassDecl =
-        cast<CXXRecordDecl>(ClassTy->getAsRecordType()->getDecl());
+    QualType ClassTy = BaseExpr->getType();
+    ClassTy = ClassTy->getPointeeType();
+    if (CXXRecordDecl *ClassDecl =
+        dyn_cast<CXXRecordDecl>(ClassTy->getAsRecordType()->getDecl())) {
       FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
-      CXXRecordDecl *BaseClassDecl = 
-        cast<CXXRecordDecl>(Field->getDeclContext());
-      BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
+      if (CXXRecordDecl *BaseClassDecl = 
+          dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
+        BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
     }
   } else if (isa<ObjCPropertyRefExpr>(BaseExpr) ||
              isa<ObjCKVCRefExpr>(BaseExpr)) {
@@ -1021,6 +1020,15 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
     if (BaseExpr->getType()->isUnionType())
       isUnion = true;
     CVRQualifiers = BaseExpr->getType().getCVRQualifiers();
+    if (CXXRecordDecl *ClassDecl =
+          dyn_cast<CXXRecordDecl>(
+                        BaseExpr->getType()->getAsRecordType()->getDecl())) {
+        FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
+        if (CXXRecordDecl *BaseClassDecl = 
+            dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
+            BaseValue = 
+              AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
+    }
   }
 
   FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
index 4f7f8ee8c5aad1b5b4a8d8a5676a9c7638a1eeab..c46a561c3081d780049272e336960f8e44c486a2 100644 (file)
@@ -38,6 +38,9 @@ struct N : M , P, Q {
              printf("iQ = %d\n", iQ);
              printf("iP = %d\n", iP);
               printf("iM = %d\n", iM);
+             printf("iQ = %d\n", (*this).iQ);
+             printf("iP = %d\n", ((*this)).iP);
+              printf("iM = %d\n", this->iM);
             }
   float ld;
   float ff;