211 lines · plain
1// RUN: %clang_cc1 -x objective-c -fsyntax-only -verify -Wno-objc-root-class %s2// RUN: %clang_cc1 -x objective-c++ -fsyntax-only -verify -Wno-objc-root-class %s3 4#if __has_attribute(objc_requires_property_definitions)5__attribute ((objc_requires_property_definitions)) 6#endif7@interface NoAuto // expected-note 2 {{class with specified objc_requires_property_definitions attribute is declared here}}8@property int NoAutoProp; // expected-note 2 {{property declared here}}9@end10 11@implementation NoAuto // expected-warning {{property 'NoAutoProp' requires method 'NoAutoProp' to be defined}} \12 // expected-warning {{property 'NoAutoProp' requires method 'setNoAutoProp:'}}13@end14 15__attribute ((objc_requires_property_definitions)) // redundant, just for testing16@interface Sub : NoAuto // expected-note 3 {{class with specified objc_requires_property_definitions attribute is declared here}}17@property (copy) id SubProperty; // expected-note 2 {{property declared here}}18@end19 20@implementation Sub // expected-warning {{property 'SubProperty' requires method 'SubProperty' to be defined}} \21 // expected-warning {{property 'SubProperty' requires method 'setSubProperty:' to be defined}}22@end23 24@interface Deep : Sub25@property (copy) id DeepProperty;26@property (copy) id DeepSynthProperty;27@property (copy) id DeepMustSynthProperty; // expected-note {{property declared here}}28@end29 30@implementation Deep // expected-warning {{property 'DeepMustSynthProperty' requires method 'setDeepMustSynthProperty:' to be defined}}31@dynamic DeepProperty;32@synthesize DeepSynthProperty;33- (id) DeepMustSynthProperty { return 0; }34@end35 36__attribute ((objc_requires_property_definitions)) // expected-error {{'objc_requires_property_definitions' attribute only applies to Objective-C interfaces}}37@interface Deep(CAT)38@end39 40__attribute ((objc_requires_property_definitions)) // expected-error {{'objc_requires_property_definitions' attribute only applies to Objective-C interfaces}}41@protocol P @end42 43@interface NSObject @end44@protocol Foo45@property (readonly) char isFoo; // expected-note {{property declared here}}46@property (readonly) char isNotFree; // expected-note {{property declared here}}47@end48 49@interface Bar : NSObject <Foo>50@end51 52@implementation Bar53- (char)isFoo {54 return 0;55}56- (char)isNotFree {57 return 0;58}59@end60 61@interface Baz : Bar62@end63 64@interface Baz ()65@property (readwrite) char isFoo; // expected-warning {{auto property synthesis will not synthesize property 'isFoo' because it is 'readwrite' but it will be synthesized 'readonly' via another property}}66@property char Property1; // expected-warning {{auto property synthesis will not synthesize property 'Property1' because it cannot share an ivar with another synthesized property}}67@property char Property2;68@property (readwrite) char isNotFree; // expected-warning {{auto property synthesis will not synthesize property 'isNotFree'}}69@end70 71@implementation Baz { // expected-note {{detected while default synthesizing properties in class implementation}}72 char _isFoo;73 char _isNotFree;74}75@synthesize Property2 = Property1; // expected-note {{property synthesized here}}76 77- (void) setIsNotFree : (char)Arg {78 _isNotFree = Arg;79}80 81@end82 83// More test where such warnings should not be issued.84@protocol MyProtocol85-(void)setProp1:(id)x;86@end87 88@protocol P1 <MyProtocol>89@end90 91@interface B92@property (readonly) id prop; // expected-note {{property declared here}}93@property (readonly) id prop1; // expected-note {{property declared here}}94@property (readonly) id prop2; // expected-note {{property declared here}}95@end96 97@interface B()98-(void)setProp:(id)x;99@end100 101@interface B(cat)102@property (readwrite) id prop2;103@end104 105@interface S : B<P1>106@property (assign,readwrite) id prop; // expected-warning {{auto property synthesis will not synthesize property 'prop'}}107@property (assign,readwrite) id prop1; // expected-warning {{auto property synthesis will not synthesize property 'prop1'}}108@property (assign,readwrite) id prop2; // expected-warning {{auto property synthesis will not synthesize property 'prop2'}}109@end110 111@implementation S // expected-note 3 {{detected while default synthesizing properties in class implementation}}112@end113 114// No warning must be issued in this test.115@interface ParentObject116@end117 118@protocol TestObject 119@property (readonly) int six;120@end121 122@interface TestObject : ParentObject <TestObject>123@property int six;124@end125 126@implementation TestObject127@synthesize six;128@end129 130// no warning in this test131@interface ISAChallenge : NSObject {132}133 134@property (assign, readonly) int failureCount;135@end136 137@interface ISSAChallenge : ISAChallenge {138 int _failureCount;139}140@property (assign, readwrite) int failureCount;141@end142 143@implementation ISAChallenge144- (int)failureCount {145 return 0;146}147@end148 149@implementation ISSAChallenge150 151@synthesize failureCount = _failureCount;152@end153 154__attribute ((objc_requires_property_definitions(1))) // expected-error {{'objc_requires_property_definitions' attribute takes no arguments}}155@interface I1156@end157 158@protocol SubFooling159 @property(nonatomic, readonly) id hoho; // expected-note 2 {{property declared here}}160@end161 162@protocol Fooing<SubFooling>163 @property(nonatomic, readonly) id muahahaha; // expected-note 2 {{property declared here}}164@end165 166typedef NSObject<Fooing> FooObject;167 168@interface Okay : NSObject<Fooing>169@end170 171@implementation Okay // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}}172@end // expected-note 2 {{add a '@synthesize' directive}}173 174@interface Fail : FooObject175@end176 177@implementation Fail // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}}178@end // expected-note 2 {{add a '@synthesize' directive}}179 180@class NSURL;181 182@interface Root183- (void)setFileURL : (NSURL *) arg;184- (void)setFile : (NSURL *) arg;185- (NSURL *)fileSys;186- (void)setFileSys : (NSURL *) arg;187- (NSURL *)fileKerl;188@end189 190@interface SuperClass : Root191- (NSURL *)fileURL;192- (NSURL *)file;193- (NSURL *)fileLog;194- (void)setFileLog : (NSURL *) arg;195- (void)setFileKerl : (NSURL *) arg;196@end197 198@protocol r16089191Protocol199@property (readonly) NSURL *fileURL;200@property (copy) NSURL *file;201@property (copy) NSURL *fileSys;202@property (copy) NSURL *fileLog;203@property (copy) NSURL *fileKerl;204@end205 206@interface SubClass : SuperClass <r16089191Protocol>207@end208 209@implementation SubClass210@end211