// RUN: %clang_cc1 -fsyntax-only -verify -Wselector-type-mismatch %s __attribute__((objc_root_class)) @interface Inteface_Implementation @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; @end @implementation Inteface_Implementation - (int)normal_normal { return 42; } - (int)direct_normal { return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { return 42; } @end __attribute__((objc_root_class)) @interface Inteface_Extension @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; @property(nonatomic, readonly) int normal_direct; @property(nonatomic, readonly, direct) int direct_direct; @end @interface Inteface_Extension () @property(nonatomic, readwrite) int normal_normal; @property(nonatomic, readwrite) int direct_normal; @property(nonatomic, readwrite, direct) int normal_direct; @property(nonatomic, readwrite, direct) int direct_direct; @end @implementation Inteface_Extension @end __attribute__((objc_root_class)) @interface Extension_Implementation @end @interface Extension_Implementation () @property(nonatomic, readwrite) int normal_normal; @property(nonatomic, readwrite, direct) int direct_normal; @property(nonatomic, readwrite) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readwrite, direct) int direct_direct; @end @implementation Extension_Implementation - (int)normal_normal { return 42; } - (int)direct_normal { return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { return 42; } @end __attribute__((objc_root_class)) @interface Inteface_Category @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @interface Inteface_Category (SomeCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly) int direct_normal; // expected-error {{property declaration conflicts with previous direct declaration of property 'direct_normal'}} @property(nonatomic, readonly, direct) int normal_direct; // expected-error {{direct property declaration conflicts with previous declaration of property 'normal_direct'}} @property(nonatomic, readonly, direct) int direct_direct; // expected-error {{direct property declaration conflicts with previous direct declaration of property 'direct_direct'}} @end @implementation Inteface_Category @end __attribute__((objc_root_class)) @interface Extension_Category @end @interface Extension_Category () @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @interface Extension_Category (SomeCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly) int direct_normal; // expected-error {{property declaration conflicts with previous direct declaration of property 'direct_normal'}} @property(nonatomic, readonly, direct) int normal_direct; // expected-error {{direct property declaration conflicts with previous declaration of property 'normal_direct'}} @property(nonatomic, readonly, direct) int direct_direct; // expected-error {{direct property declaration conflicts with previous direct declaration of property 'direct_direct'}} @end @implementation Extension_Category @end __attribute__((objc_root_class)) @interface Implementation_Category @end @interface Implementation_Category (SomeCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @implementation Implementation_Category - (int)normal_normal { return 42; } - (int)direct_normal { // expected-error {{direct method was declared in a category but is implemented in the primary interface}} return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in the primary interface}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in the primary interface}} return 42; } @end __attribute__((objc_root_class)) @interface Category_Category @end @interface Category_Category (SomeCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @interface Category_Category (SomeOtherCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly) int direct_normal; // expected-error {{property declaration conflicts with previous direct declaration of property 'direct_normal'}} @property(nonatomic, readonly, direct) int normal_direct; // expected-error {{direct property declaration conflicts with previous declaration of property 'normal_direct'}} @property(nonatomic, readonly, direct) int direct_direct; // expected-error {{direct property declaration conflicts with previous direct declaration of property 'direct_direct'}} @end @implementation Category_Category @end __attribute__((objc_root_class)) @interface Category_CategoryImplementation @end @interface Category_CategoryImplementation (SomeCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; @end @implementation Category_CategoryImplementation (SomeCategory) - (int)normal_normal { return 42; } - (int)direct_normal { return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method implementation was previously declared not direct}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { return 42; } @end @implementation Category_CategoryImplementation @end __attribute__((objc_root_class)) @interface Interface_CategoryImplementation @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @interface Interface_CategoryImplementation (SomeCategory) @end @implementation Interface_CategoryImplementation (SomeCategory) - (int)normal_normal { return 42; } - (int)direct_normal { // expected-error {{direct method was declared in the primary interface but is implemented in a category}} return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in the primary interface but is implemented in a category}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in the primary interface but is implemented in a category}} return 42; } @end @implementation Interface_CategoryImplementation @end __attribute__((objc_root_class)) @interface Extension_CategoryImplementation @end @interface Extension_CategoryImplementation () @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @interface Extension_CategoryImplementation (SomeCategory) @end @implementation Extension_CategoryImplementation (SomeCategory) - (int)normal_normal { return 42; } - (int)direct_normal { // expected-error {{direct method was declared in an extension but is implemented in a different category}} return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in an extension but is implemented in a different category}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in an extension but is implemented in a different category}} return 42; } @end __attribute__((objc_root_class)) @interface OtherCategory_CategoryImplementation @end @interface OtherCategory_CategoryImplementation (SomeCategory) @end @interface OtherCategory_CategoryImplementation (SomeOtherCategory) @property(nonatomic, readonly) int normal_normal; @property(nonatomic, readonly, direct) int direct_normal; // expected-note {{previous declaration is here}} @property(nonatomic, readonly) int normal_direct; // expected-note {{previous declaration is here}} @property(nonatomic, readonly, direct) int direct_direct; // expected-note {{previous declaration is here}} @end @implementation OtherCategory_CategoryImplementation (SomeCategory) - (int)normal_normal { return 42; } - (int)direct_normal { // expected-error {{direct method was declared in a category but is implemented in a different category}} return 42; } - (int)normal_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in a different category}} return 42; } - (int)direct_direct __attribute__((objc_direct)) { // expected-error {{direct method was declared in a category but is implemented in a different category}} return 42; } @end @implementation OtherCategory_CategoryImplementation @end