142f9d0c0SPierre Habouzit// RUN: %clang_cc1 -fsyntax-only -verify -Wno-objc-protocol-method-implementation %s 242f9d0c0SPierre Habouzit 342f9d0c0SPierre Habouzit__attribute__((objc_root_class)) 442f9d0c0SPierre Habouzit@interface A 542f9d0c0SPierre Habouzit@end 642f9d0c0SPierre Habouzit 742f9d0c0SPierre Habouzit@interface A (Cat) 842f9d0c0SPierre Habouzit- (void)A_Cat __attribute__((objc_direct)); // expected-note {{previous declaration is here}} 942f9d0c0SPierre Habouzit@end 1042f9d0c0SPierre Habouzit 1142f9d0c0SPierre Habouzit@implementation A 1242f9d0c0SPierre Habouzit- (void)A_Cat { // expected-error {{direct method was declared in a category but is implemented in the primary interface}} 1342f9d0c0SPierre Habouzit} 1442f9d0c0SPierre Habouzit@end 1542f9d0c0SPierre Habouzit 1642f9d0c0SPierre Habouzit__attribute__((objc_root_class)) 1742f9d0c0SPierre Habouzit@interface B 1842f9d0c0SPierre Habouzit- (void)B_primary __attribute__((objc_direct)); // expected-note {{previous declaration is here}} 1942f9d0c0SPierre Habouzit@end 2042f9d0c0SPierre Habouzit 2142f9d0c0SPierre Habouzit@interface B () 2242f9d0c0SPierre Habouzit- (void)B_extension __attribute__((objc_direct)); // expected-note {{previous declaration is here}} 2342f9d0c0SPierre Habouzit@end 2442f9d0c0SPierre Habouzit 2542f9d0c0SPierre Habouzit@interface B (Cat) 2642f9d0c0SPierre Habouzit- (void)B_Cat __attribute__((objc_direct)); 2742f9d0c0SPierre Habouzit@end 2842f9d0c0SPierre Habouzit 2942f9d0c0SPierre Habouzit@interface B (OtherCat) 3042f9d0c0SPierre Habouzit- (void)B_OtherCat __attribute__((objc_direct)); // expected-note {{previous declaration is here}} 3142f9d0c0SPierre Habouzit@end 3242f9d0c0SPierre Habouzit 33*20d704a7SPierre Habouzit@implementation B 34*20d704a7SPierre Habouzit- (void)B_primary { 35*20d704a7SPierre Habouzit} 36*20d704a7SPierre Habouzit- (void)B_extension { 37*20d704a7SPierre Habouzit} 38*20d704a7SPierre Habouzit- (void)B_implOnly __attribute__((objc_direct)) { // expected-note {{previous declaration is here}} 39*20d704a7SPierre Habouzit} 40*20d704a7SPierre Habouzit@end 41*20d704a7SPierre Habouzit 4242f9d0c0SPierre Habouzit@implementation B (Cat) 4342f9d0c0SPierre Habouzit- (void)B_primary { // expected-error {{direct method was declared in the primary interface but is implemented in a category}} 4442f9d0c0SPierre Habouzit} 4542f9d0c0SPierre Habouzit- (void)B_extension { // expected-error {{direct method was declared in an extension but is implemented in a different category}} 4642f9d0c0SPierre Habouzit} 4742f9d0c0SPierre Habouzit- (void)B_Cat { 4842f9d0c0SPierre Habouzit} 4942f9d0c0SPierre Habouzit- (void)B_OtherCat { // expected-error {{direct method was declared in a category but is implemented in a different category}} 5042f9d0c0SPierre Habouzit} 51*20d704a7SPierre Habouzit- (void)B_implOnly __attribute__((objc_direct)) { // expected-error {{direct method declaration conflicts with previous direct declaration of method 'B_implOnly'}} 52*20d704a7SPierre Habouzit} 5342f9d0c0SPierre Habouzit@end 5442f9d0c0SPierre Habouzit 5542f9d0c0SPierre Habouzit__attribute__((objc_root_class)) 5642f9d0c0SPierre Habouzit@interface C 5742f9d0c0SPierre Habouzit- (void)C1 __attribute__((objc_direct)); // expected-note {{previous declaration is here}} 5842f9d0c0SPierre Habouzit- (void)C2; // expected-note {{previous declaration is here}} 5942f9d0c0SPierre Habouzit@end 6042f9d0c0SPierre Habouzit 6142f9d0c0SPierre Habouzit@interface C (Cat) 6242f9d0c0SPierre Habouzit- (void)C1; // expected-error {{method declaration conflicts with previous direct declaration of method 'C1'}} 6342f9d0c0SPierre Habouzit- (void)C2 __attribute__((objc_direct)); // expected-error {{direct method declaration conflicts with previous declaration of method 'C2'}} 6442f9d0c0SPierre Habouzit@end 65