mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[metadata prespecialization] Direct refs to enums.
When a specialized usage of a generic enum occurs in the same module where the enum was defined, directly reference the prespecialized metadata. rdar://problem/56994321
This commit is contained in:
@@ -684,11 +684,6 @@ bool irgen::isNominalGenericContextTypeMetadataAccessTrivial(
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isa<EnumType>(type) || isa<BoundGenericEnumType>(type)) {
|
||||
// TODO: Support enums.
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isa<ClassType>(type) || isa<BoundGenericClassType>(type)) {
|
||||
// TODO: Support classes.
|
||||
return false;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// #if directives don't work with SIL keywords, therefore please put ObjC tests
|
||||
// in `enum_objc.sil`.
|
||||
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
|
||||
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
|
||||
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
|
||||
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
|
||||
|
||||
// REQUIRES: CPU=i386 || CPU=x86_64
|
||||
|
||||
|
||||
2767
test/IRGen/enum_future.sil
Normal file
2767
test/IRGen/enum_future.sil
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
// RUN: %target-swift-frontend %s -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
|
||||
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
|
||||
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
|
||||
// RUN: %target-swift-frontend %s -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
|
||||
|
||||
// REQUIRES: CPU=x86_64
|
||||
|
||||
|
||||
666
test/IRGen/enum_value_semantics_future.sil
Normal file
666
test/IRGen/enum_value_semantics_future.sil
Normal file
@@ -0,0 +1,666 @@
|
||||
// RUN: %target-swift-frontend %s -target %module-target-future -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
|
||||
// RUN: %target-swift-frontend %s -target %module-target-future -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
|
||||
|
||||
// REQUIRES: CPU=x86_64
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
import Builtin
|
||||
|
||||
enum NoPayload {
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
enum SingletonPayload {
|
||||
case S(Builtin.Int64, Builtin.Int64)
|
||||
}
|
||||
|
||||
enum SinglePayloadTrivial {
|
||||
case payload(Builtin.Int64)
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
enum SinglePayloadNontrivial {
|
||||
case payload(Builtin.NativeObject)
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
sil @single_payload_nontrivial_user : $@convention(thin) (@owned SinglePayloadNontrivial) -> ()
|
||||
|
||||
enum MultiPayloadTrivial {
|
||||
case payload1(Builtin.Int64)
|
||||
case payload2(Builtin.Int32, Builtin.Int32)
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
enum MultiPayloadNoEmptyCases {
|
||||
case payload1(Builtin.Int64)
|
||||
case payload2(Builtin.Int32, Builtin.Int32)
|
||||
}
|
||||
|
||||
enum MultiPayloadEmptyPayload {
|
||||
case payload1()
|
||||
case payload2()
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
// No spare bits
|
||||
enum MultiPayloadNontrivial {
|
||||
case payload1(Builtin.NativeObject)
|
||||
case payload2(Builtin.Int64)
|
||||
case payload3(Builtin.Int64, Builtin.NativeObject)
|
||||
case payload4(Builtin.Int64, Builtin.Int64)
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
enum MultiPayloadGeneric<T> {
|
||||
case payload1(T)
|
||||
case payload2(T)
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
// Most significant bits of second 64-bit word of payload
|
||||
// are spare bits
|
||||
enum MultiPayloadNontrivialSpareBits {
|
||||
case payload1(Builtin.NativeObject)
|
||||
case payload2(Builtin.Int64)
|
||||
case payload3(Builtin.Int64, Builtin.NativeObject)
|
||||
case a
|
||||
case b
|
||||
case c
|
||||
}
|
||||
|
||||
// We only have 1 spare bit but 3 payload cases
|
||||
enum MultiPayloadSpareBitsAndExtraBits {
|
||||
case payload1(Builtin.Int63)
|
||||
case payload2(Builtin.NativeObject)
|
||||
case payload3(Builtin.NativeObject)
|
||||
}
|
||||
|
||||
enum GenericFixedLayout<T> {
|
||||
case foo(Builtin.Int64)
|
||||
case bar(Builtin.NativeObject)
|
||||
}
|
||||
|
||||
|
||||
// CHECK-LABEL: @"$s27enum_value_semantics_future20SinglePayloadTrivialOWV" = internal constant %swift.enum_vwtable {
|
||||
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
|
||||
// CHECK: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
|
||||
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
|
||||
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
|
||||
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
|
||||
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
|
||||
// CHECK: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwet" to i8*),
|
||||
// CHECK: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwst" to i8*),
|
||||
// CHECK: i64 9,
|
||||
// CHECK: i64 16,
|
||||
// CHECK: i32 2097159,
|
||||
// CHECK: i32 0,
|
||||
// CHECK: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwug" to i8*),
|
||||
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwup" to i8*),
|
||||
// CHECK: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwui" to i8*)
|
||||
// CHECK: }
|
||||
|
||||
|
||||
// CHECK-LABEL: @"$s27enum_value_semantics_future20SinglePayloadTrivialOMf" =
|
||||
// CHECK-SAME: internal constant <{ {{.*}} }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s27enum_value_semantics_future20SinglePayloadTrivialOWV", i32 0, i32 0),
|
||||
// CHECK-SAME: i64 513,
|
||||
// CHECK-SAME: {{.*}}* @"$s27enum_value_semantics_future20SinglePayloadTrivialOMn"
|
||||
// CHECK-SAME: }>
|
||||
|
||||
|
||||
// CHECK-LABEL: @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWV" = internal constant %swift.enum_vwtable {
|
||||
// CHECK: i8* bitcast (%swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwCP" to i8*),
|
||||
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwxx" to i8*),
|
||||
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwcp" to i8*),
|
||||
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwca" to i8*),
|
||||
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy8_8 to i8*),
|
||||
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwta" to i8*),
|
||||
// CHECK: i64 8,
|
||||
// CHECK: i64 8,
|
||||
// -- 0x210007
|
||||
// CHECK: i32 2162695,
|
||||
// -- On Darwin, the first 4 GiB are unmapped: 0x7ffffffc
|
||||
// -- Otherwise, one can only assume the first page (4 KiB) is unmapped: 0xffd
|
||||
// CHECK-ios: i32 2147483644
|
||||
// CHECK-macosx: i32 2147483644
|
||||
// CHECK-watchos: i32 2147483644
|
||||
// CHECK-darwin: i32 2147483644
|
||||
// CHECK-objc-linux-gnu: i32 2045
|
||||
// CHECK-native-linux-gnu: i32 4093
|
||||
// CHECK-objc-windows: i32 2045
|
||||
// CHECK-native-windows: i32 4093
|
||||
// CHECK: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwug" to i8*),
|
||||
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwup" to i8*)
|
||||
// CHECK: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwui" to i8*)
|
||||
// CHECK: ]
|
||||
|
||||
|
||||
// CHECK-LABEL: @"$s27enum_value_semantics_future23SinglePayloadNontrivialOMf" =
|
||||
// CHECK-SAME: internal constant <{ {{.*}} }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWV", i32 0, i32 0),
|
||||
// CHECK-SAME: i64 513,
|
||||
// CHECK-SAME: {{.*}}* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOMn"
|
||||
// CHECK-SAME: }>
|
||||
|
||||
|
||||
// CHECK-LABEL: @"$s27enum_value_semantics_future18GenericFixedLayoutOMn" = hidden constant
|
||||
// CHECK-SAME: [16 x i8*]* @"$s27enum_value_semantics_future18GenericFixedLayoutOMI"
|
||||
// CHECK-SAME: @"$s27enum_value_semantics_future18GenericFixedLayoutOMP"
|
||||
|
||||
// CHECK-LABEL: @"$s27enum_value_semantics_future18GenericFixedLayoutOMP" = internal constant <{ {{.*}} }> <{
|
||||
// Instantiation function.
|
||||
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s27enum_value_semantics_future18GenericFixedLayoutOMi" to i64), i64 ptrtoint (<{ i32, i32, i32, i32 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP" to i64)) to i32),
|
||||
// Completion function.
|
||||
// CHECK-SAME: i32 0,
|
||||
// Pattern flags. 0x4020_0002 == (MetadataKind::Enum << 21 | HasTrailingFlags).
|
||||
// CHECK-SAME: i32 1075838978,
|
||||
// Value witness table.
|
||||
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.enum_vwtable* @"$s27enum_value_semantics_future18GenericFixedLayoutOWV" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32 }>, <{ i32, i32, i32, i32 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 3) to i64)) to i32)
|
||||
// CHECK-SAME: }>
|
||||
|
||||
sil @single_payload_nontrivial_copy_destroy : $(@owned SinglePayloadNontrivial) -> () {
|
||||
bb0(%0 : $SinglePayloadNontrivial):
|
||||
retain_value %0 : $SinglePayloadNontrivial
|
||||
%1 = function_ref @single_payload_nontrivial_user : $@convention(thin) (@owned SinglePayloadNontrivial) -> ()
|
||||
apply %1(%0) : $@convention(thin) (@owned SinglePayloadNontrivial) -> ()
|
||||
release_value %0 : $SinglePayloadNontrivial
|
||||
%v = tuple ()
|
||||
return %v : $()
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_nontrivial_copy_destroy(i64 %0)
|
||||
// CHECK: call void @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWOy"
|
||||
// CHECK-NEXT: call swiftcc void @single_payload_nontrivial_user
|
||||
// CHECK-NEXT: call void @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWOe"
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
//
|
||||
// No payload enums
|
||||
//
|
||||
|
||||
|
||||
// -- NoPayload getEnumTag
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future9NoPayloadOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future9NoPayloadO*
|
||||
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future9NoPayloadO, %T27enum_value_semantics_future9NoPayloadO* [[SELF]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 1
|
||||
// CHECK-NEXT: [[RESULT:%.*]] = zext i8 %2 to i32
|
||||
// CHECK-NEXT: ret i32 [[RESULT]]
|
||||
|
||||
|
||||
// -- NoPayload destructiveProjectEnumData
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future9NoPayloadOwup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
// -- NoPayload destructiveInjectEnumTag
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future9NoPayloadOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future9NoPayloadO*
|
||||
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
|
||||
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future9NoPayloadO, %T27enum_value_semantics_future9NoPayloadO* [[SELF]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i8 [[TAG]], i8* [[TAG_ADDR]], align 1
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Singleton payload enums
|
||||
//
|
||||
|
||||
|
||||
// -- SingletonPayload getEnumTag
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future16SingletonPayloadOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future16SingletonPayloadO*
|
||||
// CHECK-NEXT: ret i32 0
|
||||
|
||||
|
||||
// -- SingletonPayload destructiveProjectEnumData
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future16SingletonPayloadOwup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
// -- SingletonPayload destructiveInjectEnumTag
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future16SingletonPayloadOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future16SingletonPayloadO*
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
// -- SinglePayloadTrivial getEnumTag
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future20SinglePayloadTrivialOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future20SinglePayloadTrivialO*
|
||||
// CHECK: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
|
||||
// CHECK: [[TAG:%.*]] = call i32 %getEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 3, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* @"$sBi64_N", i32 0, i32 1))
|
||||
// CHECK: ret i32 [[TAG]]
|
||||
|
||||
|
||||
// -- SinglePayloadTrivial destructiveProjectEnumData
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future20SinglePayloadTrivialOwup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
//
|
||||
// Single-payload enums
|
||||
//
|
||||
|
||||
|
||||
// -- SinglePayloadTrivial destructiveInjectEnumTag
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future20SinglePayloadTrivialOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future20SinglePayloadTrivialO*
|
||||
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
|
||||
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 %tag, i32 3, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* @"$sBi64_N", i32 0, i32 1))
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
// -- SinglePayloadNontrivial destroyBuffer
|
||||
// CHECK: define internal void @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %SinglePayloadNontrivial) {{.*}} {
|
||||
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T27enum_value_semantics_future23SinglePayloadNontrivialO*
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future23SinglePayloadNontrivialO* [[ADDR]] to i64*
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
|
||||
// CHECK-NEXT: switch i64 %2, label %[[RELEASE_PAYLOAD:[0-9]+]] [
|
||||
// CHECK: i64 0, label %[[DONE:[0-9]+]]
|
||||
// CHECK-native: i64 1, label %[[DONE]]
|
||||
// CHECK-native: i64 2, label %[[DONE]]
|
||||
// CHECK-objc-simulator-false: i64 2, label %[[DONE]]
|
||||
// CHECK-objc-simulator-false: i64 4, label %[[DONE]]
|
||||
// CHECK-objc-simulator-true: i64 1, label %[[DONE]]
|
||||
// CHECK-objc-simulator-true: i64 2, label %[[DONE]]
|
||||
// CHECK: ]
|
||||
|
||||
// CHECK: [[RELEASE_PAYLOAD]]:
|
||||
// CHECK-NEXT: [[DATA_ADDR:%.*]] = bitcast %T27enum_value_semantics_future23SinglePayloadNontrivialO* [[ADDR]] to %swift.refcounted**
|
||||
// CHECK-NEXT: [[DATA:%.*]] = load %swift.refcounted*, %swift.refcounted** [[DATA_ADDR]], align 8
|
||||
// CHECK-NEXT: call void @swift_release(%swift.refcounted* [[DATA]])
|
||||
// CHECK-NEXT: br label %[[DONE]]
|
||||
|
||||
// CHECK: [[DONE]]:
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Multi-payload enums
|
||||
//
|
||||
|
||||
|
||||
// -- MultiPayloadTrivial getEnumTag
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future19MultiPayloadTrivialOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadTrivialO*
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]] to i64*
|
||||
|
||||
|
||||
// -- Load the low bits of the tag from the payload area
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
|
||||
|
||||
// -- Load the high bits of the tag from the extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
|
||||
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, i8* [[EXTRA_TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i8 [[EXTRA_TAG_TMP]] to i32
|
||||
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = trunc i64 [[NO_PAYLOAD_TAG_TMP]] to i32
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = add i32 [[NO_PAYLOAD_TAG]], 2
|
||||
|
||||
// -- Check if we have a payload or not
|
||||
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 [[EXTRA_TAG]], 2
|
||||
// CHECK-NEXT: [[TAG:%.*]] = select i1 [[IS_PAYLOAD]], i32 [[NO_PAYLOAD_TAG2]], i32 [[EXTRA_TAG]]
|
||||
|
||||
// -- Return the tag
|
||||
// CHECK-NEXT: ret i32 [[TAG]]
|
||||
|
||||
// -- MultiPayloadTrivial destructiveProjectEnumData
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future19MultiPayloadTrivialOwup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
// -- MultiPayloadTrivial destructiveInjectEnumTag
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future19MultiPayloadTrivialOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadTrivialO*
|
||||
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 2
|
||||
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
|
||||
|
||||
// CHECK: [[HAS_NO_PAYLOAD]]:
|
||||
|
||||
// -- Compute the no-payload tag
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = sub i32 %tag, 2
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = zext i32 [[NO_PAYLOAD_TAG]] to i64
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]] to i64*
|
||||
|
||||
// -- Store the low bits of the tag in the payload area
|
||||
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], i64* [[PAYLOAD]], align 8
|
||||
|
||||
// -- Store the high bits of the tag in the extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
|
||||
// CHECK-NEXT: store i8 2, i8* [[EXTRA_TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: br label %[[DONE:.*]]
|
||||
|
||||
// CHECK: [[HAS_PAYLOAD]]:
|
||||
|
||||
// -- Store the tag in the extra tag area
|
||||
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
|
||||
// CHECK-NEXT: store i8 [[TAG]], i8* [[EXTRA_TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: br label %[[DONE]]
|
||||
|
||||
// CHECK: [[DONE]]:
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Multi-payload enums with no empty cases
|
||||
//
|
||||
|
||||
|
||||
// -- MultiPayloadNoEmptyCases getEnumTag
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future24MultiPayloadNoEmptyCasesOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO*
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO* [[SELF]] to i64*
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
|
||||
|
||||
// -- The payload has no spare bits and there are no empty cases, so the tag
|
||||
// is entirely contained in the extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO, %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
|
||||
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, i1* [[EXTRA_TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i1 [[EXTRA_TAG_TMP]] to i32
|
||||
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]
|
||||
|
||||
// -- MultiPayloadNoEmptyCases destructiveProjectEnumData
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future24MultiPayloadNoEmptyCasesOwup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
// -- MultiPayloadNoEmptyCases destructiveInjectEnumTag
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future24MultiPayloadNoEmptyCasesOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO*
|
||||
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i1
|
||||
|
||||
// -- Store the tag in the extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO, %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
|
||||
// CHECK-NEXT: store i1 [[TAG]], i1* [[EXTRA_TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Multi-payload enum with empty payloads -- payload tag is not used
|
||||
//
|
||||
|
||||
|
||||
// -- MultiPayloadEmptyPayload getEnumTag
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future017MultiPayloadEmptyF0Owug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future017MultiPayloadEmptyF0O*
|
||||
|
||||
// -- Load the tag from the extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future017MultiPayloadEmptyF0O, %T27enum_value_semantics_future017MultiPayloadEmptyF0O* [[SELF]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, i8* [[EXTRA_TAG_ADDR]], align 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i8 [[EXTRA_TAG_TMP]] to i32
|
||||
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]
|
||||
|
||||
|
||||
// -- MultiPayloadEmptyPayload destructiveProjectEnumData
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future017MultiPayloadEmptyF0Owup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
// -- MultiPayloadEmptyPayload destructiveInjectEnumTag
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future017MultiPayloadEmptyF0Owui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future017MultiPayloadEmptyF0O*
|
||||
|
||||
// -- Store the tag in the extra tag area
|
||||
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future017MultiPayloadEmptyF0O, %T27enum_value_semantics_future017MultiPayloadEmptyF0O* [[SELF]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i8 [[TAG]], i8* [[EXTRA_TAG_ADDR]], align 1
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Multi-payload enum with non-POD payloads
|
||||
//
|
||||
|
||||
|
||||
// -- MultiPayloadNontrivial destroyBuffer
|
||||
// CHECK: define internal void @"$s27enum_value_semantics_future22MultiPayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivial)
|
||||
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T27enum_value_semantics_future22MultiPayloadNontrivialO*
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future22MultiPayloadNontrivialO* [[ADDR]] to { i64, i64 }*
|
||||
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
|
||||
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, i64* [[PAYLOAD_0_ADDR]], align 8
|
||||
// CHECK-NEXT: [[PAYLOAD_1_ADDR:%.*]] = getelementptr
|
||||
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, i64* [[PAYLOAD_1_ADDR]], align 8
|
||||
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %T27enum_value_semantics_future22MultiPayloadNontrivialO, %T27enum_value_semantics_future22MultiPayloadNontrivialO* %0, i32 0, i32 1
|
||||
// CHECK-NEXT: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
|
||||
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: @"$s27enum_value_semantics_future22MultiPayloadNontrivialOWOe"
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Multi-payload enum with generic layout -- spare bits are not used
|
||||
//
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future19MultiPayloadGenericOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadGenericO*
|
||||
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
|
||||
// CHECK-NEXT: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>")
|
||||
// CHECK-NEXT: ret i32 [[TAG]]
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future19MultiPayloadGenericOwup"
|
||||
// CHECK: ret void
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future19MultiPayloadGenericOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadGenericO*
|
||||
// CHECK: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
|
||||
// CHECK-NEXT: call void @swift_storeEnumTagMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>", i32 %tag)
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
//
|
||||
// Multi-payload enum with spare bits
|
||||
//
|
||||
|
||||
|
||||
// -- MultiPayloadNontrivialSpareBits destroyBuffer
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwxx"
|
||||
// CHECK-SAME: (%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivialSpareBits) {{.*}} {
|
||||
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO*
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[ADDR]] to { i64, i64 }*
|
||||
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
|
||||
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, i64* [[PAYLOAD_0_ADDR]], align 8
|
||||
// CHECK-NEXT: [[PAYLOAD_1_ADDR:%.*]] = getelementptr
|
||||
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, i64* [[PAYLOAD_1_ADDR]], align 8
|
||||
// CHECK: call void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOWOe"
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO*
|
||||
|
||||
// -- Load the payload
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
|
||||
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
|
||||
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
|
||||
|
||||
// -- Get the high bits of the tag from the spare bits
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP:%.*]] = lshr i64 [[SECOND]], 62
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP2:%.*]] = trunc i64 [[SPARE_TAG_TMP]] to i8
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP3:%.*]] = and i8 [[SPARE_TAG_TMP2]], 3
|
||||
// CHECK-NEXT: [[SPARE_TAG:%.*]] = zext i8 [[SPARE_TAG_TMP3]] to i32
|
||||
|
||||
// -- Get the low bits of the tag from the payload area
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = trunc i64 [[FIRST]] to i32
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = add i32 [[NO_PAYLOAD_TAG]], 3
|
||||
|
||||
// -- Check if we have a payload or not
|
||||
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 [[SPARE_TAG]], 3
|
||||
|
||||
// -- Return the tag
|
||||
// CHECK-NEXT: [[TAG:%.*]] = select i1 [[IS_PAYLOAD]], i32 [[NO_PAYLOAD_TAG2]], i32 [[SPARE_TAG]]
|
||||
// CHECK-NEXT: ret i32 [[TAG]]
|
||||
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwup"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*
|
||||
|
||||
// -- Load the payload
|
||||
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
|
||||
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
|
||||
|
||||
// -- Strip off spare bits
|
||||
// CHECK-NEXT: [[SECOND_PROJ:%.*]] = and i64 [[SECOND]], 4611686018427387903
|
||||
|
||||
// -- Store the payload
|
||||
// CHECK-NEXT: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*
|
||||
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i64 [[FIRST]], i64* [[FIRST_ADDR]], align 8
|
||||
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i64 [[SECOND_PROJ]], i64* [[SECOND_ADDR]], align 8
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO*
|
||||
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 3
|
||||
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
|
||||
|
||||
// CHECK: [[HAS_NO_PAYLOAD]]:
|
||||
|
||||
// -- Turn the case index into a no-payload case index
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = sub i32 %tag, 3
|
||||
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = zext i32 [[NO_PAYLOAD_TAG]] to i64
|
||||
|
||||
// -- Store the low bits of the tag into the payload
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
|
||||
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], i64* [[FIRST_ADDR]], align 8
|
||||
|
||||
// -- Store the high bits of the tag into the spare bits
|
||||
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
|
||||
// -- 0xc000000000000000
|
||||
// CHECK-NEXT: store i64 -4611686018427387904, i64* [[SECOND_ADDR]], align 8
|
||||
// CHECK-NEXT: br label %[[END:.*]]
|
||||
|
||||
// CHECK: [[HAS_PAYLOAD]]:
|
||||
|
||||
// -- Not really necessary
|
||||
// CHECK-NEXT: [[TAG_TMP:%.*]] = and i32 %tag, 3
|
||||
|
||||
// -- Load the payload
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
|
||||
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
|
||||
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
|
||||
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
|
||||
|
||||
// -- Mask off spare bits in the payload -- 0x00fffffffffffff8
|
||||
// CHECK-NEXT: [[SECOND_PROJ:%.*]] = and i64 [[SECOND]], 72057594037927928
|
||||
|
||||
// -- Store the low bits of the tag in the spare bits of the payload
|
||||
// CHECK-NEXT: [[TAG:%.*]] = zext i32 [[TAG_TMP]] to i64
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP2:%.*]] = shl i64 [[TAG]], 62
|
||||
|
||||
// -- Not really necessary -- 0xc000000000000000
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP:%.*]] = and i64 [[SPARE_TAG_TMP2]], -4611686018427387904
|
||||
|
||||
// -- Apply the new spare bits
|
||||
// CHECK-NEXT: [[SECOND_NEW:%.*]] = or i64 [[SPARE_TAG_TMP]], [[SECOND_PROJ]]
|
||||
|
||||
// -- Store the payload back
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
|
||||
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
|
||||
// CHECK-NEXT: store i64 [[FIRST]], i64* [[FIRST_ADDR]], align 8
|
||||
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
|
||||
// CHECK-NEXT: store i64 [[SECOND_NEW]], i64* [[SECOND_ADDR]], align 8
|
||||
// CHECK-NEXT: br label %[[END]]
|
||||
|
||||
// CHECK: [[END]]:
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0Owug"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O*
|
||||
|
||||
// -- Load the payload
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* [[SELF]] to i64*
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
|
||||
|
||||
// -- Load the load bits of the tag from the extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O, %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
|
||||
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, i1* [[EXTRA_TAG_ADDR]], align 8
|
||||
|
||||
// -- Load the high bits of the tag from the spare bits area
|
||||
// CHECK-NEXT: [[SPARE_BITS_TMP2:%.*]] = lshr i64 [[PAYLOAD]], 63
|
||||
// CHECK-NEXT: [[SPARE_BITS_TMP:%.*]] = trunc i64 [[SPARE_BITS_TMP2]] to i8
|
||||
// CHECK-NEXT: [[SPARE_BITS:%.*]] = and i8 [[SPARE_BITS_TMP]], 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i1 [[EXTRA_TAG_TMP]] to i8
|
||||
|
||||
// -- Combine high bits and low bits to form tag
|
||||
// CHECK-NEXT: [[TAG_TMP:%.*]] = shl i8 [[EXTRA_TAG]], 1
|
||||
// CHECK-NEXT: [[TAG:%.*]] = or i8 [[SPARE_BITS]], [[TAG_TMP]]
|
||||
// CHECK-NEXT: [[RESULT:%.*]] = zext i8 [[TAG]] to i32
|
||||
// CHECK-NEXT: ret i32 [[RESULT]]
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0Owup"
|
||||
// CHECK: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
|
||||
// -- 0x7fffffffffffffff
|
||||
// CHECK-NEXT: [[PAYLOAD_PROJ:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
|
||||
// CHECK-NEXT: store i64 [[PAYLOAD_PROJ]], i64* [[PAYLOAD_ADDR]], align 8
|
||||
// CHECK-NEXT: ret void
|
||||
|
||||
|
||||
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0Owui"
|
||||
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O*
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP3:%.*]] = and i32 %tag, 1
|
||||
|
||||
// -- Load the payload
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* %0 to i64*
|
||||
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
|
||||
|
||||
// -- Mask off the spare bits
|
||||
// -- 0x7fffffffffffffff
|
||||
// CHECK-NEXT: [[PAYLOAD_PROJ:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
|
||||
|
||||
// -- Store low bits of tag in spare bits area
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP2:%.*]] = zext i32 [[SPARE_TAG_TMP3]] to i64
|
||||
// CHECK-NEXT: [[SPARE_TAG_TMP:%.*]] = shl i64 [[SPARE_TAG_TMP2]], 63
|
||||
// -- 0x8000000000000000
|
||||
// CHECK-NEXT: [[SPARE_TAG:%.*]] = and i64 [[SPARE_TAG_TMP:%.*]], -9223372036854775808
|
||||
// CHECK-NEXT: [[PAYLOAD_NEW:%.*]] = or i64 [[SPARE_TAG]], [[PAYLOAD_PROJ]]
|
||||
|
||||
// -- Store the payload
|
||||
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* %0 to i64*
|
||||
// CHECK-NEXT: store i64 [[PAYLOAD_NEW]], i64* [[PAYLOAD_ADDR]], align 8
|
||||
|
||||
// -- Store high bits of tag in extra tag area
|
||||
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = lshr i32 %tag, 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = trunc i32 [[EXTRA_TAG_TMP]] to i1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O, %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* [[SELF]], i32 0, i32 1
|
||||
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
|
||||
// CHECK-NEXT: store i1 [[EXTRA_TAG]], i1* [[EXTRA_TAG_ADDR]], align 8
|
||||
// CHECK-NEXT: ret void
|
||||
@@ -0,0 +1,2 @@
|
||||
public protocol P {
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
@frozen
|
||||
public struct Integer {
|
||||
public let value: Int
|
||||
|
||||
public init(_ value: Int) {
|
||||
self.value = value
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
public struct Integer {
|
||||
public let value: Int
|
||||
|
||||
public init(_ value: Int) {
|
||||
self.value = value
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5Value[[UNIQUE_ID_1:[0-9A-Z_]+]]OySiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5Value[[UNIQUE_ID_1]]OySiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5Value[[UNIQUE_ID_1]]OMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
fileprivate enum Value<First> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5Value[[UNIQUE_ID_1]]OySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define internal swiftcc %swift.metadata_response @"$s4main5Value[[UNIQUE_ID_1]]OMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_LABEL]]:
|
||||
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE]]
|
||||
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5Value[[UNIQUE_ID_1]]OySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE]], i8* undef, i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5Value[[UNIQUE_ID_1]]OMn" to %swift.type_descriptor*)) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,95 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main9NamespaceC5ValueOySi_GMf" = internal constant <{
|
||||
// CHECk-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: }> <{
|
||||
// i8** getelementptr inbounds (
|
||||
// %swift.enum_vwtable,
|
||||
// %swift.enum_vwtable* @"$s4main9NamespaceC5ValueOySi_GWV",
|
||||
// i32 0,
|
||||
// i32 0
|
||||
// ),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceC5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
|
||||
final class Namespace<First> {
|
||||
enum Value {
|
||||
case first(First)
|
||||
}
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueOySi_GMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace.Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main9NamespaceC5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_1]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueOySi_GMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE_1]], i8* undef, i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceC5ValueOMn" to %swift.type_descriptor*)) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,40 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
enum Value<First> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,97 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
|
||||
|
||||
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOySiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i8** getelementptr inbounds ([1 x i8*], [1 x i8*]* @"$sSi4main1PAAWP", i32 0, i32 0),
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
protocol P {}
|
||||
extension Int : P {}
|
||||
enum Value<First : P> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, i8** %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TABLE:%[0-9]+]] = bitcast i8** %2 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_LABEL]]:
|
||||
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE]]
|
||||
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE]], i8* [[ERASED_TABLE]], i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*))
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,71 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
|
||||
// RUN: %target-build-swift -emit-library -module-name TestModule -module-link-name TestModule %S/Inputs/protocol-public.swift -emit-module-interface -swift-version 5 -o %t/%target-library-name(TestModule)
|
||||
// RUN: %target-swift-frontend -target %module-target-future -emit-ir -I %t -L %t %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
import TestModule
|
||||
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
|
||||
|
||||
// CHECK-NOT: @"$s4main5ValueOySiGMf"
|
||||
|
||||
extension Int : P {}
|
||||
enum Value<First : P> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS2i10TestModule1PAAyHCg_GMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, i8** %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TABLE:%[0-9]+]] = bitcast i8** %2 to i8*
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE]],
|
||||
// CHECK-SAME: i8* [[ERASED_TABLE]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: )
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,57 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
|
||||
// RUN: %target-build-swift -enable-library-evolution -emit-library -module-name TestModule -module-link-name TestModule %S/Inputs/protocol-public.swift -emit-module-interface -swift-version 5 -o %t/%target-library-name(TestModule)
|
||||
// RUN: %target-swift-frontend -target %module-target-future -emit-ir -I %t -L %t %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
import TestModule
|
||||
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
|
||||
|
||||
// CHECK-NOT: @"$s4main5ValueOySiGMf"
|
||||
|
||||
extension Int : P {}
|
||||
enum Value<First : P> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: [[DEMANGLED_TYPE:%[0-9]+]] = call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s4main5ValueOyS2i10TestModule1PAAyHCg_GMD") #{{[0-9]+}}
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* [[DEMANGLED_TYPE]]
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, i8** %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TABLE:%[0-9]+]] = bitcast i8** %2 to i8*
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE]],
|
||||
// CHECK-SAME: i8* [[ERASED_TABLE]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: )
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,97 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$sytN" = external{{( dllimport)?}} global %swift.full_type
|
||||
|
||||
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOySiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i8** getelementptr inbounds ([1 x i8*], [1 x i8*]* @"$sSi4main1PAAWP", i32 0, i32 0),
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
public protocol P {}
|
||||
extension Int : P {}
|
||||
enum Value<First : P> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, i8** %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TABLE:%[0-9]+]] = bitcast i8** %2 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_LABEL]]:
|
||||
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE]]
|
||||
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE]], i8* [[ERASED_TABLE]], i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*))
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,44 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK-NOT: @"$s4main5ValueOyAA7IntegerVGMf"
|
||||
enum Value<First : Equatable> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
struct Integer : Equatable {
|
||||
let value: Int
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
func doit() {
|
||||
consume( Value.first(Integer(value: 13)) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, i8** %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_CONFORMANCE:%[0-9]+]] = bitcast i8** %2 to i8*
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE]],
|
||||
// CHECK-SAME: i8* [[ERASED_CONFORMANCE]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i32, i32, i32 }>* @"$s4main5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,101 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5OuterOyAA5InnerVySiGGWV" = linkonce_odr hidden constant %swift.enum_vwtable
|
||||
// CHECK: @"$s4main5OuterOyAA5InnerVySiGGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.enum_vwtable,
|
||||
// CHECK-SAME: %swift.enum_vwtable* @"$s4main5OuterOyAA5InnerVySiGGWV",
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 0
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5OuterOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i32,
|
||||
// CHECK-SAME: {{(\[4 x i8\],)?}}
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5InnerVySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
enum Outer<First> {
|
||||
case first(First)
|
||||
}
|
||||
|
||||
struct Inner<First> {
|
||||
let first: First
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5OuterOyAA5InnerVySiGGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Outer.first(Inner(first: 13)) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5OuterOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main5OuterOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,78 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5ValueOySiGWV" = linkonce_odr hidden constant %swift.enum_vwtable {
|
||||
// CHECK-SAME: i8* bitcast ({{(%swift.opaque\* \(\[[0-9]+ x i8\]\*, \[[0-9]+ x i8\]\*, %swift.type\*\)\* @"\$[a-zA-Z0-9_]+" to i8\*|i8\* \(i8\*, i8\*, %swift.type\*\)\* @__swift_memcpy[0-9]+_[0-9]+ to i8\*)}}),
|
||||
// CHECK-SAME: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOySiGwet" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s4main5ValueOySiGwst" to i8*),
|
||||
// CHECK-SAME: [[INT]] [[ALIGNMENT]],
|
||||
// CHECK-SAME: [[INT]] [[ALIGNMENT]],
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i32 0, i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s4main5ValueOySiGwug" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4main5ValueOySiGwup" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOySiGwui" to i8*)
|
||||
// CHECK-SAME: }, align [[ALIGNMENT]]
|
||||
// CHECK: @"$s4main5ValueOySiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOySiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
enum Value<First> {
|
||||
case only(First)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, i64 }>* @"$s4main5ValueOySiGMf" to %swift.full_type*), i32 0, i32 1)
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.only(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_LABEL]]:
|
||||
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE]]
|
||||
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED]]:
|
||||
// CHECK: ret %swift.metadata_response { %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, i64 }>* @"$s4main5ValueOySiGMf" to %swift.full_type*), i32 0, i32 1), [[INT]] 0 }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* %2,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,111 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main9NamespaceC5ValueOySS_SiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main9NamespaceC5ValueOySS_SiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceC5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* @"$sSSN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
final class Namespace<Arg> {
|
||||
enum Value<First> {
|
||||
case first(First)
|
||||
}
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueOySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace<String>.Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main9NamespaceC5ValueOMa"([[INT]] %0, %swift.type* %1, %swift.type* %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TYPE_2:%[0-9]+]] = bitcast %swift.type* %2 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSSN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueOySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceC5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,111 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main9NamespaceO5ValueOySS_SiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main9NamespaceO5ValueOySS_SiGWV", i32 0, i32 0)
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceO5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* @"$sSSN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
enum Namespace<Arg> {
|
||||
enum Value<First> {
|
||||
case first(First)
|
||||
}
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceO5ValueOySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace<String>.Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main9NamespaceO5ValueOMa"([[INT]] %0, %swift.type* %1, %swift.type* %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TYPE_2:%[0-9]+]] = bitcast %swift.type* %2 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSSN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceO5ValueOySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceO5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,110 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main9NamespaceV5ValueOySS_SiGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main9NamespaceV5ValueOySS_SiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceV5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* @"$sSSN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
struct Namespace<Arg> {
|
||||
enum Value<First> {
|
||||
case first(First)
|
||||
}
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceV5ValueOySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace<String>.Value.first(13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main9NamespaceV5ValueOMa"([[INT]] %0, %swift.type* %1, %swift.type* %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TYPE_2:%[0-9]+]] = bitcast %swift.type* %2 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSSN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*, %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceV5ValueOySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceV5ValueOMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,118 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5ValueOyS2iGWV" = linkonce_odr hidden constant %swift.enum_vwtable {
|
||||
// CHECK-SAME: i8* bitcast ({{(%swift.opaque\* \(\[[0-9]+ x i8\]\*, \[[0-9]+ x i8\]\*, %swift.type\*\)\* @"\$[a-zA-Z0-9_]+" to i8\*|i8\* \(i8\*, i8\*, %swift.type\*\)\* @__swift_memcpy[0-9]+_[0-9]+ to i8\*)}}),
|
||||
// CHECK-SAME: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS2iGwet" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s4main5ValueOyS2iGwst" to i8*),
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS2iGwug" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS2iGwup" to i8*),
|
||||
// CHECK-SAME i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS2iGwui" to i8*)
|
||||
// CHECK-SAME: }, align [[ALIGNMENT]]
|
||||
// CHECK: @"$s4main5ValueOyS2iGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOyS2iGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: [[INT]] {{16|8}},
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
enum Value<First, Second> {
|
||||
case first(First)
|
||||
case second(First, Second)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS2iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.second(13, 13) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, %swift.type* %2) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TYPE_2:%[0-9]+]] = bitcast %swift.type* %2 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*, %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS2iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,127 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5ValueOyS3iGWV" = linkonce_odr hidden constant %swift.enum_vwtable {
|
||||
// CHECK-SAME: i8* bitcast ({{(%swift.opaque\* \(\[[0-9]+ x i8\]\*, \[[0-9]+ x i8\]\*, %swift.type\*\)\* @"\$[a-zA-Z0-9_]+" to i8\*|i8\* \(i8\*, i8\*, %swift.type\*\)\* @__swift_memcpy[0-9]+_[0-9]+ to i8\*)}}),
|
||||
// CHECK-SAME: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS3iGwet" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s4main5ValueOyS3iGwst" to i8*),
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS3iGwug" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS3iGwup" to i8*),
|
||||
// CHECK-SAME i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS3iGwui" to i8*)
|
||||
// CHECK-SAME: }, align [[ALIGNMENT]]
|
||||
// CHECK: @"$s4main5ValueOyS3iGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOyS3iGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: [[INT]] {{24|12}},
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
enum Value<First, Second, Third> {
|
||||
case first(First)
|
||||
case second(First, Second)
|
||||
case third(First, Second, Third)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture {{%[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS3iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.third(13, 14, 15) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1, %swift.type* %2, %swift.type* %3) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE_1:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: [[ERASED_TYPE_2:%[0-9]+]] = bitcast %swift.type* %2 to i8*
|
||||
// CHECK: [[ERASED_TYPE_3:%[0-9]+]] = bitcast %swift.type* %3 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: [[EQUAL_TYPE_1_3:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_3]]
|
||||
// CHECK: [[EQUAL_TYPES_1_3:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_2]], [[EQUAL_TYPE_1_3]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_3]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS3iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_3]],
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,137 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5ValueOyS4iGWV" = linkonce_odr hidden constant %swift.enum_vwtable {
|
||||
// CHECK-SAME: i8* bitcast ({{(%swift.opaque\* \(\[[0-9]+ x i8\]\*, \[[0-9]+ x i8\]\*, %swift.type\*\)\* @"\$[a-zA-Z0-9_]+" to i8\*|i8\* \(i8\*, i8\*, %swift.type\*\)\* @__swift_memcpy[0-9]+_[0-9]+ to i8\*)}}),
|
||||
// CHECK-SAME: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS4iGwet" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s4main5ValueOyS4iGwst" to i8*),
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS4iGwug" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS4iGwup" to i8*),
|
||||
// CHECK-SAME i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS4iGwui" to i8*)
|
||||
// CHECK-SAME: }, align [[ALIGNMENT]]
|
||||
// CHECK: @"$s4main5ValueOyS4iGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOyS4iGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: [[INT]] {{32|16}},
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
enum Value<First, Second, Third, Fourth> {
|
||||
case first(First)
|
||||
case second(First, Second)
|
||||
case third(First, Second, Third)
|
||||
case fourth(First, Second, Third, Fourth)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture {{%[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS4iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.fourth(13, 14, 15, 16) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, i8** %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_BUFFER:%[0-9]+]] = bitcast i8** %1 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_1:%[0-9]+]] = getelementptr i8*, i8** %1, i64 0
|
||||
// CHECK: [[ERASED_TYPE_1:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_2:%[0-9]+]] = getelementptr i8*, i8** %1, i64 1
|
||||
// CHECK: [[ERASED_TYPE_2:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_2]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_3:%[0-9]+]] = getelementptr i8*, i8** %1, i64 2
|
||||
// CHECK: [[ERASED_TYPE_3:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_3]]
|
||||
// CHECK: [[EQUAL_TYPE_1_3:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_3]]
|
||||
// CHECK: [[EQUAL_TYPES_1_3:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_2]], [[EQUAL_TYPE_1_3]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_4:%[0-9]+]] = getelementptr i8*, i8** %1, i64 3
|
||||
// CHECK: [[ERASED_TYPE_4:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_4]]
|
||||
// CHECK: [[EQUAL_TYPE_1_4:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_4]]
|
||||
// CHECK: [[EQUAL_TYPES_1_4:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_3]], [[EQUAL_TYPE_1_4]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_4]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS4iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @swift_getGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_BUFFER]],
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,141 @@
|
||||
// RUN: %swift -target %module-target-future -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK: @"$s4main5ValueOyS5iGWV" = linkonce_odr hidden constant %swift.enum_vwtable {
|
||||
// CHECK-SAME: i8* bitcast ({{(%swift.opaque\* \(\[[0-9]+ x i8\]\*, \[[0-9]+ x i8\]\*, %swift.type\*\)\* @"\$[a-zA-Z0-9_]+" to i8\*|i8\* \(i8\*, i8\*, %swift.type\*\)\* @__swift_memcpy[0-9]+_[0-9]+ to i8\*)}}),
|
||||
// CHECK-SAME: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy{{[0-9]+}}_{{[0-9]+}} to i8*),
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS5iGwet" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s4main5ValueOyS5iGwst" to i8*),
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: [[INT]] {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i32 {{[0-9]+}},
|
||||
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS5iGwug" to i8*),
|
||||
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4main5ValueOyS5iGwup" to i8*),
|
||||
// CHECK-SAME i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4main5ValueOyS5iGwui" to i8*)
|
||||
// CHECK-SAME: }, align [[ALIGNMENT]]
|
||||
// CHECK: @"$s4main5ValueOyS5iGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }> <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOyS5iGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: [[INT]] {{40|20}},
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
enum Value<First, Second, Third, Fourth, Fifth> {
|
||||
case first(First)
|
||||
case second(First, Second)
|
||||
case third(First, Second, Third)
|
||||
case fourth(First, Second, Third, Fourth)
|
||||
case fifth(First, Second, Third, Fourth, Fifth)
|
||||
}
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture {{%[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS5iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.fifth(13, 14, 15, 16, 17) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, i8** %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_BUFFER:%[0-9]+]] = bitcast i8** %1 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_1:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_1]]:
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_1:%[0-9]+]] = getelementptr i8*, i8** %1, i64 0
|
||||
// CHECK: [[ERASED_TYPE_1:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_1]]
|
||||
// CHECK: [[EQUAL_TYPE_1_1:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_1]]
|
||||
// CHECK: [[EQUAL_TYPES_1_1:%[0-9]+]] = and i1 true, [[EQUAL_TYPE_1_1]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_2:%[0-9]+]] = getelementptr i8*, i8** %1, i64 1
|
||||
// CHECK: [[ERASED_TYPE_2:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_2]]
|
||||
// CHECK: [[EQUAL_TYPE_1_2:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_2]]
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_3:%[0-9]+]] = getelementptr i8*, i8** %1, i64 2
|
||||
// CHECK: [[ERASED_TYPE_3:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_3]]
|
||||
// CHECK: [[EQUAL_TYPE_1_3:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_3]]
|
||||
// CHECK: [[EQUAL_TYPES_1_3:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_2]], [[EQUAL_TYPE_1_3]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_4:%[0-9]+]] = getelementptr i8*, i8** %1, i64 3
|
||||
// CHECK: [[ERASED_TYPE_4:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_4]]
|
||||
// CHECK: [[EQUAL_TYPE_1_4:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_4]]
|
||||
// CHECK: [[EQUAL_TYPES_1_4:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_3]], [[EQUAL_TYPE_1_4]]
|
||||
// CHECK: [[ERASED_TYPE_ADDRESS_5:%[0-9]+]] = getelementptr i8*, i8** %1, i64 4
|
||||
// CHECK: [[ERASED_TYPE_5:%\".*\"]] = load i8*, i8** [[ERASED_TYPE_ADDRESS_5]]
|
||||
// CHECK: [[EQUAL_TYPE_1_5:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$sSiN" to i8*), [[ERASED_TYPE_5]]
|
||||
// CHECK: [[EQUAL_TYPES_1_5:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_4]], [[EQUAL_TYPE_1_5]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_5]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOyS5iGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @swift_getGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_BUFFER]],
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,100 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
|
||||
// RUN: %target-build-swift -enable-library-evolution -emit-library -module-name TestModule -module-link-name TestModule %S/Inputs/struct-public-frozen-0argument.swift -emit-module-interface -swift-version 5 -o %t/%target-library-name(TestModule)
|
||||
// RUN: %target-swift-frontend -target %module-target-future -emit-ir -I %t -L %t %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
import TestModule
|
||||
|
||||
// CHECK: @"$s4main5ValueOy10TestModule7IntegerVGMf" = internal constant <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s4main5ValueOy10TestModule7IntegerVGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 513,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type* @"$s10TestModule7IntegerVN",
|
||||
// CHECK-SAME: i64 3
|
||||
// CHECK-SAME: }>, align [[ALIGNMENT]]
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
enum Value<First> {
|
||||
case only(First)
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOy10TestModule7IntegerVGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.only(Integer(13)) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: br label %[[TYPE_COMPARISON_LABEL:[0-9]+]]
|
||||
// CHECK: [[TYPE_COMPARISON_LABEL]]:
|
||||
// CHECK: [[EQUAL_TYPE:%[0-9]+]] = icmp eq i8* bitcast (%swift.type* @"$s10TestModule7IntegerVN" to i8*), [[ERASED_TYPE]]
|
||||
// CHECK: [[EQUAL_TYPES:%[0-9]+]] = and i1 true, [[EQUAL_TYPE]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES]], label %[[EXIT_PRESPECIALIZED:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED]]:
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main5ValueOy10TestModule7IntegerVGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* %2,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -0,0 +1,48 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
|
||||
// RUN: %target-build-swift -enable-library-evolution -emit-library -module-name TestModule -module-link-name TestModule %S/Inputs/struct-public-nonfrozen-0argument.swift -emit-module-interface -swift-version 5 -o %t/%target-library-name(TestModule)
|
||||
// RUN: %target-swift-frontend -target %module-target-future -emit-ir -I %t -L %t %s | %FileCheck %s -DINT=i%target-ptrsize -DALIGNMENT=%target-alignment
|
||||
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
import TestModule
|
||||
|
||||
// CHECK-NOT: @"$s4main5ValueOy10TestModule7IntegerVGMf"
|
||||
|
||||
@inline(never)
|
||||
func consume<T>(_ t: T) {
|
||||
withExtendedLifetime(t) { t in
|
||||
}
|
||||
}
|
||||
|
||||
enum Value<First> {
|
||||
case only(First)
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: [[DEMANGLED_TYPE:%[0-9]+]] = call %swift.type* @__swift_instantiateConcreteTypeFromMangledName({ i32, i32 }* @"$s4main5ValueOy10TestModule7IntegerVGMD") #{{[0-9]+}}
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* [[DEMANGLED_TYPE]]
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Value.only(Integer(13)) )
|
||||
}
|
||||
doit()
|
||||
|
||||
// CHECK: ; Function Attrs: noinline nounwind readnone
|
||||
// CHECK: define hidden swiftcc %swift.metadata_response @"$s4main5ValueOMa"([[INT]] %0, %swift.type* %1) #{{[0-9]+}} {
|
||||
// CHECK: entry:
|
||||
// CHECK: [[ERASED_TYPE:%[0-9]+]] = bitcast %swift.type* %1 to i8*
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main5ValueOMn" to %swift.type_descriptor*)
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
@@ -6,11 +6,11 @@
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
|
||||
// CHECK-NOT: @"$s4main5ValueVyAA7IntegerVGMf"
|
||||
struct Value<First : Hashable> {
|
||||
struct Value<First : Equatable> {
|
||||
let first: First
|
||||
}
|
||||
|
||||
struct Integer : Hashable {
|
||||
struct Integer : Equatable {
|
||||
let value: Int
|
||||
}
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
// i8** @"$sB[[INT]]_WV",
|
||||
// i8** getelementptr inbounds (%swift.vwtable, %swift.vwtable* @"$s4main9NamespaceC5ValueVySS_SiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 512,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceC5ValueVMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceC5ValueVMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* @"$sSSN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i32 0{{(, \[4 x i8\] zeroinitializer)?}},
|
||||
@@ -37,7 +41,26 @@ func consume<T>(_ t: T) {
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(%swift.opaque* noalias nocapture %{{[0-9]+}}, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, %swift.type*, i32{{(, \[4 x i8\])?}}, i64 }>* @"$s4main9NamespaceC5ValueVySS_SiGMf" to %swift.full_type*), i32 0, i32 1))
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i32{{(, \[4 x i8\])?}},
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueVySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace<String>.Value(first: 13) )
|
||||
@@ -57,8 +80,37 @@ doit()
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response { %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, %swift.type*, i32{{(, \[4 x i8\])?}}, i64 }>* @"$s4main9NamespaceC5ValueVySS_SiGMf" to %swift.full_type*), i32 0, i32 1), [[INT]] 0 }
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i32{{(, \[4 x i8\])?}},
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceC5ValueVySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE_1]], i8* [[ERASED_TYPE_2]], i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceC5ValueVMn" to %swift.type_descriptor*)) #{{[0-9]+}}
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceC5ValueVMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
// i8** @"$sB[[INT]]_WV",
|
||||
// i8** getelementptr inbounds (%swift.vwtable, %swift.vwtable* @"$s4main9NamespaceO5ValueVySS_SiGWV", i32 0, i32 0)
|
||||
// CHECK-SAME: [[INT]] 512,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceO5ValueVMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceO5ValueVMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* @"$sSSN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i32 0{{(, \[4 x i8\] zeroinitializer)?}},
|
||||
@@ -37,7 +41,26 @@ func consume<T>(_ t: T) {
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(%swift.opaque* noalias nocapture %{{[0-9]+}}, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, %swift.type*, i32{{(, \[4 x i8\])?}}, i64 }>* @"$s4main9NamespaceO5ValueVySS_SiGMf" to %swift.full_type*), i32 0, i32 1))
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i32{{(, \[4 x i8\])?}},
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceO5ValueVySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace<String>.Value(first: 13) )
|
||||
@@ -57,8 +80,37 @@ doit()
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response { %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, %swift.type*, i32{{(, \[4 x i8\])?}}, i64 }>* @"$s4main9NamespaceO5ValueVySS_SiGMf" to %swift.full_type*), i32 0, i32 1), [[INT]] 0 }
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i32{{(, \[4 x i8\])?}},
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceO5ValueVySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE_1]], i8* [[ERASED_TYPE_2]], i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceO5ValueVMn" to %swift.type_descriptor*)) #{{[0-9]+}}
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceO5ValueVMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
// i8** @"$sB[[INT]]_WV",
|
||||
// i8** getelementptr inbounds (%swift.vwtable, %swift.vwtable* @"$s4main9NamespaceV5ValueVySS_SiGWV", i32 0, i32 0),
|
||||
// CHECK-SAME: [[INT]] 512,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceV5ValueVMn" to %swift.type_descriptor*),
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceV5ValueVMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: %swift.type* @"$sSSN",
|
||||
// CHECK-SAME: %swift.type* @"$sSiN",
|
||||
// CHECK-SAME: i32 0{{(, \[4 x i8\] zeroinitializer)?}},
|
||||
@@ -37,7 +41,26 @@ func consume<T>(_ t: T) {
|
||||
}
|
||||
|
||||
// CHECK: define hidden swiftcc void @"$s4main4doityyF"() #{{[0-9]+}} {
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(%swift.opaque* noalias nocapture %{{[0-9]+}}, %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, %swift.type*, i32{{(, \[4 x i8\])?}}, i64 }>* @"$s4main9NamespaceV5ValueVySS_SiGMf" to %swift.full_type*), i32 0, i32 1))
|
||||
// CHECK: call swiftcc void @"$s4main7consumeyyxlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture %{{[0-9]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: i32{{(, \[4 x i8\])?}},
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceV5ValueVySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: )
|
||||
// CHECK: }
|
||||
func doit() {
|
||||
consume( Namespace<String>.Value(first: 13) )
|
||||
@@ -57,8 +80,36 @@ doit()
|
||||
// CHECK: [[EQUAL_TYPES_1_2:%[0-9]+]] = and i1 [[EQUAL_TYPES_1_1]], [[EQUAL_TYPE_1_2]]
|
||||
// CHECK: br i1 [[EQUAL_TYPES_1_2]], label %[[EXIT_PRESPECIALIZED_1:[0-9]+]], label %[[EXIT_NORMAL:[0-9]+]]
|
||||
// CHECK: [[EXIT_PRESPECIALIZED_1]]:
|
||||
// CHECK: ret %swift.metadata_response { %swift.type* getelementptr inbounds (%swift.full_type, %swift.full_type* bitcast (<{ i8**, [[INT]], %swift.type_descriptor*, %swift.type*, %swift.type*, i32{{(, \[4 x i8\])?}}, i64 }>* @"$s4main9NamespaceV5ValueVySS_SiGMf" to %swift.full_type*), i32 0, i32 1), [[INT]] 0 }
|
||||
// CHECK: ret %swift.metadata_response {
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*, %swift.type*,
|
||||
// CHECK-SAME: i32{{(, \[4 x i8\])?}},
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s4main9NamespaceV5ValueVySS_SiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: [[INT]] 0
|
||||
// CHECK-SAME: }
|
||||
// CHECK: [[EXIT_NORMAL]]:
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata([[INT]] %0, i8* [[ERASED_TYPE_1]], i8* [[ERASED_TYPE_2]], i8* undef, %swift.type_descriptor* bitcast (<{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>* @"$s4main9NamespaceV5ValueVMn" to %swift.type_descriptor*)) #{{[0-9]+}}
|
||||
// CHECK: {{%[0-9]+}} = call swiftcc %swift.metadata_response @__swift_instantiateGenericMetadata(
|
||||
// CHECK-SAME: [[INT]] %0,
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_1]],
|
||||
// CHECK-SAME: i8* [[ERASED_TYPE_2]],
|
||||
// CHECK-SAME: i8* undef,
|
||||
// CHECK-SAME: %swift.type_descriptor* bitcast (
|
||||
// CHECK-SAME: <{ i32, i32, i32, i32, i32, i32, i32, i32, i32, i16, i16, i16, i16, i8, i8, i8, i8 }>*
|
||||
// CHECK-SAME: @"$s4main9NamespaceV5ValueVMn"
|
||||
// CHECK-SAME: to %swift.type_descriptor*
|
||||
// CHECK-SAME: )
|
||||
// CHECK-SAME: ) #{{[0-9]+}}
|
||||
// CHECK: ret %swift.metadata_response {{%[0-9]+}}
|
||||
// CHECK: }
|
||||
|
||||
@@ -62,7 +62,26 @@ public func equality() {
|
||||
// CHECK-SAME: )
|
||||
doEquality(Struct(x: 1))
|
||||
// CHECK: [[Enum_Equatable:%.*]] = call i8** @"$s30synthesized_conformance_future4EnumOySiGACyxGSQAASQRzlWl"()
|
||||
// CHECK-NEXT: call swiftcc void @"$s30synthesized_conformance_future10doEqualityyyxSQRzlF"(%swift.opaque* noalias nocapture {{%.*}}, %swift.type* {{%.*}}, i8** [[Enum_Equatable]])
|
||||
// CHECK-NEXT: call swiftcc void @"$s30synthesized_conformance_future10doEqualityyyxSQRzlF"(
|
||||
// CHECK-SAME: %swift.opaque* noalias nocapture {{%[^,]+}},
|
||||
// CHECK-SAME: %swift.type* getelementptr inbounds (
|
||||
// CHECK-SAME: %swift.full_type,
|
||||
// CHECK-SAME: %swift.full_type* bitcast (
|
||||
// CHECK-SAME: <{
|
||||
// CHECK-SAME: i8**,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: %swift.type_descriptor*,
|
||||
// CHECK-SAME: %swift.type*,
|
||||
// CHECK-SAME: [[INT]],
|
||||
// CHECK-SAME: i64
|
||||
// CHECK-SAME: }>* @"$s30synthesized_conformance_future4EnumOySiGMf"
|
||||
// CHECK-SAME: to %swift.full_type*
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i32 0,
|
||||
// CHECK-SAME: i32 1
|
||||
// CHECK-SAME: ),
|
||||
// CHECK-SAME: i8** [[Enum_Equatable]]
|
||||
// CHECK-SAME: )
|
||||
doEquality(Enum.a(1))
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
// RUN: %target-run-simple-swift -target %module-target-future
|
||||
// REQUIRES: executable_test
|
||||
|
||||
import StdlibUnittest
|
||||
|
||||
enum Token: Hashable {
|
||||
case string(String)
|
||||
case number(Int)
|
||||
case comma
|
||||
case colon
|
||||
}
|
||||
|
||||
enum Combo<T: Hashable, U: Hashable>: Hashable {
|
||||
case none
|
||||
case first(T)
|
||||
case second(U)
|
||||
case both(T, U)
|
||||
}
|
||||
|
||||
var EnumSynthesisTests = TestSuite("EnumSynthesis")
|
||||
|
||||
EnumSynthesisTests.test("BasicEquatability/Hashability") {
|
||||
checkHashable([
|
||||
Token.string("foo"),
|
||||
Token.number(10),
|
||||
Token.comma,
|
||||
Token.colon,
|
||||
], equalityOracle: { $0 == $1 })
|
||||
}
|
||||
|
||||
// Not guaranteed by the semantics of Hashable, but we sanity check that the
|
||||
// synthesized hash function is good enough to not let nearby values collide.
|
||||
EnumSynthesisTests.test("CloseValuesDoNotCollide") {
|
||||
expectNotEqual(Token.string("foo").hashValue, Token.string("goo").hashValue)
|
||||
expectNotEqual(Token.number(10).hashValue, Token.number(11).hashValue)
|
||||
}
|
||||
|
||||
EnumSynthesisTests.test("GenericEquatability/Hashability") {
|
||||
checkHashable([
|
||||
Combo<String, Int>.none,
|
||||
Combo<String, Int>.first("a"),
|
||||
Combo<String, Int>.second(5),
|
||||
Combo<String, Int>.both("foo", 5),
|
||||
], equalityOracle: { $0 == $1 })
|
||||
}
|
||||
|
||||
EnumSynthesisTests.test("CloseGenericValuesDoNotCollide") {
|
||||
expectNotEqual(Combo<String, Int>.first("foo").hashValue, Combo<String, Int>.first("goo").hashValue)
|
||||
expectNotEqual(Combo<String, Int>.second(3).hashValue, Combo<String, Int>.second(4).hashValue)
|
||||
expectNotEqual(Combo<String, Int>.both("foo", 3).hashValue, Combo<String, Int>.both("goo", 3).hashValue)
|
||||
expectNotEqual(Combo<String, Int>.both("foo", 3).hashValue, Combo<String, Int>.both("foo", 4).hashValue)
|
||||
expectNotEqual(Combo<String, Int>.both("foo", 3).hashValue, Combo<String, Int>.both("goo", 4).hashValue)
|
||||
}
|
||||
|
||||
func hashEncode(_ body: (inout Hasher) -> ()) -> Int {
|
||||
var hasher = Hasher()
|
||||
body(&hasher)
|
||||
return hasher.finalize()
|
||||
}
|
||||
|
||||
// Make sure that if the user overrides the synthesized member, that one gets
|
||||
// used instead.
|
||||
enum Overrides: Hashable {
|
||||
case a(Int), b(String)
|
||||
var hashValue: Int { return 2 }
|
||||
func hash(into hasher: inout Hasher) {
|
||||
hasher.combine(2)
|
||||
}
|
||||
static func == (lhs: Overrides, rhs: Overrides) -> Bool { return true }
|
||||
}
|
||||
|
||||
EnumSynthesisTests.test("ExplicitOverridesSynthesized") {
|
||||
checkHashable(expectedEqual: true, Overrides.a(4), .b("foo"))
|
||||
expectEqual(Overrides.a(4).hashValue, 2)
|
||||
expectEqual(
|
||||
hashEncode { $0.combine(Overrides.a(4)) },
|
||||
hashEncode { $0.combine(2) })
|
||||
}
|
||||
|
||||
// ...even in an extension.
|
||||
enum OverridesInExtension: Hashable {
|
||||
case a(Int), b(String)
|
||||
}
|
||||
extension OverridesInExtension {
|
||||
var hashValue: Int { return 2 }
|
||||
func hash(into hasher: inout Hasher) {
|
||||
hasher.combine(2)
|
||||
}
|
||||
static func == (lhs: OverridesInExtension, rhs: OverridesInExtension) -> Bool { return true }
|
||||
}
|
||||
|
||||
EnumSynthesisTests.test("ExplicitOverridesSynthesizedInExtension") {
|
||||
checkHashable(expectedEqual: true, OverridesInExtension.a(4), .b("foo"))
|
||||
expectEqual(OverridesInExtension.a(4).hashValue, 2)
|
||||
expectEqual(
|
||||
hashEncode { $0.combine(OverridesInExtension.a(4)) },
|
||||
hashEncode { $0.combine(2) })
|
||||
}
|
||||
|
||||
// Try an indirect enum.
|
||||
enum BinaryTree<Element: Hashable>: Hashable {
|
||||
indirect case tree(BinaryTree, BinaryTree)
|
||||
case leaf(Element)
|
||||
}
|
||||
|
||||
EnumSynthesisTests.test("IndirectEquatability/Hashability") {
|
||||
let one = BinaryTree<Int>.tree(.leaf(10), .leaf(20))
|
||||
let two = BinaryTree<Int>.tree(.leaf(10), .leaf(30))
|
||||
let three = BinaryTree<Int>.tree(.leaf(15), .leaf(20))
|
||||
let four = BinaryTree<Int>.tree(.leaf(15), .leaf(30))
|
||||
checkHashable([one, two, three, four], equalityOracle: { $0 == $1 })
|
||||
}
|
||||
|
||||
runAllTests()
|
||||
158
test/Prototypes/Result_future.swift
Normal file
158
test/Prototypes/Result_future.swift
Normal file
@@ -0,0 +1,158 @@
|
||||
//===--- Result.swift -----------------------------------------------------===//
|
||||
//
|
||||
// This source file is part of the Swift.org open source project
|
||||
//
|
||||
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
||||
// Licensed under Apache License v2.0 with Runtime Library Exception
|
||||
//
|
||||
// See https://swift.org/LICENSE.txt for license information
|
||||
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
// RUN: %target-run-stdlib-swift-target-future
|
||||
// REQUIRES: executable_test
|
||||
|
||||
// REQUIRES: OS=macosx || OS=ios || OS=tvos || OS=watchos || OS=linux-gnu
|
||||
// UNSUPPORTED: CPU=i386 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7 && OS=ios
|
||||
// UNSUPPORTED: CPU=armv7s && OS=ios
|
||||
// Executing on the simulator within __abort_with_payload with "No ABI plugin located for triple x86_64h-apple-ios -- shared libraries will not be registered!"
|
||||
// UNSUPPORTED: CPU=x86_64 && OS=ios
|
||||
// UNSUPPORTED: CPU=i386 && OS=watchos
|
||||
|
||||
public enum Result<Value> {
|
||||
case Success(Value)
|
||||
case Error(Error)
|
||||
|
||||
init(success x: Value) {
|
||||
self = .Success(x)
|
||||
}
|
||||
|
||||
init(error: Error) {
|
||||
self = .Error(error)
|
||||
}
|
||||
|
||||
func map<U>(_ transform: (Value) -> U) -> Result<U> {
|
||||
switch self {
|
||||
case .Success(let x): return .Success(transform(x))
|
||||
case .Error(let e): return .Error(e)
|
||||
}
|
||||
}
|
||||
|
||||
func flatMap<U>(_ transform: (Value) -> Result<U>) -> Result<U> {
|
||||
switch self {
|
||||
case .Success(let x): return transform(x)
|
||||
case .Error(let e): return .Error(e)
|
||||
}
|
||||
}
|
||||
|
||||
func get() throws -> Value {
|
||||
switch self {
|
||||
case .Success(let x): return x
|
||||
case .Error(let e): throw e
|
||||
}
|
||||
}
|
||||
|
||||
var success: Value? {
|
||||
switch self {
|
||||
case .Success(let x): return x
|
||||
case .Error: return nil
|
||||
}
|
||||
}
|
||||
|
||||
var error: Error? {
|
||||
switch self {
|
||||
case .Success: return nil
|
||||
case .Error(let x): return x
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func ?? <T> (
|
||||
result: Result<T>, defaultValue: @autoclosure () -> T
|
||||
) -> T {
|
||||
switch result {
|
||||
case .Success(let x): return x
|
||||
case .Error: return defaultValue()
|
||||
}
|
||||
}
|
||||
|
||||
// We aren't actually proposing this overload; we think there should
|
||||
// be a compiler warning that catches the promotion that you probably
|
||||
// don't want.
|
||||
public func ?? <T> (
|
||||
result: Result<T>?, defaultValue: @autoclosure () -> T
|
||||
) -> T {
|
||||
fatalError("We should warn about Result<T> being promoted to Result<T>?")
|
||||
}
|
||||
|
||||
/// Translate the execution of a throwing closure into a Result
|
||||
func catchResult<Success>(
|
||||
invoking body: () throws -> Success
|
||||
) -> Result<Success> {
|
||||
do {
|
||||
return try .Success(body())
|
||||
}
|
||||
catch {
|
||||
return .Error(error)
|
||||
}
|
||||
}
|
||||
|
||||
// A couple of error types
|
||||
enum Nasty : Error {
|
||||
case Bad, Awful, Terrible
|
||||
}
|
||||
|
||||
enum Icky : Error {
|
||||
case Sad, Bad, Poor
|
||||
}
|
||||
|
||||
// Some Results to work with
|
||||
let three = Result(success: 3)
|
||||
let four = Result(success: 4)
|
||||
let nasty = Result<Int>(error: Nasty.Bad)
|
||||
let icky = Result<String>(error: Icky.Sad)
|
||||
|
||||
print(three)
|
||||
print(nasty)
|
||||
print(icky)
|
||||
|
||||
print(three ?? 4)
|
||||
print(nasty ?? 4)
|
||||
|
||||
print(three.map { String($0) })
|
||||
print(nasty.map { String($0) })
|
||||
|
||||
|
||||
print(three.flatMap { .Success(String($0)) })
|
||||
print(nasty.flatMap { .Success(String($0)) })
|
||||
|
||||
print(three.flatMap { _ in icky })
|
||||
print(nasty.flatMap { _ in icky })
|
||||
|
||||
try print(three.get())
|
||||
do {
|
||||
try print(nasty.get())
|
||||
}
|
||||
catch {
|
||||
print(error)
|
||||
}
|
||||
|
||||
func mayFail(_ fail: Bool) throws -> Int {
|
||||
if fail { throw Icky.Poor }
|
||||
return 0
|
||||
}
|
||||
|
||||
print(catchResult { try mayFail(true) })
|
||||
print(catchResult { try mayFail(false) })
|
||||
|
||||
print(catchResult { 1 }.flatMap { _ in Result(success: 4) }.flatMap { _ in Result<String>(error: Icky.Poor) })
|
||||
print(catchResult { 1 }.map { _ in three }.flatMap {$0} )
|
||||
|
||||
let results = [three, nasty, four]
|
||||
print(results.flatMap { $0.success })
|
||||
print(results.flatMap { $0.error })
|
||||
print(results.contains { $0.success != nil })
|
||||
|
||||
// Mistaken usage; causes Result<T> to be promoted to Result<T>?
|
||||
// print(three ?? nasty)
|
||||
13
test/lit.cfg
13
test/lit.cfg
@@ -738,7 +738,7 @@ else:
|
||||
swift_reflection_test_name = 'swift-reflection-test' + variant_suffix
|
||||
|
||||
def use_interpreter_for_simple_runs():
|
||||
def make_simple_target_run(gyb=False, stdlib=False, parameterized=False):
|
||||
def make_simple_target_run(gyb=False, stdlib=False, parameterized=False, future=False):
|
||||
result = ''
|
||||
if gyb:
|
||||
result += ('%empty-directory(%t) && '
|
||||
@@ -752,6 +752,8 @@ def use_interpreter_for_simple_runs():
|
||||
config.swift_test_options,
|
||||
config.swift_driver_test_options,
|
||||
swift_execution_tests_extra_flags))
|
||||
if future:
|
||||
result += '-target %s ' % target_future
|
||||
if stdlib:
|
||||
result += '-Xfrontend -disable-access-control '
|
||||
if parameterized:
|
||||
@@ -764,6 +766,7 @@ def use_interpreter_for_simple_runs():
|
||||
config.target_run_stdlib_swiftgyb = make_simple_target_run(gyb=True)
|
||||
config.target_run_simple_swiftgyb = make_simple_target_run(gyb=True)
|
||||
config.target_run_stdlib_swift = make_simple_target_run(stdlib=True)
|
||||
config.target_run_stdlib_swift_target_future = make_simple_target_run(stdlib=True, future=True)
|
||||
config.target_run_simple_swift = make_simple_target_run()
|
||||
config.target_run_simple_swift_parameterized = make_simple_target_run(parameterized=True)
|
||||
config.available_features.add('interpret')
|
||||
@@ -1619,6 +1622,13 @@ if not getattr(config, 'target_run_simple_swift', None):
|
||||
'%s %%t/a.out && '
|
||||
'%s %%t/a.out'
|
||||
% (config.target_build_swift, mcp_opt, config.target_codesign, config.target_run))
|
||||
config.target_run_stdlib_swift_target_future = (
|
||||
'%%empty-directory(%%t) && '
|
||||
'%s %s %%s -o %%t/a.out -module-name main '
|
||||
'-target %s -Xfrontend -disable-access-control && '
|
||||
'%s %%t/a.out && '
|
||||
'%s %%t/a.out'
|
||||
% (config.target_build_swift, mcp_opt, target_future, config.target_codesign, config.target_run))
|
||||
config.target_run_simple_swiftgyb = (
|
||||
'%%empty-directory(%%t) && '
|
||||
'%%gyb %%s -o %%t/main.swift && '
|
||||
@@ -1666,6 +1676,7 @@ config.substitutions.append(('%target-run-simple-swiftgyb', config.target_run_si
|
||||
config.substitutions.append(('%target-run-simple-swift\(([^)]+)\)', config.target_run_simple_swift_parameterized))
|
||||
config.substitutions.append(('%target-run-simple-swift', config.target_run_simple_swift))
|
||||
config.substitutions.append(('%target-run-stdlib-swiftgyb', config.target_run_stdlib_swiftgyb))
|
||||
config.substitutions.append(('%target-run-stdlib-swift-target-future', config.target_run_stdlib_swift_target_future))
|
||||
config.substitutions.append(('%target-run-stdlib-swift', config.target_run_stdlib_swift))
|
||||
config.substitutions.append(('%target-repl-run-simple-swift', subst_target_repl_run_simple_swift))
|
||||
config.substitutions.append(('%target-run', config.target_run))
|
||||
|
||||
Reference in New Issue
Block a user