blob: 4c22008f75c03c011820b9323f83cc423c92ee99 [file] [log] [blame]
// 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
}