]> granicus.if.org Git - clang/commitdiff
Objective-C: Issue more precise warning when user
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 27 Mar 2013 21:19:25 +0000 (21:19 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 27 Mar 2013 21:19:25 +0000 (21:19 +0000)
is accessing 'isa' as an object pointer.
// rdar://13503456. FixIt to follow in another patch.

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

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
lib/Sema/SemaExprMember.cpp
test/Analysis/misc-ps-region-store.m
test/SemaObjC/warn-isa-ref.m
test/SemaObjCXX/instantiate-expr.mm

index 398471cc655e2257ff4d13d86f56af905563d8ac..0e1baebe9ad1e8069b54afcc1f4a9aa06b05d62c 100644 (file)
@@ -187,6 +187,7 @@ def ObjCMissingSuperCalls : DiagGroup<"objc-missing-super-calls">;
 def ObjCRetainBlockProperty : DiagGroup<"objc-noncopy-retain-block-property">;
 def ObjCReadonlyPropertyHasSetter : DiagGroup<"objc-readonly-with-setter-property">;
 def ObjCRootClass : DiagGroup<"objc-root-class">;
+def DeprecatedObjCIsaUsage : DiagGroup<"deprecated-objc-isa-usage">;
 def Packed : DiagGroup<"packed">;
 def Padded : DiagGroup<"padded">;
 def PointerArith : DiagGroup<"pointer-arith">;
index de761ae635e0d1ab536c857778eea878e51d8b16..4fda49832521b735793b9089f879f7dac7a66510 100644 (file)
@@ -634,9 +634,11 @@ def warn_objc_property_no_assignment_attribute : Warning<
   "'assign' is assumed">,
   InGroup<ObjCPropertyNoAttribute>;
 def warn_objc_isa_use : Warning<
-  "direct access to Objective-C's isa is deprecated "
-  "in favor of object_setClass() and object_getClass()">,
-  InGroup<DiagGroup<"deprecated-objc-isa-usage">>;
+  "direct access to Objective-C's isa is deprecated in favor of "
+  "object_getClass()">, InGroup<DeprecatedObjCIsaUsage>;
+def warn_objc_isa_assign : Warning<
+  "assignemt to Objective-C's isa is deprecated in favor of "
+  "object_setClass()">, InGroup<DeprecatedObjCIsaUsage>;
 def warn_objc_property_default_assign_on_object : Warning<
   "default property attribute 'assign' not appropriate for non-GC object">,
   InGroup<ObjCPropertyNoAttribute>;
index c0b1ad19983bda506012cae91e49a449f2cb7a7c..54422e81ebbfa05109e649ec3c00ba9cf330d49d 100644 (file)
@@ -491,6 +491,8 @@ ExprResult Sema::DefaultLvalueConversion(Expr *E) {
   }
 
   CheckForNullPointerDereference(*this, E);
+  if (isa<ObjCIsaExpr>(E->IgnoreParens()))
+    Diag(E->getExprLoc(), diag::warn_objc_isa_use);
 
   // C++ [conv.lval]p1:
   //   [...] If T is a non-class type, the type of the prvalue is the
@@ -8535,6 +8537,9 @@ ExprResult Sema::CreateBuiltinBinOp(SourceLocation OpLoc,
   CheckArrayAccess(LHS.get());
   CheckArrayAccess(RHS.get());
 
+  if (isa<ObjCIsaExpr>(LHS.get()->IgnoreParens()))
+    Diag(LHS.get()->getExprLoc(), diag::warn_objc_isa_assign);
+
   if (CompResultTy.isNull())
     return Owned(new (Context) BinaryOperator(LHS.take(), RHS.take(), Opc,
                                               ResultTy, VK, OK, OpLoc,
index 7b016c6574abfce8b7ec6f22762c90a564125580..e41a2e9145e04c9d341f8106203070ea810e8a5e 100644 (file)
@@ -1130,12 +1130,9 @@ Sema::LookupMemberExpr(LookupResult &R, ExprResult &BaseExpr,
       // There's an implicit 'isa' ivar on all objects.
       // But we only actually find it this way on objects of type 'id',
       // apparently.
-      if (OTy->isObjCId() && Member->isStr("isa")) {
-        Diag(MemberLoc, diag::warn_objc_isa_use);
+      if (OTy->isObjCId() && Member->isStr("isa"))
         return Owned(new (Context) ObjCIsaExpr(BaseExpr.take(), IsArrow, MemberLoc,
                                                Context.getObjCClassType()));
-      }
-
       if (ShouldTryAgainWithRedefinitionType(*this, BaseExpr))
         return LookupMemberExpr(R, BaseExpr, IsArrow, OpLoc, SS,
                                 ObjCImpDecl, HasTemplateArgs);
index bb22c25998c38a0ffad1e0fd0d33f8950eab26a8..8881db039062f650e21bd44874c8df78417eea2d 100644 (file)
@@ -920,7 +920,7 @@ int rdar_7770737_pos(void)
 
 void pr6302(id x, Class y) {
   // This previously crashed the analyzer (reported in PR 6302)
-  x->isa  = y; // expected-warning {{direct access to Objective-C's isa is deprecated in favor of object_setClass() and object_getClass()}}
+  x->isa  = y; // expected-warning {{assignemt to Objective-C's isa is deprecated in favor of object_setClass()}}
 }
 
 //===----------------------------------------------------------------------===//
index 39a5e454966d76cefa13a28144574a29656266b8..0d924e872c547a2519c427e58176b3c5011a8828 100644 (file)
@@ -18,8 +18,8 @@ static void func() {
   id x;
 
   // rdar://8290002
-  [(*x).isa self]; // expected-warning {{direct access to Objective-C's isa is deprecated in favor of object_setClass() and object_getClass()}}
-  [x->isa self]; // expected-warning {{direct access to Objective-C's isa is deprecated in favor of object_setClass() and object_getClass()}}
+  [(*x).isa self]; // expected-warning {{direct access to Objective-C's isa is deprecated in favor of object_getClass()}}
+  [x->isa self]; // expected-warning {{direct access to Objective-C's isa is deprecated in favor of object_getClass()}}
   
   Whatever *y;
 
index 071bf6bcedd65a99dc304bda7e1ec2d703c6e5e8..e9d296db8feccd95d25a5dd3ea8b861ddbfe4c70 100644 (file)
@@ -21,7 +21,7 @@ void f(U value, V value2) {
   get_an_A(N)->ivar = value; // expected-error{{assigning to 'int' from incompatible type 'int *'}}
   get_an_A(N).prop = value2; // expected-error{{assigning to 'int' from incompatible type 'double *'}}
   T c = get_an_id(N)->isa; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'Class'}} \
-                           // expected-warning 5 {{direct access to Objective-C's isa is deprecated in favor of object_setClass() and object_getClass()}}
+                           // expected-warning 3 {{direct access to Objective-C's isa is deprecated in favor of object_getClass()}}
 }
 
 template void f<6, Class>(int, int); // expected-note{{in instantiation of}}
@@ -46,7 +46,7 @@ template void f2(A*, int, double*); // expected-note{{instantiation of}}
 template<typename T, typename U>
 void f3(U ptr) {
   T c = ptr->isa; // expected-error{{cannot initialize a variable of type 'int' with an lvalue of type 'Class'}} \
-                  // expected-warning 2 {{direct access to Objective-C's isa is deprecated in favor of object_setClass() and object_getClass()}}
+                  // expected-warning 1 {{direct access to Objective-C's isa is deprecated in favor of object_getClass()}}
 }
 
 template void f3<Class>(id); // expected-note{{in instantiation of}}