// RUN: %clang_cc1 %s -Wpotentially-direct-selector -verify // RUN: %clang_cc1 %s -Wstrict-potentially-direct-selector -verify=expected,strict #define NS_DIRECT __attribute__((objc_direct)) __attribute__((objc_root_class)) @interface Dummies -(void)inBase; -(void)inBaseImpl; -(void)inBaseCat; -(void)inBaseCatImpl; -(void)inDerived; -(void)inDerivedImpl; -(void)inDerivedCat; -(void)inDerivedCatImpl; +(void)inBaseClass; +(void)inDerivedClass; +(void)inDerivedCatClass; @end __attribute__((objc_root_class)) @interface Base -(void)inBase NS_DIRECT; // expected-note + {{direct method}} +(void)inBaseClass NS_DIRECT; // expected-note + {{direct method}} @end @implementation Base -(void)inBaseImpl NS_DIRECT { // expected-note + {{direct method}} } -(void)inBase {} +(void)inBaseClass {} @end @interface Base (Cat) -(void)inBaseCat NS_DIRECT; // expected-note + {{direct method}} @end @implementation Base (Cat) -(void)inBaseCatImpl NS_DIRECT { // expected-note + {{direct method}} } -(void)inBaseCat {} @end @interface Derived : Base -(void)inDerived NS_DIRECT; // expected-note + {{direct method}} +(void)inDerivedClass NS_DIRECT; // expected-note + {{direct method}} @end @implementation Derived -(void)inDerivedImpl NS_DIRECT { // expected-note + {{direct method}} } -(void)inDerived {} +(void)inDerivedClass {} @end @interface Derived (Cat) -(void)inDerivedCat NS_DIRECT; // expected-note + {{direct method}} +(void)inDerivedCatClass NS_DIRECT; // expected-note + {{direct method}} @end @implementation Derived (Cat) -(void)inDerivedCatImpl NS_DIRECT { // expected-note + {{direct method}} } -(void)inDerivedCat {} +(void)inDerivedCatClass {} -(void)test1 { (void)@selector(inBase); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseImpl); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCat); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCatImpl); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerived); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedImpl); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCat); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatImpl); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedClass); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseClass); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatClass); // expected-warning{{@selector expression formed with potentially direct selector}} } @end void test2() { (void)@selector(inBase); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCat); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCatImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerived); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCat); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedClass); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseClass); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatClass); // strict-warning{{@selector expression formed with potentially direct selector}} } @interface OnlyBase : Base @end @implementation OnlyBase -(void)test3 { (void)@selector(inBase); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseImpl); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCat); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCatImpl); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerived); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCat); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedClass); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseClass); // expected-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatClass); // strict-warning{{@selector expression formed with potentially direct selector}} } @end __attribute__((objc_root_class)) @interface Unrelated @end @implementation Unrelated -(void)test4 { (void)@selector(inBase); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCat); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseCatImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerived); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCat); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatImpl); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedClass); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inBaseClass); // strict-warning{{@selector expression formed with potentially direct selector}} (void)@selector(inDerivedCatClass); // strict-warning{{@selector expression formed with potentially direct selector}} } @end @implementation Dummies -(void)inBase {} -(void)inBaseImpl {} -(void)inBaseCat {} -(void)inBaseCatImpl {} -(void)inDerived {} -(void)inDerivedImpl {} -(void)inDerivedCat {} -(void)inDerivedCatImpl {} +(void)inBaseClass {} +(void)inDerivedClass {} +(void)inDerivedCatClass {} -(void)test5 { (void)@selector(inBase); (void)@selector(inBaseImpl); (void)@selector(inBaseCat); (void)@selector(inBaseCatImpl); (void)@selector(inDerived); (void)@selector(inDerivedImpl); (void)@selector(inDerivedCat); (void)@selector(inDerivedCatImpl); (void)@selector(inDerivedClass); (void)@selector(inBaseClass); (void)@selector(inDerivedCatClass); } @end