]> granicus.if.org Git - clang/commitdiff
objc: put out more coherent warning when method definition
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Dec 2011 00:02:41 +0000 (00:02 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 6 Dec 2011 00:02:41 +0000 (00:02 +0000)
attributes don't match its declaration. // rdar://10529259.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDeclObjC.cpp
test/SemaObjC/method-attributes.m

index 9a5a664d69c9bcbce406733e85051c51f11c70b3..4d7f60b8c9e6d6e1bb2362564e8dd27c0b42389c 100644 (file)
@@ -5025,7 +5025,7 @@ def error_protected_ivar_access : Error<"instance variable %0 is protected">,
   AccessControl;
 def warn_maynot_respond : Warning<"%0 may not respond to %1">;
 def warn_attribute_method_def : Warning<
-  "method attribute can only be specified on method declarations">,
+  "attributes on method implementation and its declaration must match">,
   InGroup<DiagGroup<"mismatched-method-attributes">>;
 def ext_typecheck_base_super : Warning<
   "method parameter type %0 does not match "
index 49fcfbf2f376bc7870e37fcf539d0df3bddfaf44..afcf3cc63ae52710a88fcbce64f2af6ae28d1886 100644 (file)
@@ -2712,8 +2712,10 @@ Decl *Sema::ActOnMethodDeclaration(
       IMD = IDecl->lookupMethod(ObjCMethod->getSelector(), 
                                 ObjCMethod->isInstanceMethod());
     if (ObjCMethod->hasAttrs() &&
-        containsInvalidMethodImplAttribute(IMD, ObjCMethod->getAttrs()))
+        containsInvalidMethodImplAttribute(IMD, ObjCMethod->getAttrs())) {
       Diag(EndLoc, diag::warn_attribute_method_def);
+      Diag(IMD->getLocation(), diag::note_method_declared_at);
+    }
   } else {
     cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod);
   }
index a560e7432fc47c7a4c54e24595eb66150161e79f..9a1271dd3ce8ce22991b6f96cc0bf24edf8018d7 100644 (file)
 @interface INTF
 - (int) foo1: (int)arg1 __attribute__((deprecated));
 
-- (int) foo: (int)arg1; 
+- (int) foo: (int)arg1;  // expected-note {{method declared here}}
 
-- (int) foo2: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable));
+- (int) foo2: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)); // expected-note {{method declared here}}
 - (int) foo3: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)) __attribute__((ns_consumes_self));
 @end
 
 @implementation INTF
-- (int) foo: (int)arg1  __attribute__((deprecated)){ // expected-warning {{method attribute can only be specified}}
+- (int) foo: (int)arg1  __attribute__((deprecated)){ // expected-warning {{attributes on method implementation and its declaration must match}}
         return 10;
 }
 - (int) foo1: (int)arg1 {
         return 10;
 }
-- (int) foo2: (int)arg1 __attribute__((deprecated)) {  // expected-warning {{method attribute can only be specified}}
+- (int) foo2: (int)arg1 __attribute__((deprecated)) {  // expected-warning {{attributes on method implementation and its declaration must match}}
         return 10;
 }
 - (int) foo3: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)) __attribute__((ns_consumes_self)) {return 0; }
 - (void) dep __attribute__((deprecated)) { } // OK private methodn
 @end
 
+
+// rdar://10529259
+#define IBAction void)__attribute__((ibaction)
+
+@interface Foo 
+- (void)doSomething1:(id)sender;
+- (void)doSomething2:(id)sender; // expected-note {{method declared here}}
+@end
+
+@implementation Foo
+- (void)doSomething1:(id)sender{}
+- (void)doSomething2:(id)sender{}
+@end
+
+@interface Bar : Foo
+- (IBAction)doSomething1:(id)sender;
+@end
+@implementation Bar
+- (IBAction)doSomething1:(id)sender {}
+- (IBAction)doSomething2:(id)sender {} // expected-warning {{attributes on method implementation and its declaration must match}}
+- (IBAction)doSomething3:(id)sender {}
+@end