| // RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-protocol-method-implementation %s |
| |
| __attribute__((objc_root_class)) |
| @interface A |
| @end |
| |
| @interface A (Cat) |
| - (void)A_Cat __attribute__((objc_direct)); // expected-note {{previous declaration is here}} |
| @end |
| |
| @implementation A |
| - (void)A_Cat { // expected-error {{direct method was declared in a category but is implemented in the primary interface}} |
| } |
| @end |
| |
| __attribute__((objc_root_class)) |
| @interface B |
| - (void)B_primary __attribute__((objc_direct)); // expected-note {{previous declaration is here}} |
| @end |
| |
| @interface B () |
| - (void)B_extension __attribute__((objc_direct)); // expected-note {{previous declaration is here}} |
| @end |
| |
| @interface B (Cat) |
| - (void)B_Cat __attribute__((objc_direct)); |
| @end |
| |
| @interface B (OtherCat) |
| - (void)B_OtherCat __attribute__((objc_direct)); // expected-note {{previous declaration is here}} |
| @end |
| |
| @implementation B |
| - (void)B_primary { |
| } |
| - (void)B_extension { |
| } |
| - (void)B_implOnly __attribute__((objc_direct)) { // expected-note {{previous declaration is here}} |
| } |
| @end |
| |
| @implementation B (Cat) |
| - (void)B_primary { // expected-error {{direct method was declared in the primary interface but is implemented in a category}} |
| } |
| - (void)B_extension { // expected-error {{direct method was declared in an extension but is implemented in a different category}} |
| } |
| - (void)B_Cat { |
| } |
| - (void)B_OtherCat { // expected-error {{direct method was declared in a category but is implemented in a different category}} |
| } |
| - (void)B_implOnly __attribute__((objc_direct)) { // expected-error {{direct method declaration conflicts with previous direct declaration of method 'B_implOnly'}} |
| } |
| @end |
| |
| __attribute__((objc_root_class)) |
| @interface C |
| - (void)C1 __attribute__((objc_direct)); // expected-note {{previous declaration is here}} |
| - (void)C2; // expected-note {{previous declaration is here}} |
| @end |
| |
| @interface C (Cat) |
| - (void)C1; // expected-error {{method declaration conflicts with previous direct declaration of method 'C1'}} |
| - (void)C2 __attribute__((objc_direct)); // expected-error {{direct method declaration conflicts with previous declaration of method 'C2'}} |
| @end |