Patch to provide cast of objects in member access
excpression, if needed, and remove some ir-gen code
now unnencessary.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77490 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index f9abb3d..6d21863 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -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));
     }