Make sure that reinterpret_cast gets a CastKind on all successful
paths. Fixes "cannot compile this unexpected cast lvalue yet" error in
llvm/lib/Analysis/IPA/GlobalsModRef.cpp.

llvm-svn: 91932
diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp
index 92eb174..c9b3b8e 100644
--- a/clang/lib/Sema/SemaCXXCast.cpp
+++ b/clang/lib/Sema/SemaCXXCast.cpp
@@ -1053,8 +1053,11 @@
       return TC_NotApplicable;
 
     // If both types have the same size, we can successfully cast.
-    if (Self.Context.getTypeSize(SrcType) == Self.Context.getTypeSize(DestType))
+    if (Self.Context.getTypeSize(SrcType)
+          == Self.Context.getTypeSize(DestType)) {
+      Kind = CastExpr::CK_BitCast;
       return TC_Success;
+    }
     
     if (destIsScalar)
       msg = diag::err_bad_cxx_cast_vector_to_scalar_different_size;
@@ -1083,6 +1086,7 @@
     // to the same type. However, the behavior of compilers is pretty consistent
     // on this point: allow same-type conversion if the involved types are
     // pointers, disallow otherwise.
+    Kind = CastExpr::CK_NoOp;
     return TC_Success;
   }
 
diff --git a/clang/test/CodeGenCXX/casts.cpp b/clang/test/CodeGenCXX/casts.cpp
index 91ae6af..436b722 100644
--- a/clang/test/CodeGenCXX/casts.cpp
+++ b/clang/test/CodeGenCXX/casts.cpp
@@ -5,6 +5,8 @@
 struct A {
   void copyFrom(const A &src);
   void addRef(void);
+
+  A& operator=(int);
 };
 
 void A::copyFrom(const A &src) {
@@ -12,3 +14,7 @@
 }
 }
 
+// reinterpret_cast to self
+void test(PR5248::A* a) {
+  reinterpret_cast<PR5248::A&>(*a) = 17;
+}