]> granicus.if.org Git - clang/commitdiff
Method attributes may only be specified on method
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 12 May 2009 21:36:23 +0000 (21:36 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 12 May 2009 21:36:23 +0000 (21:36 +0000)
declarations.

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

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

index 4c7a11668f7af7472400b5c86a81074f576340c2..65a25ce93473996a369627e921ac44f69fbbb066 100644 (file)
@@ -1720,5 +1720,8 @@ def error_ivar_use_in_class_method : Error<
 def error_private_ivar_access : Error<"instance variable %0 is private">;
 def error_protected_ivar_access : Error<"instance variable %0 is protected">;
 def warn_maynot_respond : Warning<"%0  may not respond to %1">;
+def warn_attribute_method_def : Warning<
+  "method attribute may be specified on method declarations only">;
+
 
 }
index 76e73fc650cb2e5210015b6d3287771ec645e0c1..d854f0b50c6d5fb3e6ec7d2816f9f3dec1bcfabe 100644 (file)
@@ -1671,6 +1671,8 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
       PrevMethod = ImpDecl->getClassMethod(Context, Sel);
       ImpDecl->addClassMethod(Context, ObjCMethod);
     }
+    if (AttrList)
+      Diag(EndLoc, diag::warn_attribute_method_def);
   } 
   else if (ObjCCategoryImplDecl *CatImpDecl = 
             dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
@@ -1681,6 +1683,8 @@ Sema::DeclPtrTy Sema::ActOnMethodDeclaration(
       PrevMethod = CatImpDecl->getClassMethod(Context, Sel);
       CatImpDecl->addClassMethod(Context, ObjCMethod);
     }
+    if (AttrList)
+      Diag(EndLoc, diag::warn_attribute_method_def);
   }
   if (PrevMethod) {
     // You can never have two method definitions with the same name.
index 52f654ab5d7b18b84e4de79a6f3077a72fcde21c..3741510e11313fe6c8f875237284728172d09559 100644 (file)
@@ -9,7 +9,7 @@
 
 @implementation A
 + (void)F __attribute__((deprecated))
-{
+{      // expected-warning {{method attribute may be specified on method declarations only}}
   [self F]; // no warning, since the caller is also deprecated.
 }
 
index 003cea4bd703ce9648a1a0287cd37a1858c6e497..354950c49c756fdfb50604a507ccaf662eb9a25e 100644 (file)
@@ -8,3 +8,25 @@
 -(void) m0 __attribute__((noreturn));
 -(void) m1 __attribute__((unused));
 @end
+
+
+@interface INTF
+- (int) foo1: (int)arg1 __attribute__((deprecated));
+
+- (int) foo: (int)arg1; 
+
+- (int) foo2: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable));
+@end
+
+@implementation INTF
+- (int) foo: (int)arg1  __attribute__((deprecated)){ // expected-warning {{method attribute may be specified}}
+        return 10;
+}
+- (int) foo1: (int)arg1 {
+        return 10;
+}
+- (int) foo2: (int)arg1 __attribute__((deprecated)) {  // expected-warning {{method attribute may be specified}}
+        return 10;
+}
+@end
+