Some refactoring of member access for
performace sake. Also added a test case.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77502 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 7e82df4..fdaf9d8 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1031,23 +1031,21 @@
         dyn_cast<CXXRecordDecl>(FD->getDeclContext())) {
       QualType DestType = 
         Context.getCanonicalType(Context.getTypeDeclType(RD));
-      if (!DestType->isDependentType() &&
-          !From->getType()->isDependentType()) {
-        QualType FromRecordType = From->getType();
-        QualType DestRecordType = DestType;
-        if (FromRecordType->getAsPointerType()) {
-          DestType = Context.getPointerType(DestType);
-          FromRecordType = FromRecordType->getPointeeType();
-        }
-        if (IsDerivedFrom(FromRecordType, DestRecordType) &&
-            CheckDerivedToBaseConversion(FromRecordType,
-                                     DestRecordType,
-                                     From->getSourceRange().getBegin(),
-                                     From->getSourceRange()))
-          return true;
-        
-        ImpCastExprToType(From, DestType, /*isLvalue=*/true);
+      if (DestType->isDependentType() || From->getType()->isDependentType())
+        return false;
+      QualType FromRecordType = From->getType();
+      QualType DestRecordType = DestType;
+      if (FromRecordType->getAsPointerType()) {
+        DestType = Context.getPointerType(DestType);
+        FromRecordType = FromRecordType->getPointeeType();
       }
+      if (!Context.hasSameUnqualifiedType(FromRecordType, DestRecordType) &&
+          CheckDerivedToBaseConversion(FromRecordType,
+                                       DestRecordType,
+                                       From->getSourceRange().getBegin(),
+                                       From->getSourceRange()))
+        return true;
+      ImpCastExprToType(From, DestType, /*isLvalue=*/true);
     }
   return false;
 }