]> granicus.if.org Git - clang/commitdiff
objc++-arc: more diagnosis of converting a weak-unavailable
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 8 Jul 2011 17:41:42 +0000 (17:41 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 8 Jul 2011 17:41:42 +0000 (17:41 +0000)
object to a __weak object type. // rdar://9732636

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@134706 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaCXXCast.cpp
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprCXX.cpp
test/SemaObjC/arc-unavailable-for-weakref.m
test/SemaObjCXX/arc-unavailable-for-weakref.mm

index 2feb043946ec308f113a8cb681ad6c124c48e717..d7b16cf3f69085d4207089f8c5f742209635df9c 100644 (file)
@@ -2574,9 +2574,9 @@ def err_arc_unsupported_weak_class : Error<
   "class is incompatible with __weak references">;
 def err_arc_weak_unavailable_assign : Error<
   "assignment of a weak-unavailable object to a __weak object">;
-def err_arc_cast_of_weak_unavailable : Error<
-  "cast of weak-unavailable object of type %0 to"
-  " a __weak object of type %1">;
+def err_arc_convesion_of_weak_unavailable : Error<
+  "%select{implicit conversion|cast}0 of weak-unavailable object of type %1 to"
+  " a __weak object of type %2">;
 def err_arc_illegal_explicit_message : Error<
   "ARC forbids explicit message send of %0">;
 def err_arc_unused_init_message : Error<
index 0721814c18c557fe9e59f89842616ae734f186df..50e39e0d0439d06e103af876caf53248b2c355ca 100644 (file)
@@ -1774,15 +1774,8 @@ Sema::CXXCheckCStyleCast(SourceRange R, QualType CastTy, ExprValueKind &VK,
     }
   }
 
-  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) {
index fea31aa0469bb23c3e196a2a242d233a9e602960..09c68aef69455948270ba85666231d5898b7a866 100644 (file)
@@ -4068,7 +4068,7 @@ ExprResult Sema::CheckCastTypes(SourceLocation CastStartLoc, SourceRange TyR,
     } 
     else if (!CheckObjCARCUnavailableWeakConversion(castType, castExprType)) {
            Diag(castExpr->getLocStart(), 
-                diag::err_arc_cast_of_weak_unavailable)
+                diag::err_arc_convesion_of_weak_unavailable) << 1
                 << castExprType << castType 
                 << castExpr->getSourceRange();
           return ExprError();
index 4c096fe0ec58d2babfcdfb9c07165f01e0c37f75..7ee9c1bec2041af5411d029ad9ab65e2e455f9ce 100644 (file)
@@ -2340,8 +2340,20 @@ Sema::PerformImplicitConversion(Expr *From, QualType ToType,
       if (From->getType()->isObjCObjectPointerType() &&
           ToType->isObjCObjectPointerType())
         EmitRelatedResultTypeNote(From);
-    }
-
+    } 
+    else if (getLangOptions().ObjCAutoRefCount &&
+             !CheckObjCARCUnavailableWeakConversion(ToType, 
+                                                    From->getType())) {
+           if (Action == AA_Initializing)
+             Diag(From->getSourceRange().getBegin(), 
+                  diag::err_arc_weak_unavailable_assign);
+           else
+             Diag(From->getSourceRange().getBegin(),
+                  diag::err_arc_convesion_of_weak_unavailable) 
+                  << (Action == AA_Casting) << From->getType() << ToType 
+                  << From->getSourceRange();
+         }
+             
     CastKind Kind = CK_Invalid;
     CXXCastPath BasePath;
     if (CheckPointerConversion(From, ToType, Kind, BasePath, CStyle))
index 734fa53472e5828815845a86f934609420d663d7..104314e6b1d316747fef9411c472716b18c3fefe 100644 (file)
@@ -24,7 +24,7 @@ __attribute__((objc_arc_weak_reference_unavailable))
 + (id) new;
 @end
 
-NOWEAK * Test9732636() {
+NOWEAK * Test1() {
   NOWEAK * strong1 = [NOWEAK new];
   __weak id weak1;
   weak1 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
@@ -33,3 +33,15 @@ NOWEAK * Test9732636() {
   return (__weak id)strong1; // expected-error {{cast of weak-unavailable object of type 'NOWEAK *' to a __weak object of type '__weak id'}}
 }
 
+@protocol P @end
+@protocol P1 @end
+
+NOWEAK<P, P1> * Test2() {
+  NOWEAK<P, P1> * strong1 = 0;
+  __weak id<P> weak1;
+  weak1 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
+
+  __weak id<P> weak2 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
+  return (__weak id<P>)strong1; // expected-error {{cast of weak-unavailable object of type 'NOWEAK<P,P1> *' to a __weak object of type '__weak id<P>'}}
+}
+
index a22d79789cadd60fa74384e543a1c80e5bc8d144..a7b357006843d1a86d9f7f78ee075960fdf2c824 100644 (file)
@@ -24,13 +24,24 @@ __attribute__((objc_arc_weak_reference_unavailable))
 + (id) new;
 @end
 
-NOWEAK * Test9732636() {
+NOWEAK * Test1() {
   NOWEAK * strong1 = [NOWEAK new];
   __weak id weak1;
   weak1 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
 
-// FIXME. NYI.
-  __weak id weak2 = strong1; // expected-FIXME {{assignment of a weak-unavailable object to a __weak object}}
-  return (__weak id)strong1; // expected-error {{cast of weak-unavailable object of type 'NOWEAK *__strong' to a __weak object of type '__weak id'}}
+  __weak id weak2 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
+  return (__weak id)strong1; // expected-error {{cast of weak-unavailable object of type 'NOWEAK *' to a __weak object of type '__weak id'}}
+}
+
+@protocol P @end
+@protocol P1 @end
+
+NOWEAK<P, P1> * Test2() {
+  NOWEAK<P, P1> * strong1 = 0;
+  __weak id<P> weak1;
+  weak1 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
+
+  __weak id<P> weak2 = strong1; // expected-error {{assignment of a weak-unavailable object to a __weak object}}
+  return (__weak id<P, P1>)strong1; // expected-error {{cast of weak-unavailable object of type 'NOWEAK<P,P1> *' to a __weak object of type '__weak id<P,P1>'}}
 }