Use the correct CastKind for derived-to-base pointer conversions.

llvm-svn: 81608
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h
index d6bc6e5..3fb8bcb 100644
--- a/clang/lib/Sema/Sema.h
+++ b/clang/lib/Sema/Sema.h
@@ -763,7 +763,8 @@
                            QualType& ConvertedType, bool &IncompatibleObjC);
   bool isObjCPointerConversion(QualType FromType, QualType ToType,
                                QualType& ConvertedType, bool &IncompatibleObjC);
-  bool CheckPointerConversion(Expr *From, QualType ToType);
+  bool CheckPointerConversion(Expr *From, QualType ToType, 
+                              CastExpr::CastKind &Kind);
   bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
                                  QualType &ConvertedType);
   bool CheckMemberPointerConversion(Expr *From, QualType ToType,
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index c6147ef..0883893 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -1094,7 +1094,7 @@
     ImpCastExprToType(From, FromType);
     break;
 
-  case ICK_Pointer_Conversion:
+  case ICK_Pointer_Conversion: {
     if (SCS.IncompatibleObjC) {
       // Diagnose incompatible Objective-C conversions
       Diag(From->getSourceRange().getBegin(),
@@ -1103,18 +1103,21 @@
         << From->getSourceRange();
     }
 
-    if (CheckPointerConversion(From, ToType))
+    
+    CastExpr::CastKind Kind = CastExpr::CK_Unknown;
+    if (CheckPointerConversion(From, ToType, Kind))
       return true;
-    ImpCastExprToType(From, ToType);
+    ImpCastExprToType(From, ToType, Kind);
     break;
-
-    case ICK_Pointer_Member: {
-      CastExpr::CastKind Kind = CastExpr::CK_Unknown;
-      if (CheckMemberPointerConversion(From, ToType, Kind))
-        return true;
-      ImpCastExprToType(From, ToType, Kind);
-      break;
-    }
+  }
+  
+  case ICK_Pointer_Member: {
+    CastExpr::CastKind Kind = CastExpr::CK_Unknown;
+    if (CheckMemberPointerConversion(From, ToType, Kind))
+      return true;
+    ImpCastExprToType(From, ToType, Kind);
+    break;
+  }
   case ICK_Boolean_Conversion:
     FromType = Context.BoolTy;
     ImpCastExprToType(From, FromType);
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index dde5888..7742680 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -1135,7 +1135,8 @@
 /// conversions for which IsPointerConversion has already returned
 /// true. It returns true and produces a diagnostic if there was an
 /// error, or returns false otherwise.
-bool Sema::CheckPointerConversion(Expr *From, QualType ToType) {
+bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
+                                  CastExpr::CastKind &Kind) {
   QualType FromType = From->getType();
 
   if (const PointerType *FromPtrType = FromType->getAs<PointerType>())
@@ -1147,9 +1148,13 @@
           ToPointeeType->isRecordType()) {
         // We must have a derived-to-base conversion. Check an
         // ambiguous or inaccessible conversion.
-        return CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType,
-                                            From->getExprLoc(),
-                                            From->getSourceRange());
+        if (CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType,
+                                         From->getExprLoc(),
+                                         From->getSourceRange()))
+          return true;
+        
+        // The conversion was successful.
+        Kind = CastExpr::CK_DerivedToBase;
       }
     }
   if (const ObjCObjectPointerType *FromPtrType =