]> granicus.if.org Git - clang/commitdiff
We want to diagnose sending message to a forward class
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 8 May 2009 23:45:49 +0000 (23:45 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 8 May 2009 23:45:49 +0000 (23:45 +0000)
and we also want to tell which message is actually
being sent.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExprObjC.cpp
test/Analysis/rdar-6540084.m
test/SemaObjC/forward-class-receiver.m

index f491a43e3b6e6c9f0755574c3910021d47816e4c..577392cbd60bfe3fb15f71be080146658afe898c 100644 (file)
@@ -1692,6 +1692,7 @@ def err_collection_expr_type : Error<
 def ext_invalid_sign_spec : Extension<"'%0' cannot be signed or unsigned">;
 def warn_receiver_forward_class : Warning<
     "receiver %0 is a forward class and corresponding @interface may not exist">;
+def note_method_sent_forward_class : Note<"method %0 is used for the forward class">;
 def warn_missing_declspec : Warning<
   "declaration specifier missing, defaulting to 'int'">;
 def warn_missing_type_specifier : Warning<
index 3dbc2cf015f06189f6eeb672803c012787ad8f05..de6b69f90fbeee2d1e5013e370ece7ac5ec90a32 100644 (file)
@@ -424,10 +424,11 @@ Sema::ExprResult Sema::ActOnClassMessage(
   QualType returnType;
   if (ClassDecl->isForwardDecl()) {
     // A forward class used in messaging is tread as a 'Class'
+    Diag(lbrac, diag::warn_receiver_forward_class) << ClassDecl->getDeclName();
     Method = LookupFactoryMethodInGlobalPool(Sel, SourceRange(lbrac,rbrac));
     if (Method)
-      Diag(lbrac, diag::warn_receiver_forward_class) 
-        << ClassDecl->getDeclName();
+      Diag(Method->getLocation(), diag::note_method_sent_forward_class) 
+        << Method->getDeclName();
   }
   if (!Method)
     Method = ClassDecl->lookupClassMethod(Context, Sel);
index c788543bf39d95f2fc2d10d498d3d84d1aedfb80..18ab038f6e2e4fe2ebcf2d018411182cc3ba1286 100644 (file)
@@ -22,7 +22,7 @@ typedef struct {} TazVersion;
 @implementation FooBazController
 - (NSArray *)excitingStuff:(FooBaz *)options {
   BugsBunnyType matchType = options.matchType;
-  NSPredicate *isSearchablePredicate = [NSPredicate predicateWithFormat:@"isSearchable == YES"]; // expected-warning{{return type defaults to 'id'}}
+  NSPredicate *isSearchablePredicate = [NSPredicate predicateWithFormat:@"isSearchable == YES"]; // expected-warning{{receiver 'NSPredicate' is a forward class and corresponding}} // expected-warning{{return type defaults to 'id'}}
   for (TazGuttenberg *Guttenberg in options.papyrus) {
     NSArray *GuttenbergNodes = [Guttenberg nodes]; // expected-warning{{return type defaults to 'id'}}
     NSArray *searchableNodes = [GuttenbergNodes filteredArrayUsingPredicate:isSearchablePredicate]; // expected-warning{{return type defaults to 'id'}}
index 8353f39d38285ce2e662864acb1a539cfd1d08a3..ebba0fd896dc5e925ed761fd75ed2f764f961d11 100644 (file)
@@ -1,7 +1,7 @@
 // RUN: clang-cc  -fsyntax-only -verify %s
 
 @interface I
-+ new;
++ new; // expected-note {{method 'new' is used for the forward class}}
 @end
 Class isa;