| // 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 |
| } |