mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
90 lines
4.3 KiB
Swift
90 lines
4.3 KiB
Swift
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
|
|
|
|
protocol P1 {
|
|
func normal()
|
|
func generic<T: P3>(_: T)
|
|
}
|
|
protocol P2 {}
|
|
protocol P3 {}
|
|
|
|
protocol P4 {
|
|
associatedtype AT
|
|
}
|
|
|
|
struct Conformance<A> {}
|
|
extension Conformance: P1 where A: P2 {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
|
|
// This is defined below but is emitted before any witness tables.
|
|
// Just make sure it does not have a generic signature.
|
|
//
|
|
// CHECK-LABEL: sil private [transparent] [thunk] [ossa] @$s23conditional_conformance16SameTypeConcreteVyxGAA2P1AASiRszlAaEP6normalyyFTW : $@convention(witness_method: P1) (@in_guaranteed SameTypeConcrete<Int>) -> ()
|
|
|
|
|
|
// CHECK-LABEL: sil_witness_table hidden <A where A : P2> Conformance<A>: P1 module conditional_conformance {
|
|
// CHECK-NEXT: method #P1.normal: <Self where Self : P1> (Self) -> () -> () : @$s23conditional_conformance11ConformanceVyxGAA2P1A2A2P2RzlAaEP6normalyyFTW // protocol witness for P1.normal() in conformance <A> Conformance<A>
|
|
// CHECK-NEXT: method #P1.generic: <Self where Self : P1><T where T : P3> (Self) -> (T) -> () : @$s23conditional_conformance11ConformanceVyxGAA2P1A2A2P2RzlAaEP7genericyyqd__AA2P3Rd__lFTW // protocol witness for P1.generic<A>(_:) in conformance <A> Conformance<A>
|
|
// CHECK-NEXT: conditional_conformance (A: P2): dependent
|
|
// CHECK-NEXT: }
|
|
|
|
struct ConformanceAssoc<A> {}
|
|
extension ConformanceAssoc: P1 where A: P4, A.AT: P2 {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
// CHECK-LABEL: sil_witness_table hidden <A where A : P4, A.AT : P2> ConformanceAssoc<A>: P1 module conditional_conformance {
|
|
// CHECK-NEXT: method #P1.normal: <Self where Self : P1> (Self) -> () -> () : @$s23conditional_conformance16ConformanceAssocVyxGAA2P1A2A2P4RzAA2P22ATRpzlAaEP6normalyyFTW // protocol witness for P1.normal() in conformance <A> ConformanceAssoc<A>
|
|
// CHECK-NEXT: method #P1.generic: <Self where Self : P1><T where T : P3> (Self) -> (T) -> () : @$s23conditional_conformance16ConformanceAssocVyxGAA2P1A2A2P4RzAA2P22ATRpzlAaEP7genericyyqd__AA2P3Rd__lFTW // protocol witness for P1.generic<A>(_:) in conformance <A> ConformanceAssoc<A>
|
|
// CHECK-NEXT: conditional_conformance (A: P4): dependent
|
|
// CHECK-NEXT: conditional_conformance (A.AT: P2): dependent
|
|
// CHECK-NEXT: }
|
|
|
|
struct SameTypeConcrete<B> {}
|
|
extension SameTypeConcrete: P1 where B == Int {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
|
|
// CHECK-LABEL: sil_witness_table hidden <B where B == Int> SameTypeConcrete<B>: P1 module conditional_conformance {
|
|
// CHECK-NEXT: method #P1.normal: <Self where Self : P1> (Self) -> () -> () : @$s23conditional_conformance16SameTypeConcreteVyxGAA2P1AASiRszlAaEP6normalyyFTW // protocol witness for P1.normal() in conformance <A> SameTypeConcrete<A>
|
|
// CHECK-NEXT: method #P1.generic: <Self where Self : P1><T where T : P3> (Self) -> (T) -> () : @$s23conditional_conformance16SameTypeConcreteVyxGAA2P1AASiRszlAaEP7genericyyqd__AA2P3Rd__lFTW // protocol witness for P1.generic<A>(_:) in conformance <A> SameTypeConcrete<A>
|
|
// CHECK-NEXT: }
|
|
|
|
struct SameTypeGeneric<C, D> {}
|
|
extension SameTypeGeneric: P1 where C == D {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
|
|
struct SameTypeGenericConcrete<E, F> {}
|
|
extension SameTypeGenericConcrete: P1 where E == [F] {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
|
|
struct Everything<G, H, I, J, K, L> {}
|
|
extension Everything: P1 where G: P2, H == Int, I == J, K == [L] {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
|
|
struct IsP2: P2 {}
|
|
struct IsNotP2 {}
|
|
|
|
class Base<A> {}
|
|
extension Base: P1 where A: P2 {
|
|
func normal() {}
|
|
func generic<T: P3>(_: T) {}
|
|
}
|
|
// CHECK-LABEL: sil_witness_table hidden <A where A : P2> Base<A>: P1 module conditional_conformance {
|
|
// CHECK-NEXT: method #P1.normal: <Self where Self : P1> (Self) -> () -> () : @$s23conditional_conformance4BaseCyxGAA2P1A2A2P2RzlAaEP6normalyyFTW // protocol witness for P1.normal() in conformance <A> Base<A>
|
|
// CHECK-NEXT: method #P1.generic: <Self where Self : P1><T where T : P3> (Self) -> (T) -> () : @$s23conditional_conformance4BaseCyxGAA2P1A2A2P2RzlAaEP7genericyyqd__AA2P3Rd__lFTW // protocol witness for P1.generic<A>(_:) in conformance <A> Base<A>
|
|
// CHECK-NEXT: conditional_conformance (A: P2): dependent
|
|
// CHECK-NEXT: }
|
|
|
|
// These don't get separate witness tables, but shouldn't crash anything.
|
|
class SubclassGood: Base<IsP2> {}
|
|
class SubclassBad: Base<IsNotP2> {}
|