mirror of
https://github.com/apple/swift.git
synced 2026-06-27 12:25:55 +02:00
40283f9b73
Extend witness tables with a pointer to the protocol conformance descriptor from which the witness table was generated. This will allow us to determine (for example) whether two witness tables were generated from the same (or equivalent) conformances in the future, as well as discover more information about the witness table itself. Fixes rdar://problem/36287959.
28 lines
1.9 KiB
Plaintext
28 lines
1.9 KiB
Plaintext
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil %s -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-runtime
|
|
|
|
// XFAIL: resilient_stdlib
|
|
|
|
import Swift
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc {{i[0-9]+}} @open_boxed_existential(%swift.error*)
|
|
sil @open_boxed_existential : $@convention(thin) (@owned Error) -> Int {
|
|
entry(%b : $Error):
|
|
// CHECK: call void @swift_getErrorValue(%swift.error* %0, i8** {{%.*}}, [[TRIPLE:{ %swift.opaque\*, %swift.type\*, i8\*\* }]]* [[OUT:%.*]])
|
|
// CHECK: [[OUT_ADDR:%.*]] = getelementptr inbounds {{.*}} [[OUT]], i32 0, i32 0
|
|
// CHECK: [[ADDR:%.*]] = load {{.*}} [[OUT_ADDR]]
|
|
// CHECK: [[OUT_TYPE:%.*]] = getelementptr inbounds {{.*}} [[OUT]], i32 0, i32 1
|
|
// CHECK: [[TYPE:%.*]] = load {{.*}} [[OUT_TYPE]]
|
|
// CHECK: [[OUT_WITNESS:%.*]] = getelementptr inbounds {{.*}} [[OUT]], i32 0, i32 2
|
|
// CHECK: [[WITNESS:%.*]] = load {{.*}} [[OUT_WITNESS]]
|
|
%o = open_existential_box %b : $Error to $*@opened("01234567-89AB-CDEF-0123-000000000000") Error
|
|
// CHECK: [[CODE_ADDR:%.*]] = getelementptr {{.*}} [[WITNESS]], i32 2
|
|
// CHECK: [[CODE:%.*]] = load {{.*}} [[CODE_ADDR]]
|
|
%m = witness_method $@opened("01234567-89AB-CDEF-0123-000000000000") Error, #Error._code!getter.1, %o : $*@opened("01234567-89AB-CDEF-0123-000000000000") Error : $@convention(witness_method: Error) <Self: Error> (@in_guaranteed Self) -> Int
|
|
// CHECK: [[CODE_FN:%.*]] = bitcast i8* [[CODE]] to [[INT:i[0-9]+]] (%swift.opaque*, %swift.type*, i8**)*
|
|
// CHECK: [[RESULT:%.*]] = call swiftcc [[INT]] [[CODE_FN]](%swift.opaque* noalias nocapture swiftself [[ADDR]], %swift.type* [[TYPE]], i8** [[WITNESS]])
|
|
%c = apply %m<@opened("01234567-89AB-CDEF-0123-000000000000") Error>(%o) : $@convention(witness_method: Error) <Self: Error> (@in_guaranteed Self) -> Int
|
|
// CHECK: ret [[INT]] [[RESULT]]
|
|
return %c : $Int
|
|
}
|
|
|