Files
swift-mirror/test/SIL/Parser/witness_tables.sil
Slava Pestov 8bcd09aaa4 SIL: Preliminary refactoring of SILWitnessTable::AssociatedConformanceWitness
The Protocol field isn't really necessary, because the conformance
stores the protocol. But we do need the substituted subject type
of the requirement, just temporarily, until an abstract conformance
stores its own subject type too.
2025-03-18 19:38:42 -04:00

118 lines
4.0 KiB
Plaintext

// RUN: %target-sil-opt %s -module-name=witness_tables | %target-sil-opt -module-name=witness_tables | %FileCheck %s
protocol AssocReqt {
func requiredMethod()
}
struct ConformingAssoc : AssocReqt {
func requiredMethod()
}
sil @_TFV14witness_tables15ConformingAssoc14requiredMethodfS0_FT_T_ : $@convention(method) (ConformingAssoc) -> () {
bb0(%0 : $ConformingAssoc):
debug_value %0 : $ConformingAssoc
%2 = tuple ()
return %2 : $()
}
sil @_TTWV14witness_tables15ConformingAssocS_9AssocReqtS_FS1_14requiredMethodU_fRQPS1_FT_T_ : $@convention(witness_method: AssocReqt) (@inout ConformingAssoc) -> () {
bb0(%0 : $*ConformingAssoc):
%1 = load %0 : $*ConformingAssoc
%2 = function_ref @_TFV14witness_tables15ConformingAssoc14requiredMethodfS0_FT_T_ : $@convention(method) (ConformingAssoc) -> ()
%3 = apply %2(%1) : $@convention(method) (ConformingAssoc) -> ()
return %3 : $()
}
// CHECK-LABEL: sil_witness_table ConformingAssoc: AssocReqt module witness_tables {
// CHECK: #AssocReqt.requiredMethod: {{.*}} : @_TTWV14witness_tables15ConformingAssocS_9AssocReqtS_FS1_14requiredMethodU_fRQPS1_FT_T_
// CHECK: }
sil_witness_table ConformingAssoc: AssocReqt module witness_tables {
method #AssocReqt.requiredMethod: @_TTWV14witness_tables15ConformingAssocS_9AssocReqtS_FS1_14requiredMethodU_fRQPS1_FT_T_
}
protocol AnyProtocol {
associatedtype AssocType
associatedtype AssocWithReqt : AssocReqt
func assocTypesMethod(x: AssocType, y: AssocWithReqt)
static func staticMethod(x: Self)
}
class SomeAssoc {
}
protocol InheritedProtocol1 : AnyProtocol {
func inheritedMethod()
}
struct InheritedConformance : InheritedProtocol1 {
typealias AssocType = SomeAssoc
typealias AssocWithReqt = ConformingAssoc
func assocTypesMethod(x: SomeAssoc, y: ConformingAssoc)
static func staticMethod(x: InheritedConformance)
func inheritedMethod()
}
struct InheritedConformance2 : InheritedProtocol1 {
typealias AssocType = SomeAssoc
typealias AssocWithReqt = ConformingAssoc
func assocTypesMethod(x: SomeAssoc, y: ConformingAssoc)
static func staticMethod(x: InheritedConformance2)
func inheritedMethod()
}
// CHECK-LABEL: sil_witness_table InheritedConformance: InheritedProtocol1 module
// CHECK: base_protocol AnyProtocol: InheritedConformance: AnyProtocol module
// CHECK: }
sil_witness_table InheritedConformance: InheritedProtocol1 module witness_tables {
base_protocol AnyProtocol: InheritedConformance: AnyProtocol module witness_tables
}
// CHECK-LABEL: sil_witness_table shared InheritedConformance: AnyProtocol module
// CHECK: associated_type AssocType: SomeAssoc
// CHECK: associated_conformance (AssocWithReqt: AssocReqt): ConformingAssoc: AssocReqt module
// CHECK: }
sil_witness_table shared InheritedConformance: AnyProtocol module witness_tables {
associated_type AssocType: SomeAssoc
associated_conformance (AssocWithReqt: AssocReqt): ConformingAssoc: AssocReqt module witness_tables
}
// CHECK-LABEL: sil_witness_table InheritedConformance2: InheritedProtocol1 module witness_tables
// CHECK-NOT: }
sil_witness_table public_external InheritedConformance2: InheritedProtocol1 module witness_tables
// CHECK-LABEL: sil_witness_table public InheritedConformance2: AnyProtocol module witness_tables
// CHECK-NOT: }
sil_witness_table public InheritedConformance2: AnyProtocol module witness_tables
protocol Proto {
func abc()
}
class DeadMethodClass : Proto {
func abc()
}
// CHECK-LABEL: sil_witness_table DeadMethodClass: Proto module witness_tables
// CHECK: method #Proto.abc: {{.*}} : nil
// CHECK: }
sil_witness_table DeadMethodClass: Proto module witness_tables {
method #Proto.abc: nil
}
protocol P {
}
struct ConditionalStruct<T> {
init()
}
extension ConditionalStruct : P where T : P {
}
// CHECK-LABEL: sil_witness_table hidden <T where T : P> ConditionalStruct<T>: P module witness_tables {
// CHECK-NEXT: conditional_conformance (T: P): dependent T
// CHECK-NEXT: }
sil_witness_table hidden <T where T : P> ConditionalStruct<T>: P module t4 {
conditional_conformance (T: P): dependent T
}
sil_default_witness_table hidden P {
}