mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The uniquing key for these was just the number of witness tables, but the function itself referenced the specific existential type it was instantiated with. Everything still worked because getOrCreateHelperFunction() would bitcast an existing function to the correct type, and in practice the layout of an existential type only depends on the number of witness tables. However on master-next, other changes were made that stripped off the bitcasts. This would result in assertions or LLVM verifier failures when multiple existential types were used in a single translation unit. Fixes <rdar://problem/54780404>.
38 lines
2.0 KiB
Swift
38 lines
2.0 KiB
Swift
// RUN: %target-swift-frontend -emit-ir -primary-file %s %S/Inputs/protocol_accessor_multifile_other.swift > %t.ll
|
|
// RUN: %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-runtime < %t.ll
|
|
// RUN: %FileCheck -check-prefix NEGATIVE %s < %t.ll
|
|
|
|
// CHECK: @"$s27protocol_accessor_multifile5ProtoMp" = external{{( dllimport)?}} global
|
|
// NEGATIVE-NOT: @"$s27protocol_accessor_multifile10ClassProtoMp" =
|
|
|
|
// CHECK-LABEL: define{{.*}} void @"$s27protocol_accessor_multifile14useExistentialyyF"()
|
|
func useExistential() {
|
|
// CHECK: [[BOX:%.+]] = alloca %T27protocol_accessor_multifile5ProtoP,
|
|
// CHECK: call swiftcc void @"$s27protocol_accessor_multifile17globalExistentialAA5Proto_pvg"(%T27protocol_accessor_multifile5ProtoP* noalias nocapture sret [[BOX]])
|
|
// CHECK: call swiftcc void @"$s27protocol_accessor_multifile5ProtoPAAE6methodyyF"
|
|
globalExistential.method()
|
|
// CHECK: [[BITCAST:%.*]] = bitcast %T27protocol_accessor_multifile5ProtoP* [[BOX]] to %__opaque_existential_type_1*
|
|
// CHECK: call void @__swift_destroy_boxed_opaque_existential_1(%__opaque_existential_type_1* [[BITCAST]])
|
|
// CHECK: ret void
|
|
}
|
|
|
|
class GenericContext<T: Proto> {
|
|
// CHECK-LABEL: define{{.*}} void @"$s27protocol_accessor_multifile14GenericContextC04testdE0yyFZ
|
|
static func testGenericContext() {
|
|
// CHECK: [[SELF:%.+]] = bitcast %swift.type* %0 to %swift.type**
|
|
// CHECK: [[WITNESS_TABLE:%.+]] = getelementptr inbounds %swift.type*, %swift.type** [[SELF]],
|
|
// CHECK: = load %swift.type*, %swift.type** [[WITNESS_TABLE]]
|
|
// CHECK: ret void
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: define{{.*}} void @"$s27protocol_accessor_multifile19useClassExistentialyyF"()
|
|
func useClassExistential() {
|
|
let g = getClassExistential()
|
|
// CHECK-objc: [[G_TYPE:%.+]] = call %swift.type* @swift_getObjectType({{%.+}} {{%.+}})
|
|
// CHECK-native: [[G_TYPE:%.+]] = load %swift.type*
|
|
// CHECK: call swiftcc void {{%.+}}(i{{32|64}} 1, {{%.+}} {{%.+}}, %swift.type* [[G_TYPE]], i8** {{%.+}})
|
|
g?.baseProp = 1
|
|
// CHECK: ret void
|
|
}
|