]> granicus.if.org Git - clang/commitdiff
Objective-C [diagnostics] [QOI], when method is not
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 14 May 2013 23:24:17 +0000 (23:24 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 14 May 2013 23:24:17 +0000 (23:24 +0000)
found for a receiver, note where receiver class
is declaraed (this is most common when receiver is a forward
class). // rdar://3258331

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

17 files changed:
include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExprObjC.cpp
test/Analysis/inlining/DynDispatchBifurcate.m
test/Analysis/rdar-6540084.m
test/Modules/objc-categories.m
test/PCH/chain-categories2.m
test/SemaObjC/call-super-2.m
test/SemaObjC/compare-qualified-id.m
test/SemaObjC/conditional-expr.m
test/SemaObjC/error-outof-scope-property-use.m
test/SemaObjC/instancetype.m
test/SemaObjC/message.m
test/SemaObjC/method-not-defined.m
test/SemaObjC/missing-atend-metadata.m
test/SemaObjC/property-5.m
test/SemaObjC/protocol-id-test-1.m
test/SemaObjCXX/instancetype.mm

index c2728820d4345d9d8a16694567782c06ffce50b9..db4696767a2b379142af66e7b4fe4347b2fe7fed 100644 (file)
@@ -499,6 +499,8 @@ def note_while_in_implementation : Note<
   "detected while default synthesizing properties in class implementation">;
 def note_class_declared : Note<
   "class is declared here">;
+def note_receiver_class_declared : Note<
+  "receiver is object of the class that is declared here">;
 def note_receiver_is_id : Note<
   "receiver is treated with 'id' type for purpose of method lookup">;
 def note_suppressed_class_declare : Note<
index d37f61ab8abddde2c35efd853575d0ee167902c8..7c701ea040196923ed7c318105e8b69de1bfa9d9 100644 (file)
@@ -1221,10 +1221,19 @@ bool Sema::CheckMessageArgumentTypes(QualType ReceiverType,
     else
       DiagID = isClassMessage ? diag::warn_class_method_not_found
                               : diag::warn_inst_method_not_found;
-    if (!getLangOpts().DebuggerSupport)
+    if (!getLangOpts().DebuggerSupport) {
       Diag(SelLoc, DiagID)
         << Sel << isClassMessage << SourceRange(SelectorLocs.front(), 
                                                 SelectorLocs.back());
+      // Find the class to which we are sending this message.
+      if (ReceiverType->isObjCObjectPointerType()) {
+        QualType ClassType =
+          ReceiverType->getAs<ObjCObjectPointerType>()->getPointeeType();
+        if (const ObjCObjectType *ClassTPtr = ClassType->getAs<ObjCObjectType>())
+          if (ObjCInterfaceDecl *Class = ClassTPtr->getInterface())
+            Diag(Class->getLocation(), diag::note_receiver_class_declared);
+      }
+    }
 
     // In debuggers, we want to use __unknown_anytype for these
     // results so that clients can cast them.
index ab1dfc5ec14b6aa3bde2111b00ced92c07e35ea0..d8af213a065f18503a7163dec60d006b3658ef87 100644 (file)
@@ -181,11 +181,11 @@ int testPropertySynthesized(PublicClass *p) {
 }
 
 // Test definition not available edge case.
-@interface DefNotAvailClass : NSObject
+@interface DefNotAvailClass : NSObject // expected-note {{receiver is object of the class that is declared here}}
 @end
 id testDefNotAvailableInlined(DefNotAvailClass *C) {
   return [C mem]; // expected-warning {{instance method '-mem' not found}}
 }
 id testDefNotAvailable(DefNotAvailClass *C) {
   return testDefNotAvailableInlined(C);
-}
\ No newline at end of file
+}
index 7070709e57dd21e40440b7d767e54c22414e779f..d93450b5c5dd08d1615bfa5b50c98fbf954c9cf5 100644 (file)
@@ -9,13 +9,13 @@ typedef struct _NSZone NSZone;
 @protocol NSObject  - (BOOL)isEqual:(id)object; @end
 @interface NSObject <NSObject> {} @end
 extern id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone);
