brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.5 KiB · 80ca5b2 Raw
170 lines · plain
1// RUN: %clang_cc1 -fsyntax-only -verify -Wselector-type-mismatch %s2 3@protocol Proto4- (void)protoMethod;      // expected-note {{previous declaration is here}}5+ (void)classProtoMethod; // expected-note {{previous declaration is here}}6@end7 8@protocol ProtoDirectFail9- (void)protoMethod __attribute__((objc_direct));      // expected-error {{'objc_direct' attribute cannot be applied to methods declared in an Objective-C protocol}}10+ (void)classProtoMethod __attribute__((objc_direct)); // expected-error {{'objc_direct' attribute cannot be applied to methods declared in an Objective-C protocol}}11@end12 13__attribute__((objc_root_class))14@interface Root15- (void)unavailableInChild;16- (void)rootRegular;                                  // expected-note {{previous declaration is here}}17+ (void)classRootRegular;                             // expected-note {{previous declaration is here}}18- (void)rootDirect __attribute__((objc_direct));      // expected-note {{previous declaration is here}};19+ (void)classRootDirect __attribute__((objc_direct)); // expected-note {{previous declaration is here}};20- (void)otherRootDirect __attribute__((objc_direct)); // expected-note {{direct method 'otherRootDirect' declared here}}21+ (void)otherClassRootDirect __attribute__((objc_direct)); // expected-note {{direct method 'otherClassRootDirect' declared here}}22+ (void)otherOtherClassRootDirect __attribute__((objc_direct)); // expected-note {{direct method 'otherOtherClassRootDirect' declared here}}23- (void)notDirectInIface;                             // expected-note {{previous declaration is here}}24+ (void)classNotDirectInIface;                        // expected-note {{previous declaration is here}}25@end26 27__attribute__((objc_direct_members))28@interface Root ()29- (void)rootExtensionDirect;      // expected-note {{previous declaration is here}}30+ (void)classRootExtensionDirect; // expected-note {{previous declaration is here}}31@end32 33__attribute__((objc_direct_members))34@interface Root(Direct)35- (void)rootCategoryDirect;      // expected-note {{previous declaration is here}}36+ (void)classRootCategoryDirect; // expected-note {{previous declaration is here}}37@end38 39@interface Root ()40- (void)rootExtensionRegular;                                   // expected-note {{previous declaration is here}}41+ (void)classRootExtensionRegular;                              // expected-note {{previous declaration is here}}42- (void)rootExtensionDirect2 __attribute__((objc_direct));      // expected-note {{previous declaration is here}}43+ (void)classRootExtensionDirect2 __attribute__((objc_direct)); // expected-note {{previous declaration is here}}44@end45 46@interface Root (Direct2)47- (void)rootCategoryRegular;                                   // expected-note {{previous declaration is here}}48+ (void)classRootCategoryRegular;                              // expected-note {{previous declaration is here}}49- (void)rootCategoryDirect2 __attribute__((objc_direct));      // expected-note {{previous declaration is here}}50+ (void)classRootCategoryDirect2 __attribute__((objc_direct)); // expected-note {{previous declaration is here}}51@end52 53__attribute__((objc_direct_members))54@interface SubDirectMembers : Root55@property int foo; // expected-note {{previous declaration is here}}56- (void)unavailableInChild __attribute__((unavailable)); // should not warn57- (instancetype)init;58@end59 60@interface Sub : Root <Proto>61/* invalid overrides with directs */62- (void)rootRegular __attribute__((objc_direct));               // expected-error {{methods that override superclass methods cannot be direct}}63+ (void)classRootRegular __attribute__((objc_direct));          // expected-error {{methods that override superclass methods cannot be direct}}64- (void)protoMethod __attribute__((objc_direct));               // expected-error {{methods that implement protocol requirements cannot be direct}}65+ (void)classProtoMethod __attribute__((objc_direct));          // expected-error {{methods that implement protocol requirements cannot be direct}}66- (void)rootExtensionRegular __attribute__((objc_direct));      // expected-error {{methods that override superclass methods cannot be direct}}67+ (void)classRootExtensionRegular __attribute__((objc_direct)); // expected-error {{methods that override superclass methods cannot be direct}}68- (void)rootCategoryRegular __attribute__((objc_direct));       // expected-error {{methods that override superclass methods cannot be direct}}69+ (void)classRootCategoryRegular __attribute__((objc_direct));  // expected-error {{methods that override superclass methods cannot be direct}}70 71/* invalid overrides of directs */72- (void)rootDirect;                // expected-error {{cannot override a method that is declared direct by a superclass}}73+ (void)classRootDirect;           // expected-error {{cannot override a method that is declared direct by a superclass}}74- (void)rootExtensionDirect;       // expected-error {{cannot override a method that is declared direct by a superclass}}75+ (void)classRootExtensionDirect;  // expected-error {{cannot override a method that is declared direct by a superclass}}76- (void)rootExtensionDirect2;      // expected-error {{cannot override a method that is declared direct by a superclass}}77+ (void)classRootExtensionDirect2; // expected-error {{cannot override a method that is declared direct by a superclass}}78- (void)rootCategoryDirect;        // expected-error {{cannot override a method that is declared direct by a superclass}}79+ (void)classRootCategoryDirect;   // expected-error {{cannot override a method that is declared direct by a superclass}}80- (void)rootCategoryDirect2;       // expected-error {{cannot override a method that is declared direct by a superclass}}81+ (void)classRootCategoryDirect2;  // expected-error {{cannot override a method that is declared direct by a superclass}}82@end83 84__attribute__((objc_direct_members))85@implementation Root86- (void)unavailableInChild {87}88- (void)rootRegular {89}90+ (void)classRootRegular {91}92- (void)rootDirect {93}94+ (void)classRootDirect {95}96- (void)otherRootDirect {97}98+ (void)someRootDirectMethod { // expected-note {{direct method 'someRootDirectMethod' declared here}}99}100+ (void)otherClassRootDirect {101  [self someRootDirectMethod]; // expected-error {{messaging a Class with a method that is possibly direct}}102}103+ (void)otherOtherClassRootDirect {104}105- (void)rootExtensionDirect {106}107+ (void)classRootExtensionDirect {108}109- (void)rootExtensionRegular {110}111+ (void)classRootExtensionRegular {112}113- (void)rootExtensionDirect2 {114}115+ (void)classRootExtensionDirect2 {116}117- (void)notDirectInIface __attribute__((objc_direct)) // expected-error {{direct method implementation was previously declared not direct}}118{119}120+ (void)classNotDirectInIface __attribute__((objc_direct)) // expected-error {{direct method implementation was previously declared not direct}}121{122}123- (void)direct1 { // expected-note {{direct method 'direct1' declared here}}124}125- (void)direct2 { // expected-note {{direct method 'direct2' declared here}}126}127@end128 129@interface Foo : Root130- (id)directMismatch1; // expected-note {{using}}131- (id)directMismatch2; // expected-note {{method 'directMismatch2' declared here}}132@end133 134@interface Bar : Root135- (void)directMismatch1 __attribute__((objc_direct)); // expected-note {{also found}}136- (void)directMismatch2 __attribute__((objc_direct)); // expected-note {{method 'directMismatch2' declared here}}137@end138 139@interface ValidSub : Root140@end141 142@implementation ValidSub143- (void)someValidSubMethod {144  [super otherRootDirect]; // expected-error {{messaging super with a direct method}}145}146+ (void)someValidSubMethod {147  [super otherOtherClassRootDirect]; // expected-error {{messaging super with a direct method}}148}149@end150 151@implementation SubDirectMembers152@dynamic foo; // expected-error {{direct property cannot be @dynamic}}153- (instancetype)init {154  return self;155}156@end157 158extern void callMethod(id obj, Class cls);159extern void useSel(SEL sel);160 161void callMethod(id obj, Class cls) {162  [Root otherClassRootDirect];163  [cls otherClassRootDirect]; // expected-error {{messaging a Class with a method that is possibly direct}}164  [obj direct1];              // expected-error {{messaging unqualified id with a method that is possibly direct}}165  [(Root *)obj direct1];166  [obj directMismatch1];              // expected-warning {{multiple methods named 'directMismatch1' found}}167  useSel(@selector(direct2));         // expected-error {{@selector expression formed with direct selector 'direct2'}}168  useSel(@selector(directMismatch2)); // expected-warning {{several methods with selector 'directMismatch2' of mismatched types are found for the @selector expression}}169}170