]> granicus.if.org Git - clang/commitdiff
arc: diagnose dereferencing a __weak pointer which may be
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 16 Jun 2011 17:29:56 +0000 (17:29 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 16 Jun 2011 17:29:56 +0000 (17:29 +0000)
null at any time. // rdar://9612030

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaObjC/arc.m

index b608a5d694f3c61707056359842b25c5ea4e19f8..9d354389750e8900611e81886cd613e957e4afe0 100644 (file)
@@ -2815,6 +2815,9 @@ def err_typecheck_member_reference_struct_union : Error<
   "member reference base type %0 is not a structure or union">;
 def err_typecheck_member_reference_ivar : Error<
   "%0 does not have a member named %1">;
+def error_arc_weak_ivar_access : Error<
+  "dereferencing a __weak pointer is not allowed due to possible "
+  "null value caused by race condition, assign it to strong variable first">;
 def err_typecheck_member_reference_arrow : Error<
   "member reference type %0 is not a pointer">;
 def err_typecheck_member_reference_suggestion : Error<
index 3122d42cdb964af40c1ee32e4cf92c9795cd7b04..5e30e7179c6c9aacdfedc9702abcf30e26fa494d 100644 (file)
@@ -4333,6 +4333,16 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr,
         Diag(MemberLoc, diag::error_protected_ivar_access)
           << IV->getDeclName();
     }
+    if (getLangOptions().ObjCAutoRefCount) {
+      Expr *BaseExp = BaseExpr.get()->IgnoreParenImpCasts();
+      if (UnaryOperator *UO = dyn_cast<UnaryOperator>(BaseExp))
+        if (UO->getOpcode() == UO_Deref)
+          BaseExp = UO->getSubExpr()->IgnoreParenCasts();
+      
+      if (DeclRefExpr *DE = dyn_cast<DeclRefExpr>(BaseExp))
+        if (DE->getType().getObjCLifetime() == Qualifiers::OCL_Weak)
+          Diag(DE->getLocation(), diag::error_arc_weak_ivar_access);
+    }
 
     return Owned(new (Context) ObjCIvarRefExpr(IV, IV->getType(),
                                                MemberLoc, BaseExpr.take(),
index fa3a06183e882c784a09d4f6c4069c03eee07069..4c2ae236ac6c9891275c260850883273394e8e5e 100644 (file)
@@ -548,3 +548,18 @@ int Test31() {
     int k = (pcls->isa ? i : j); // expected-error {{member reference base type 'Class<PTest31>' is not a structure or union}}
     return cls->isa ? i : j; // expected-error {{member reference base type 'Class' is not a structure or union}}
 }
+
+// rdar://9612030
+@interface ITest32 {
+@public
+ id ivar;
+}
+@end
+
+id Test32(__weak ITest32 *x) {
+  __weak ITest32 *y;
+  x->ivar = 0; // expected-error {{dereferencing a __weak pointer is not allowed}}
+  return y ? y->ivar     // expected-error {{dereferencing a __weak pointer is not allowed}}
+           : (*x).ivar;  // expected-error {{dereferencing a __weak pointer is not allowed}}
+}
+