-@class NSArray;
+@class NSArray; // expected-note {{receiver is object of the class that is declared here}}
 @class NSMutableArray, NSIndexSet, NSView, NSPredicate, NSString, NSViewAnimation, NSTimer; // expected-note{{forward declaration of class here}}
 @interface FooBazController : NSObject {}
 @end
 typedef struct {} TazVersion;
 @class TazNode;
-@interface TazGuttenberg : NSObject {} typedef NSUInteger BugsBunnyType; @end
+@interface TazGuttenberg : NSObject {} typedef NSUInteger BugsBunnyType; @end // expected-note {{receiver is object of the class that is declared here}}
 @interface FooBaz : NSObject {}
 @property (nonatomic) BugsBunnyType matchType;
 @property (nonatomic, retain) NSArray *papyrus; @end
index 81fb28bafb2a3223420a57737541cc4e8659e155..07d1760980e80a36fd87d9b624775d45bcf541d8 100644 (file)
@@ -10,6 +10,7 @@
 
 // expected-note@Inputs/category_left.h:14 {{previous definition}}
 // expected-warning@Inputs/category_right.h:11 {{duplicate definition of category}}
+// expected-note@Inputs/category_top.h:1 {{receiver is object of the class that is declared here}}
 
 @interface Foo(Source)
 -(void)source; 
index f230bf93485848f5022690969923c87c746e2f0f..8cb06a857cdebfc6561d2ba0737546520f68f9f8 100644 (file)
@@ -45,6 +45,7 @@
 #else
 //===----------------------------------------------------------------------===//
 
+// expected-note@30 {{receiver is object of the class that is declared here}}
 void f(I* i) {
   [i meth]; // expected-warning {{not found}}
 }
index 3c45a2c732389c875a0b8030847d3339c734c973..18a5f09407ee5e3935ad50d0c65b211db7de7a79 100644 (file)
@@ -14,7 +14,7 @@ id objc_getClass(const char *s);
 - (int) instance_func0;
 @end
 
-@interface Derived: Object
+@interface Derived: Object // expected-note {{receiver is object of the class that is declared here}}
 + (int) class_func1;
 + (int) class_func2;
 + (int) class_func3;
