1 // RUN: %clang_cc1 -x objective-c -fsyntax-only -fobjc-default-synthesize-properties -verify -Wno-objc-root-class %s 2 // RUN: %clang_cc1 -x objective-c++ -fsyntax-only -fobjc-default-synthesize-properties -verify -Wno-objc-root-class %s 3 4 #if __has_attribute(objc_requires_property_definitions) 5 __attribute ((objc_requires_property_definitions)) 6 #endif 7 @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 @end 10 11 @implementation NoAuto // expected-warning {{property 'NoAutoProp' requires method 'NoAutoProp' to be defined}} \ 12 // expected-warning {{property 'NoAutoProp' requires method 'setNoAutoProp:'}} 13 @end 14 15 __attribute ((objc_requires_property_definitions)) // redundant, just for testing 16 @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 @end 19 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 @end 23 24 @interface Deep : Sub 25 @property (copy) id DeepProperty; 26 @property (copy) id DeepSynthProperty; 27 @property (copy) id DeepMustSynthProperty; // expected-note {{property declared here}} 28 @end 29 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 @end 35 36 __attribute ((objc_requires_property_definitions)) 37 @interface Deep(CAT) // expected-error {{attributes may not be specified on a category}} 38 @end 39 40 __attribute ((objc_requires_property_definitions)) // expected-error {{objc_requires_property_definitions attribute may only be specified on a class}} 41 @protocol P @end 42