50 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -verify %s2 3@interface NSObject4- (id)copy; // expected-note {{method 'copy' declared here}}5- (id) test __attribute__((ns_returns_retained)); // expected-note {{method 'test' declared here}}6+ (id) new ; // expected-note {{method 'new' declared here}}7- (id) init __attribute__((ns_returns_not_retained));8- (id)PlusZero;9- (id)PlusOne __attribute__((ns_returns_retained)); // expected-note {{method 'PlusOne' declared here}}10- (id)self;11@end12 13@interface I : NSObject14{15 SEL sel1;16}17- (id)performSelector:(SEL)aSelector;18- (id)performSelector:(SEL)aSelector withObject:(id)object;19- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;20 21- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(double)delay inModes:(I *)modes;22 23@end24 25@implementation I26- (id) Meth {27 return [self performSelector : @selector(copy)]; // expected-error {{performSelector names a selector which retains the object}}28 return [self performSelector : @selector(test)]; // expected-error {{performSelector names a selector which retains the object}}29 return [self performSelector : @selector(new)]; // expected-error {{performSelector names a selector which retains the object}}30 return [self performSelector : @selector(init)];31 return [self performSelector : sel1]; // expected-warning {{performSelector may cause a leak because its selector is unknown}} \32 // expected-note {{used here}}33 return [self performSelector: (@selector(PlusZero))];34 35 return [self performSelector : @selector(PlusZero)];36 return [self performSelector : @selector(PlusOne)]; // expected-error {{performSelector names a selector which retains the object}}37 38 // Avoid the unknown selector warning for more complicated performSelector39 // variations because it produces too many false positives.40 [self performSelector: sel1 withObject:0 afterDelay:0 inModes:0];41 42 return [self performSelector: @selector(self)]; // No error, -self is not +1!43}44 45- (id)performSelector:(SEL)aSelector { return 0; }46- (id)performSelector:(SEL)aSelector withObject:(id)object { return 0; }47- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2 { return 0; }48- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(double)delay inModes:(I *)modes { }49@end50