index 82868f8a1613a81e9eaa7e72b1f63ec70f7ccce6..0b7e106b3518e939ebd815440e9f2e84a0a5b05f 100644 (file)
@@ -12,7 +12,7 @@ typedef struct _NSZone NSZone;
 typedef struct {} NSFastEnumerationState;
 @protocol NSFastEnumeration  - (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len; @end
 @interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSCoding, NSFastEnumeration>  - (NSUInteger)count; @end
-@interface NSMutableDictionary : NSDictionary  - (void)removeObjectForKey:(id)aKey; @end
+@interface NSMutableDictionary : NSDictionary  - (void)removeObjectForKey:(id)aKey; @end // expected-note {{receiver is object of the class that is declared here}}
 extern NSString * const NSTaskDidTerminateNotification;
 
 @interface XCPropertyExpansionContext : NSObject <NSCopying> { // expected-note {{required for direct or indirect protocol 'NSCopying'}}
index ec1305dbe8b3b28a9b2719deda1af9c8e2a0e0de..083453810cf15338f25d3b837b978d34384f70db 100644 (file)
@@ -33,7 +33,8 @@
 @end
 
 // No @interface declaration for DTFilterOutputStream3
-@implementation DTFilterOutputStream3 // expected-warning {{cannot find interface declaration for 'DTFilterOutputStream3'}}
+@implementation DTFilterOutputStream3 // expected-warning {{cannot find interface declaration for 'DTFilterOutputStream3'}} \
+                                     // expected-note {{receiver is object of the class that is declared here}}
 - (id)initWithNextOutputStream:(id <DTOutputStreams>) outputStream {
   id <DTOutputStreams> nextOutputStream = [self nextOutputStream]; // expected-warning {{method '-nextOutputStream' not found (return type defaults to 'id')}}
   self = nextOutputStream; // expected-warning {{assigning to 'DTFilterOutputStream3 *' from incompatible type 'id<DTOutputStreams>'}}
index c69a4055df2180a33e07322381a0fafe9645ed63..023687bbf4d2fe75ec63c0d3c81c95da7d4e9f2e 100644 (file)
@@ -2,7 +2,7 @@
 // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -fobjc-default-synthesize-properties -verify -Wno-objc-root-class %s
 // rdar://13178483
 
-@class NSMutableDictionary;
+@class NSMutableDictionary; // expected-note {{receiver is object of the class that is declared here}}
 
 @interface LaunchdJobs 
 
index 8137964737e465af04742c044d63449bf0ab686b..237489027151daa5094b6371d6792e0ff49fdc7d 100644 (file)
@@ -25,7 +25,7 @@
 - (instancetype)otherMethodInProto2; // expected-note{{overridden method returns an instance of its class type}}
 @end
 
-@interface Subclass1 : Root
+@interface Subclass1 : Root // expected-note 4 {{receiver is object of the class that is declared here}}
 - (instancetype)initSubclass1;
 - (void)methodOnSubclass1;
 + (instancetype)allocSubclass1;
index 40fa102f35d2a1bd77ad41b7a7df27d8edb7a9a7..fc75cdbf6e202cd517bc64725a227f3598b2b468 100644 (file)
@@ -107,7 +107,7 @@ void foo5(id p) {
                  // expected-warning {{instance method '-bar' not found}}
 }
 
-@interface I1
+@interface I1 // expected-note {{receiver is object of the class that is declared here}}
 -(void)unavail_meth  __attribute__((unavailable)); // expected-note {{marked unavailable here}}
 @end
 
index 22466f7dc34222a5ec9bedbd2071a692e8b72eca..8f43c5daa7ebc0088c714f2c1fb4a2f53011edff 100644 (file)
@@ -1,6 +1,6 @@
 // RUN: %clang_cc1 -fsyntax-only -verify %s
 
-@interface Foo
+@interface Foo // expected-note {{receiver is object of the class that is declared here}}
 @end
 
 void test() {
index f072981dc1bfb5620df7d0ba3dcb47301849ced8..9d0024ac65548e16e10d7758cd63297ba658bd82 100644 (file)
@@ -1,6 +1,6 @@
 // RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify -Wno-objc-root-class %s 
 
-@interface I0 
+@interface I0  // expected-note {{receiver is object of the class that is declared here}}
 @end
 
 @implementation I0 // expected-note {{implementation started here}}
index cd7cc2487acc50999eb9ae25cf498acac63d84c4..782f77cfeaa80b5666f261a7b7367b457f3d97d5 100644 (file)
@@ -8,7 +8,7 @@
 
 @interface MutableNSData : NSData @end
 
-@interface Base : NSData <P1>
+@interface Base : NSData <P1> // expected-note {{receiver is object of the class that is declared here}}
 @property(readonly) id ref;
 @property(readonly) Base *p_base;
 @property(readonly) NSData *nsdata;
index 19a4432de619c103fb6b6011caf099c8e5cfc140..013f291ad92b0a70975c363948a0498803f3d8c9 100644 (file)
@@ -7,7 +7,7 @@
 @protocol P
 @end
 
-@interface INTF<P>
+@interface INTF<P> // expected-note {{receiver is object of the class that is declared here}}
 - (void)IMeth;
 @end
 
index bbf100ef0458da749ac990028745dee03349b017..87663b971681800f6b8a5db00a991d3d5451a271 100644 (file)
@@ -25,7 +25,7 @@
 - (instancetype)otherMethodInProto2; // expected-note{{overridden method returns an instance of its class type}}
 @end
 
-@interface Subclass1 : Root
+@interface Subclass1 : Root // expected-note 4 {{receiver is object of the class that is declared here}}
 - (instancetype)initSubclass1;
 - (void)methodOnSubclass1;
 + (instancetype)allocSubclass1;