| // RUN: %clang_cc1 -fobjc-arc -fsyntax-only -verify -Wselector-type-mismatch %s |
| |
| extern Class object_getClass(id); |
| |
| __attribute__((objc_root_class)) |
| @interface Root |
| - (Class)class; |
| + (void)directMethod __attribute__((objc_direct)); // expected-note {{direct method 'directMethod' declared here}} |
| + (void)anotherDirectMethod __attribute__((objc_direct)); |
| @end |
| |
| @implementation Root |
| - (Class)class |
| { |
| return object_getClass(self); |
| } |
| + (void)directMethod { |
| } |
| + (void)anotherDirectMethod { |
| [self directMethod]; // this should not warn |
| } |
| + (void)regularMethod { |
| [self directMethod]; // this should not warn |
| [self anotherDirectMethod]; // this should not warn |
| } |
| - (void)regularInstanceMethod { |
| [[self class] directMethod]; // expected-error {{messaging a Class with a method that is possibly direct}} |
| } |
| @end |
| |
| @interface Sub : Root |
| @end |
| |
| @implementation Sub |
| + (void)foo { |
| [self directMethod]; // this should not warn |
| } |
| @end |
| |
| __attribute__((objc_root_class)) |
| @interface Other |
| @end |
| |
| @implementation Other |
| + (void)bar { |
| [self directMethod]; // expected-error {{no known class method for selector 'directMethod'}} |
| } |
| @end |