xref: /llvm-project/clang/test/SemaObjC/method-direct-one-definition.m (revision 20d704a75ed51c7a9a155aa3978d0c02671c3f69)
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