objc++-arc: diagnose assignment/cast of a weak-unavailable
object to a __weak object/type. // rdar://9732636.
One item is yet todo.

llvm-svn: 134655
diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp
index d053d5a..0721814 100644
--- a/clang/lib/Sema/SemaCXXCast.cpp
+++ b/clang/lib/Sema/SemaCXXCast.cpp
@@ -1717,7 +1717,8 @@
     Kind = CK_Dependent;
     return Owned(CastExpr);
   }
-
+  
+  QualType origCastExprType = CastExpr->getType();
   if (VK == VK_RValue && !CastTy->isRecordType()) {
     ExprResult CastExprRes = DefaultFunctionArrayLvalueConversion(CastExpr);
     if (CastExprRes.isInvalid())
@@ -1773,8 +1774,15 @@
     }
   }
 
-  if (getLangOptions().ObjCAutoRefCount && tcr == TC_Success)
+  if (getLangOptions().ObjCAutoRefCount && tcr == TC_Success) {
     CheckObjCARCConversion(R, CastTy, CastExpr, CCK);
+    if (!CheckObjCARCUnavailableWeakConversion(CastTy, 
+                                               origCastExprType))
+      Diag(CastExpr->getLocStart(), 
+           diag::err_arc_cast_of_weak_unavailable)
+      << origCastExprType << CastTy 
+      << CastExpr->getSourceRange();
+  }
 
   if (tcr != TC_Success && msg != 0) {
     if (CastExpr->getType() == Context.OverloadTy) {