mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
81 lines
2.9 KiB
Plaintext
81 lines
2.9 KiB
Plaintext
// RUN: %empty-directory(%t)
|
|
// RUN: %build-irgen-test-overlays
|
|
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize %s
|
|
|
|
// REQUIRES: CPU=i386 || CPU=x86_64
|
|
// REQUIRES: objc_interop
|
|
|
|
import Swift
|
|
import Foundation
|
|
|
|
class C {}
|
|
sil_vtable C {}
|
|
class D: NSObject {}
|
|
sil_vtable D {}
|
|
|
|
enum SwiftClass {
|
|
case A(C), B(D)
|
|
}
|
|
// can use spare bits—both payloads are Swift-defined classes
|
|
// CHECK-32: %T15enum_spare_bits10SwiftClassO = type <{ [4 x i8] }>
|
|
// CHECK-64: %T15enum_spare_bits10SwiftClassO = type <{ [8 x i8] }>
|
|
|
|
enum ObjCClass {
|
|
case A(NSObject), B(C)
|
|
}
|
|
// can't use spare bits—NSObject is an ObjC-defined class
|
|
// CHECK-32: %T15enum_spare_bits9ObjCClassO = type <{ [4 x i8] }>
|
|
// CHECK-64: %T15enum_spare_bits9ObjCClassO = type <{ [8 x i8], [1 x i8] }>
|
|
|
|
@objc @unsafe_no_objc_tagged_pointer
|
|
protocol NoTaggedPointers {}
|
|
|
|
enum Existential {
|
|
case A(AnyObject), B(C)
|
|
}
|
|
// can't use spare bits—existential may be bound to tagged pointer type
|
|
// CHECK-32: %T15enum_spare_bits11ExistentialO = type <{ [4 x i8] }>
|
|
// CHECK-64: %T15enum_spare_bits11ExistentialO = type <{ [8 x i8], [1 x i8] }>
|
|
|
|
enum ExistentialNoTaggedPointers {
|
|
case A(NoTaggedPointers), B(C)
|
|
}
|
|
// can use spare bits—@unsafe_no_objc_tagged_pointer says it's ok
|
|
// CHECK-32: %T15enum_spare_bits27ExistentialNoTaggedPointersO = type <{ [4 x i8] }>
|
|
// CHECK-64: %T15enum_spare_bits27ExistentialNoTaggedPointersO = type <{ [8 x i8] }>
|
|
|
|
enum Archetype<T: AnyObject> {
|
|
case A(T), B(C)
|
|
}
|
|
// can't use spare bits—archetype may be bound to tagged pointer type
|
|
// CHECK-32: [[ARCHETYPE:%T15enum_spare_bits9ArchetypeOyAA1CCG]] = type <{ [4 x i8], [1 x i8] }>
|
|
// CHECK-32: [[ARCHETYPE_OBJC:%T15enum_spare_bits9ArchetypeOySo8NSObjectCG]] = type <{ [4 x i8], [1 x i8] }>
|
|
// CHECK-64: [[ARCHETYPE:%T15enum_spare_bits9ArchetypeOyAA1CCG]] = type <{ [8 x i8], [1 x i8] }>
|
|
// CHECK-64: [[ARCHETYPE_OBJC:%T15enum_spare_bits9ArchetypeOySo8NSObjectCG]] = type <{ [8 x i8], [1 x i8] }>
|
|
|
|
sil_global @swiftClass: $SwiftClass
|
|
sil_global @objcClass: $ObjCClass
|
|
sil_global @existential: $Existential
|
|
sil_global @existentialntp: $ExistentialNoTaggedPointers
|
|
sil_global @archetypeBoundToSwift: $Archetype<C>
|
|
sil_global @archetypeBoundToObjC: $Archetype<NSObject>
|
|
|
|
// CHECK: @archetypeBoundToSwift = {{(protected )?}}global [[ARCHETYPE]]
|
|
// CHECK: @archetypeBoundToObjC = {{(protected )?}}global [[ARCHETYPE_OBJC]]
|
|
|
|
sil @instantiate_globals : $() -> () {
|
|
entry:
|
|
%a = global_addr @swiftClass : $*SwiftClass
|
|
%b = global_addr @objcClass : $*ObjCClass
|
|
%c = global_addr @existential : $*Existential
|
|
%d = global_addr @existentialntp : $*ExistentialNoTaggedPointers
|
|
%e = global_addr @archetypeBoundToSwift : $*Archetype<C>
|
|
%f = global_addr @archetypeBoundToObjC : $*Archetype<NSObject>
|
|
return undef : $()
|
|
}
|
|
|
|
sil @$s15enum_spare_bits1DCACycfcTo : $@convention(thin) (@owned D) -> @owned D {
|
|
entry(%x : $D):
|
|
return undef : $D
|
|
}
|