diff options
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 10 | ||||
-rw-r--r-- | clang/test/SemaObjC/super-dealloc-attribute.m | 30 |
2 files changed, 36 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 87dfe103630..bbdf853fc8a 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -406,7 +406,9 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) { if (Context.getLangOpts().getGC() != LangOptions::NonGC) getCurFunction()->ObjCShouldCallSuper = true; - } else { + } else if (MDecl->hasAttr<ObjCRequiresSuperAttr>()) + getCurFunction()->ObjCShouldCallSuper = true; + else { const ObjCMethodDecl *SuperMethod = SuperClass->lookupMethod(MDecl->getSelector(), MDecl->isInstanceMethod()); @@ -3200,6 +3202,12 @@ Decl *Sema::ActOnMethodDeclaration( if (ObjCInterfaceDecl *IDecl = ImpDecl->getClassInterface()) IMD = IDecl->lookupMethod(ObjCMethod->getSelector(), ObjCMethod->isInstanceMethod()); + if (IMD && IMD->hasAttr<ObjCRequiresSuperAttr>() && + !ObjCMethod->hasAttr<ObjCRequiresSuperAttr>()) { + // merge the attribute into implementation. + ObjCMethod->addAttr( + new (Context) ObjCRequiresSuperAttr(ObjCMethod->getLocation(), Context)); + } if (ObjCMethod->hasAttrs() && containsInvalidMethodImplAttribute(IMD, ObjCMethod->getAttrs())) { SourceLocation MethodLoc = IMD->getLocation(); diff --git a/clang/test/SemaObjC/super-dealloc-attribute.m b/clang/test/SemaObjC/super-dealloc-attribute.m index 35f6dac9bf4..911de732668 100644 --- a/clang/test/SemaObjC/super-dealloc-attribute.m +++ b/clang/test/SemaObjC/super-dealloc-attribute.m @@ -40,9 +40,9 @@ [super MyDealloc]; } // expected-warning {{method possibly missing a [super XXX] call}} -- (void) MyDeallocMeth {} // No warning here. +- (void) MyDeallocMeth {} // expected-warning {{method possibly missing a [super MyDeallocMeth] call}} - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}} -- (void) AnnotMeth{}; // No warning here. Annotation is in its class. +- (void) AnnotMeth{}; // expected-warning {{method possibly missing a [super AnnotMeth] call}} + (void)registerClass:(id)name {} // expected-warning {{method possibly missing a [super registerClass:] call}} @end @@ -66,7 +66,7 @@ - (void) AnnotMyDeallocMeth{} // expected-warning {{method possibly missing a [super AnnotMyDeallocMeth] call}} - (void) AnnotMeth{}; // expected-warning {{method possibly missing a [super AnnotMeth] call}} - (void) AnnotMyDeallocMethCAT{}; // expected-warning {{method possibly missing a [super AnnotMyDeallocMethCAT] call}} -- (void) AnnotMethCAT {}; +- (void) AnnotMethCAT {}; // expected-warning {{method possibly missing a [super AnnotMethCAT] call}} @end @@ -85,3 +85,27 @@ } @end + +// rdar://14251387 +#define IBAction void)__attribute__((ibaction) + +@interface UIViewController @end + +@interface ViewController : UIViewController +- (void) someMethodRequiringSuper NS_REQUIRES_SUPER; +- (IBAction) someAction; +- (IBAction) someActionRequiringSuper NS_REQUIRES_SUPER; +@end + + +@implementation ViewController +- (void) someMethodRequiringSuper +{ +} // expected-warning {{method possibly missing a [super someMethodRequiringSuper] call}} +- (IBAction) someAction +{ +} +- (IBAction) someActionRequiringSuper +{ +} // expected-warning {{method possibly missing a [super someActionRequiringSuper] call}} +@end |