diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 67 | ||||
-rw-r--r-- | clang/test/SemaObjC/method-attributes.m | 16 |
3 files changed, 8 insertions, 78 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 85e418b02f3..23ab1433198 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -6566,9 +6566,6 @@ def error_private_ivar_access : Error<"instance variable %0 is private">, 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< - "attributes on method implementation and its declaration must match">, - InGroup<DiagGroup<"mismatched-method-attributes">>; def ext_typecheck_base_super : Warning< "method parameter type " "%diff{$ does not match super class method parameter type $|" diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index f44fb325114..08556961109 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -2729,64 +2729,6 @@ CvtQTToAstBitMask(ObjCDeclSpec::ObjCDeclQualifier PQTVal) { return (Decl::ObjCDeclQualifier) (unsigned) PQTVal; } -static inline -unsigned countAlignAttr(const AttrVec &A) { - unsigned count=0; - for (AttrVec::const_iterator i = A.begin(), e = A.end(); i != e; ++i) - if ((*i)->getKind() == attr::Aligned) - ++count; - return count; -} - -static inline -bool containsInvalidMethodImplAttribute(ObjCMethodDecl *IMD, - const AttrVec &A) { - // If method is only declared in implementation (private method), - // No need to issue any diagnostics on method definition with attributes. - if (!IMD) - return false; - - // method declared in interface has no attribute. - // But implementation has attributes. This is invalid. - // Except when implementation has 'Align' attribute which is - // immaterial to method declared in interface. - if (!IMD->hasAttrs()) - return (A.size() > countAlignAttr(A)); - - const AttrVec &D = IMD->getAttrs(); - - unsigned countAlignOnImpl = countAlignAttr(A); - if (!countAlignOnImpl && (A.size() != D.size())) - return true; - else if (countAlignOnImpl) { - unsigned countAlignOnDecl = countAlignAttr(D); - if (countAlignOnDecl && (A.size() != D.size())) - return true; - else if (!countAlignOnDecl && - ((A.size()-countAlignOnImpl) != D.size())) - return true; - } - - // attributes on method declaration and definition must match exactly. - // Note that we have at most a couple of attributes on methods, so this - // n*n search is good enough. - for (AttrVec::const_iterator i = A.begin(), e = A.end(); i != e; ++i) { - if ((*i)->getKind() == attr::Aligned) - continue; - bool match = false; - for (AttrVec::const_iterator i1 = D.begin(), e1 = D.end(); i1 != e1; ++i1) { - if ((*i)->getKind() == (*i1)->getKind()) { - match = true; - break; - } - } - if (!match) - return true; - } - - return false; -} - /// \brief Check whether the declared result type of the given Objective-C /// method declaration is compatible with the method's class. /// @@ -3224,15 +3166,6 @@ Decl *Sema::ActOnMethodDeclaration( ObjCMethod->addAttr( new (Context) ObjCRequiresSuperAttr(ObjCMethod->getLocation(), Context)); } - if (ObjCMethod->hasAttrs() && - containsInvalidMethodImplAttribute(IMD, ObjCMethod->getAttrs())) { - SourceLocation MethodLoc = IMD->getLocation(); - if (!getSourceManager().isInSystemHeader(MethodLoc)) { - Diag(EndLoc, diag::warn_attribute_method_def); - Diag(MethodLoc, diag::note_method_declared_at) - << ObjCMethod->getDeclName(); - } - } } else { cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod); } diff --git a/clang/test/SemaObjC/method-attributes.m b/clang/test/SemaObjC/method-attributes.m index 339d3db77a1..41c685d0064 100644 --- a/clang/test/SemaObjC/method-attributes.m +++ b/clang/test/SemaObjC/method-attributes.m @@ -14,20 +14,20 @@ @interface INTF - (int) foo1: (int)arg1 __attribute__((deprecated)); -- (int) foo: (int)arg1; // expected-note {{method 'foo:' declared here}} +- (int) foo: (int)arg1; -- (int) foo2: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)); // expected-note {{method 'foo2:' declared here}} +- (int) foo2: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)); - (int) foo3: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)) __attribute__((ns_consumes_self)); @end @implementation INTF -- (int) foo: (int)arg1 __attribute__((deprecated)){ // expected-warning {{attributes on method implementation and its declaration must match}} +- (int) foo: (int)arg1 __attribute__((deprecated)){ return 10; } - (int) foo1: (int)arg1 { return 10; } -- (int) foo2: (int)arg1 __attribute__((deprecated)) { // expected-warning {{attributes on method implementation and its declaration must match}} +- (int) foo2: (int)arg1 __attribute__((deprecated)) { return 10; } - (int) foo3: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)) __attribute__((ns_consumes_self)) {return 0; } @@ -40,7 +40,7 @@ @interface Foo - (void)doSomething1:(id)sender; -- (void)doSomething2:(id)sender; // expected-note {{method 'doSomething2:' declared here}} +- (void)doSomething2:(id)sender; @end @implementation Foo @@ -53,7 +53,7 @@ @end @implementation Bar - (IBAction)doSomething1:(id)sender {} -- (IBAction)doSomething2:(id)sender {} // expected-warning {{attributes on method implementation and its declaration must match}} +- (IBAction)doSomething2:(id)sender {} - (IBAction)doSomething3:(id)sender {} @end @@ -64,7 +64,7 @@ -(id)method __attribute__((deprecated)); -(id)method1; -(id)method2 __attribute__((aligned(16))); -- (id) method3: (int)arg1 __attribute__((aligned(16))) __attribute__((deprecated)) __attribute__((unavailable)); // expected-note {{method 'method3:' declared here}} +- (id) method3: (int)arg1 __attribute__((aligned(16))) __attribute__((deprecated)) __attribute__((unavailable)); - (id) method4: (int)arg1 __attribute__((aligned(16))) __attribute__((deprecated)) __attribute__((unavailable)); @end @@ -78,7 +78,7 @@ -(id)method2 { return self; } -- (id) method3: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)) { // expected-warning {{attributes on method implementation and its declaration must match}} +- (id) method3: (int)arg1 __attribute__((deprecated)) __attribute__((unavailable)) { return self; } - (id) method4: (int)arg1 __attribute__((aligned(16))) __attribute__((deprecated)) __attribute__((unavailable)) { |