[cfe-commits] r77490 - in /cfe/trunk: lib/CodeGen/CGExpr.cpp lib/Sema/Sema.h lib/Sema/SemaExpr.cpp test/CodeGenCXX/constructor-init.cpp

Fariborz Jahanian fjahanian at apple.com
Wed Jul 29 11:40:32 PDT 2009


Author: fjahanian
Date: Wed Jul 29 13:40:24 2009
New Revision: 77490

URL: http://llvm.org/viewvc/llvm-project?rev=77490&view=rev
Log:
Patch to provide cast of objects in member access
excpression, if needed, and remove some ir-gen code
now unnencessary.

Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/Sema/Sema.h
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/test/CodeGenCXX/constructor-init.cpp

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=77490&r1=77489&r2=77490&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Wed Jul 29 13:40:24 2009
@@ -993,13 +993,6 @@
     if (PTy->getPointeeType()->isUnionType())
       isUnion = true;
     CVRQualifiers = PTy->getPointeeType().getCVRQualifiers();
-    if (const CXXRecordDecl *ClassDecl = 
-          BaseExpr->getType()->getCXXRecordDeclForPointerType()) {
-      FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
-      if (const CXXRecordDecl *BaseClassDecl = 
-          dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
-        BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
-    }
   } else if (isa<ObjCPropertyRefExpr>(BaseExpr) ||
              isa<ObjCKVCRefExpr>(BaseExpr)) {
     RValue RV = EmitObjCPropertyGet(BaseExpr);
@@ -1019,15 +1012,6 @@
     if (BaseTy->isUnionType())
       isUnion = true;
     CVRQualifiers = BaseTy.getCVRQualifiers();
-    if (const CXXRecordDecl *ClassDecl =
-          dyn_cast<CXXRecordDecl>(
-                        BaseTy->getAsRecordType()->getDecl())) {
-        FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
-        if (const CXXRecordDecl *BaseClassDecl = 
-            dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
-            BaseValue = 
-              AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
-    }
   }
 
   FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());

Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=77490&r1=77489&r2=77490&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Wed Jul 29 13:40:24 2009
@@ -690,6 +690,8 @@
 
   ImplicitConversionSequence TryContextuallyConvertToBool(Expr *From);
   bool PerformContextuallyConvertToBool(Expr *&From);
+  
+  void PerformObjectMemberConversion(Expr *&From, NamedDecl *Member);
 
   /// OverloadingResult - Capture the result of performing overload
   /// resolution.

Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=77490&r1=77489&r2=77490&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Wed Jul 29 13:40:24 2009
@@ -1023,6 +1023,22 @@
   
   return BuildDeclarationNameExpr(Loc, D, HasTrailingLParen, SS, isAddressOfOperand);
 }
+/// \brief Cast member's object to its own class if necessary.
+void
+Sema::PerformObjectMemberConversion(Expr *&From, NamedDecl *Member) {
+  if (FieldDecl *FD = dyn_cast<FieldDecl>(Member))
+    if (CXXRecordDecl *RD = 
+        dyn_cast<CXXRecordDecl>(FD->getDeclContext())) {
+      QualType DestType = 
+        Context.getCanonicalType(Context.getTypeDeclType(RD));
+      if (!DestType->isDependentType() &&
+          !From->getType()->isDependentType()) {
+        if (From->getType()->getAsPointerType())
+          DestType = Context.getPointerType(DestType);
+        ImpCastExprToType(From, DestType, /*isLvalue=*/true);
+      }
+    }
+}
 
 /// \brief Complete semantic analysis for a reference to the given declaration.
 Sema::OwningExprResult
@@ -1114,6 +1130,7 @@
           Expr *This = new (Context) CXXThisExpr(SourceLocation(),
                                                  MD->getThisType(Context));
           MarkDeclarationReferenced(Loc, D);
+          PerformObjectMemberConversion(This, D);
           return Owned(new (Context) MemberExpr(This, true, D,
                                                 Loc, MemberType));
         }
@@ -2190,6 +2207,7 @@
       }
 
       MarkDeclarationReferenced(MemberLoc, FD);
+      PerformObjectMemberConversion(BaseExpr, FD);
       return Owned(new (Context) MemberExpr(BaseExpr, OpKind == tok::arrow, FD,
                                             MemberLoc, MemberType));
     }

Modified: cfe/trunk/test/CodeGenCXX/constructor-init.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructor-init.cpp?rev=77490&r1=77489&r2=77490&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/constructor-init.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/constructor-init.cpp Wed Jul 29 13:40:24 2009
@@ -38,8 +38,10 @@
 	      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);
+	      // FIXME. We don't yet support this syntax.
+	      // printf("iQ = %d\n", (*this).iQ);
+	      printf("iQ = %d\n", this->iQ);
+	      printf("iP = %d\n", this->iP);
               printf("iM = %d\n", this->iM);
             }
   float ld;





More information about the cfe-commits mailing list