mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Associated objects are actively dangerous there because they’re non-isolated actor state, and it’s “new” code wher no backward compatibility concerns that make it more difficult to ban this on other forms of classes. rdar://69769048
80 lines
3.4 KiB
Swift
80 lines
3.4 KiB
Swift
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s
|
|
|
|
// REQUIRES: objc_interop
|
|
|
|
// CHECK: @_METACLASS_DATA__TtC31class_forbid_objc_assoc_objects24AllowedToHaveAssocObject = internal constant { {{.*}} } { i32 129,
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects24AllowedToHaveAssocObject = internal constant { {{.*}} } { i32 128,
|
|
final class AllowedToHaveAssocObject {
|
|
}
|
|
|
|
// CHECK: @_METACLASS_DATA__TtC31class_forbid_objc_assoc_objects24UnableToHaveAssocObjects = internal constant { {{.*}} } { i32 1153,
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects24UnableToHaveAssocObjects = internal constant { {{.*}} } { i32 1152,
|
|
@_semantics("objc.forbidAssociatedObjects")
|
|
final class UnableToHaveAssocObjects {
|
|
}
|
|
|
|
// Class Metadata For Generic Metadata
|
|
//
|
|
// CHECK: [[CLASS_METADATA:@[0-9][0-9]*]] = internal constant <{ {{.*}} }> <{ {{.*}} { i32 1152,
|
|
//
|
|
// Generic Metadata Pattern
|
|
//
|
|
// CHECK: @"$s31class_forbid_objc_assoc_objects31UnableToHaveAssocObjectsGenericCMP" = internal constant {{.*}}[[CLASS_METADATA]]
|
|
@_semantics("objc.forbidAssociatedObjects")
|
|
final class UnableToHaveAssocObjectsGeneric<T> {
|
|
var state: T
|
|
init(state: T) { self.state = state }
|
|
}
|
|
|
|
// This should be normal.
|
|
//
|
|
// CHECK: @_METACLASS_DATA__TtC31class_forbid_objc_assoc_objects40UnsoundAbleToHaveAssocObjectsParentClass = internal constant { {{.*}} } { i32 129,
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects40UnsoundAbleToHaveAssocObjectsParentClass = internal constant { {{.*}} } { i32 128,
|
|
class UnsoundAbleToHaveAssocObjectsParentClass {
|
|
}
|
|
|
|
// This should have assoc object constraints
|
|
//
|
|
// CHECK: @_METACLASS_DATA__TtC31class_forbid_objc_assoc_objects39UnsoundUnableToHaveAssocObjectsSubClass = internal constant { {{.*}} } { i32 1153,
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects39UnsoundUnableToHaveAssocObjectsSubClass = internal constant { {{.*}} } { i32 1152,
|
|
@_semantics("objc.forbidAssociatedObjects")
|
|
final class UnsoundUnableToHaveAssocObjectsSubClass : UnsoundAbleToHaveAssocObjectsParentClass {
|
|
}
|
|
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects41UnsoundAbleToHaveAssocObjectsParentClass2 = internal constant { {{.*}} } { i32 1152,
|
|
@_semantics("objc.forbidAssociatedObjects")
|
|
class UnsoundAbleToHaveAssocObjectsParentClass2 {
|
|
}
|
|
|
|
// This has normal metadata. We must at runtime add the flags of the subclass to
|
|
// the child.
|
|
//
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects40UnsoundUnableToHaveAssocObjectsSubClass2 = internal constant { {{.*}} } { i32 128,
|
|
final class UnsoundUnableToHaveAssocObjectsSubClass2 : UnsoundAbleToHaveAssocObjectsParentClass2 {
|
|
}
|
|
|
|
// CHECK: @_DATA__TtC31class_forbid_objc_assoc_objects40UnsoundUnableToHaveAssocObjectsSubClass3 = internal constant { {{.*}} } { i32 128,
|
|
class UnsoundUnableToHaveAssocObjectsSubClass3 : UnsoundAbleToHaveAssocObjectsParentClass2 {
|
|
}
|
|
|
|
class GenericAbleToHaveAssocObjectsParentClass<T> {
|
|
public var state: T
|
|
init(state: T) { self.state = state }
|
|
}
|
|
|
|
@_semantics("objc.forbidAssociatedObjects")
|
|
final class GenericUnableToHaveAssocObjectsSubClass<T> : GenericAbleToHaveAssocObjectsParentClass<T> {
|
|
}
|
|
|
|
@_semantics("objc.forbidAssociatedObjects")
|
|
class GenericAbleToHaveAssocObjectsParentClass2<T> {
|
|
public var state: T
|
|
init(state: T) { self.state = state }
|
|
}
|
|
|
|
final class GenericUnableToHaveAssocObjectsSubClass2<T> : GenericAbleToHaveAssocObjectsParentClass2<T> {
|
|
}
|
|
|
|
class GenericUnableToHaveAssocObjectsSubClass3<T> : GenericAbleToHaveAssocObjectsParentClass2<T> {
|
|
}
|