|  | // RUN: %clang_cc1 -fsyntax-only -Wobjc-missing-property-synthesis -verify -Wno-objc-root-class %s | 
|  | // rdar://11295716 | 
|  |  | 
|  | @interface NSObject | 
|  | - (void) release; | 
|  | - (id) retain; | 
|  | @end | 
|  | @class NSString; | 
|  |  | 
|  | @interface SynthItAll : NSObject | 
|  | @property int howMany; // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @property (retain) NSString* what; // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @end | 
|  |  | 
|  | @implementation SynthItAll // expected-note 2 {{detected while default synthesizing properties in class implementation}} | 
|  | //@synthesize howMany, what; | 
|  | @end | 
|  |  | 
|  |  | 
|  | @interface SynthSetter : NSObject | 
|  | @property (nonatomic) int howMany;   // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @property (nonatomic, retain) NSString* what;  // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @end | 
|  |  | 
|  | @implementation SynthSetter // expected-note 2 {{detected while default synthesizing properties in class implementation}} | 
|  | //@synthesize howMany, what; | 
|  |  | 
|  | - (int) howMany { | 
|  | return _howMany; | 
|  | } | 
|  | // - (void) setHowMany: (int) value | 
|  |  | 
|  | - (NSString*) what { | 
|  | return _what; | 
|  | } | 
|  | // - (void) setWhat: (NSString*) value | 
|  | @end | 
|  |  | 
|  |  | 
|  | @interface SynthGetter : NSObject | 
|  | @property (nonatomic) int howMany; // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @property (nonatomic, retain) NSString* what; // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @end | 
|  |  | 
|  | @implementation SynthGetter // expected-note 2 {{detected while default synthesizing properties in class implementation}} | 
|  | //@synthesize howMany, what; | 
|  |  | 
|  | // - (int) howMany | 
|  | - (void) setHowMany: (int) value { | 
|  | _howMany = value; | 
|  | } | 
|  |  | 
|  | // - (NSString*) what | 
|  | - (void) setWhat: (NSString*) value { | 
|  | if (_what != value) { | 
|  | [_what release]; | 
|  | _what = [value retain]; | 
|  | } | 
|  | } | 
|  | @end | 
|  |  | 
|  |  | 
|  | @interface SynthNone : NSObject | 
|  | @property int howMany; | 
|  | @property (retain) NSString* what; | 
|  | @end | 
|  |  | 
|  | @implementation SynthNone | 
|  | //@synthesize howMany, what;  // REM: Redundant anyway | 
|  |  | 
|  | - (int) howMany { | 
|  | return howMany; // expected-error {{use of undeclared identifier 'howMany'}} | 
|  | } | 
|  | - (void) setHowMany: (int) value { | 
|  | howMany = value; // expected-error {{use of undeclared identifier 'howMany'}} | 
|  | } | 
|  |  | 
|  | - (NSString*) what { | 
|  | return what; // expected-error {{use of undeclared identifier 'what'}} | 
|  | } | 
|  | - (void) setWhat: (NSString*) value { | 
|  | if (what != value) { // expected-error {{use of undeclared identifier 'what'}} | 
|  | [what release]; // expected-error {{use of undeclared identifier 'what'}} | 
|  | what = [value retain]; // expected-error {{use of undeclared identifier 'what'}} | 
|  | } | 
|  | } | 
|  | @end | 
|  |  | 
|  | // rdar://8349319 | 
|  | // No default synthesis if implementation has getter (readonly) and setter(readwrite) methods. | 
|  | @interface DSATextSearchResult | 
|  | @property(assign,readonly) float relevance; | 
|  | @property(assign,readonly) char isTitleMatch; | 
|  | @end | 
|  |  | 
|  | @interface DSANodeSearchResult : DSATextSearchResult {} | 
|  | @end | 
|  |  | 
|  |  | 
|  | @implementation DSATextSearchResult | 
|  | -(char)isTitleMatch { | 
|  | return (char)0; | 
|  | } | 
|  |  | 
|  | -(float)relevance { | 
|  | return 0.0; | 
|  | } | 
|  | @end | 
|  |  | 
|  | @implementation DSANodeSearchResult | 
|  | -(id)initWithNode:(id )node relevance:(float)relevance isTitleMatch:(char)isTitleMatch { | 
|  | relevance = 0.0; | 
|  | isTitleMatch = 'a'; | 
|  | return self; | 
|  | } | 
|  | @end | 
|  |  | 
|  | @interface rdar11333367 | 
|  | @property enum A x; // expected-note {{forward declaration of 'enum A'}} expected-note {{property declared here}} | 
|  | @property struct B y; // expected-note {{forward declaration of 'struct B'}} expected-note {{property declared here}} \ | 
|  | // expected-warning {{auto property synthesis is synthesizing property not explicitly synthesized}} | 
|  | @end | 
|  | @implementation rdar11333367 // expected-error {{cannot synthesize property 'y' with incomplete type 'struct B'}} \ | 
|  | // expected-note {{detected while default synthesizing properties in class implementation}} | 
|  | @synthesize x; // expected-error {{cannot synthesize property 'x' with incomplete type 'enum A'}} | 
|  | @end | 
|  |  | 
|  | // rdar://17774815 | 
|  | @interface ZXParsedResult | 
|  | @property (nonatomic, copy, readonly) NSString *description; // expected-note {{property declared here}} | 
|  | @end | 
|  |  | 
|  | @interface ZXCalendarParsedResult : ZXParsedResult | 
|  |  | 
|  | @property (nonatomic, copy, readonly) NSString *description; // expected-warning {{auto property synthesis will not synthesize property 'description'; it will be implemented by its superclass}} | 
|  |  | 
|  | @end | 
|  |  | 
|  | @implementation ZXCalendarParsedResult // expected-note {{detected while default synthesizing properties in class implementation}} | 
|  | - (NSString *) Meth { | 
|  | return _description; // expected-error {{use of undeclared identifier '_description'}} | 
|  | } | 
|  | @end |