mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-10 00:46:06 +00:00

Swift requires certain classes to be not just initialized lazily on first use, but actually allocated lazily using information that is only available at runtime. This is incompatible with ObjC class initialization, or at least not efficiently compatible, because there is no meaningful class symbol that can be put in a class-ref variable at load time. This leaves ObjC code unable to access such classes, which is undesirable. objc_class_stub says that class references should be resolved by calling a new ObjC runtime function with a pointer to a new "class stub" structure. Non-ObjC compilers (like Swift) can simply emit this structure when ObjC interop is required for a class that cannot be statically allocated, then apply this attribute to the `@interface` in the generated ObjC header for the class. This attribute can be thought of as a generalization of the existing `objc_runtime_visible` attribute which permits more efficient class resolution as well as supporting the additon of categories to the class. Subclassing these classes from ObjC is currently not allowed. Patch by Slava Pestov! llvm-svn: 362054
28 lines
1.1 KiB
Objective-C
28 lines
1.1 KiB
Objective-C
// RUN: %clang -target x86_64-apple-darwin -fsyntax-only -Xclang -verify %s
|
|
// RUN: %clang -target x86_64-apple-darwin -x objective-c++ -fsyntax-only -Xclang -verify %s
|
|
|
|
@interface NSObject
|
|
@end
|
|
|
|
__attribute__((objc_class_stub))
|
|
@interface MissingSubclassingRestrictedAttribute : NSObject // expected-error {{'objc_class_stub' attribute cannot be specified on a class that does not have the 'objc_subclassing_restricted' attribute}}
|
|
@end
|
|
|
|
__attribute__((objc_class_stub))
|
|
__attribute__((objc_subclassing_restricted))
|
|
@interface ValidClassStubAttribute : NSObject
|
|
@end
|
|
|
|
@implementation ValidClassStubAttribute // expected-error {{cannot declare implementation of a class declared with the 'objc_class_stub' attribute}}
|
|
@end
|
|
|
|
@implementation ValidClassStubAttribute (MyCategory)
|
|
@end
|
|
|
|
__attribute__((objc_class_stub(123))) // expected-error {{'objc_class_stub' attribute takes no arguments}}
|
|
@interface InvalidClassStubAttribute : NSObject
|
|
@end
|
|
|
|
__attribute__((objc_class_stub)) // expected-error {{'objc_class_stub' attribute only applies to Objective-C interfaces}}
|
|
int cannotHaveObjCClassStubAttribute() {}
|