// RUN: %target-parse-verify-swift -parse %s -verify // RUN: %target-parse-verify-swift -parse -debug-generic-signatures %s > %t.dump 2>&1 // RUN: FileCheck %s < %t.dump protocol P1 { func p1() } protocol P2 : P1 { } struct X1 { func getT() -> T { } } class X2 { func getT() -> T { } } class X3 { } struct X4 { func getT() -> T { } } struct X5 { } // Infer protocol requirements from the parameter type of a generic function. func inferFromParameterType(x: X1) { x.getT().p1() } // Infer protocol requirements from the return type of a generic function. func inferFromReturnType(x: T) -> X1 { x.p1() } // Infer protocol requirements from the superclass of a generic parameter. func inferFromSuperclass>(t: T, u: U) -> T { t.p1() } // Infer protocol requirements from the parameter type of a constructor. struct InferFromConstructor { init (x : X1) { x.getT().p1() } } // Don't infer requirements for outer generic parameters. class Fox : P1 { func p1() {} } class Box { // CHECK-LABEL: .unpack@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : Fox [outer] func unpack(x: X1) {} } // ---------------------------------------------------------------------------- // Superclass requirements // ---------------------------------------------------------------------------- // Compute meet of two superclass requirements correctly. class Carnivora {} class Canidae : Carnivora {} struct U {} struct V {} // CHECK-LABEL: .inferSuperclassRequirement1@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : Canidae func inferSuperclassRequirement1(v: V) {} // CHECK-LABEL: .inferSuperclassRequirement2@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : Canidae func inferSuperclassRequirement2(v: U) {} // ---------------------------------------------------------------------------- // Same-type requirements // ---------------------------------------------------------------------------- protocol P3 { associatedtype P3Assoc : P2 } protocol P4 { associatedtype P4Assoc : P1 } protocol PCommonAssoc1 { associatedtype CommonAssoc } protocol PCommonAssoc2 { associatedtype CommonAssoc } protocol PAssoc { associatedtype Assoc } struct Model_P3_P4_Eq { } // CHECK-LABEL: .inferSameType1@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : P3 [inferred @ {{.*}}:30] // CHECK-NEXT: U witness marker // CHECK-NEXT: U : P4 [inferred @ {{.*}}:30] // CHECK-NEXT: T[.P3].P3Assoc witness marker // CHECK-NEXT: T[.P3].P3Assoc : P1 [protocol @ {{.*}}:18] // CHECK-NEXT: T[.P3].P3Assoc : P2 [protocol @ {{.*}}:18] // CHECK-NEXT: U[.P4].P4Assoc == T[.P3].P3Assoc [inferred @ {{.*}}30] func inferSameType1(x: Model_P3_P4_Eq) { } // CHECK-LABEL: .inferSameType2@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : P3 [explicit @ {{.*}}requirement_inference.swift:{{.*}}:25] // CHECK-NEXT: U witness marker // CHECK-NEXT: U : P4 [explicit @ {{.*}}requirement_inference.swift:{{.*}}:33] // CHECK-NEXT: T[.P3].P3Assoc witness marker // CHECK-NEXT: T[.P3].P3Assoc : P1 [protocol @ {{.*}}requirement_inference.swift:{{.*}}:18] // CHECK-NEXT: T[.P3].P3Assoc : P2 [redundant @ {{.*}}requirement_inference.swift:{{.*}}:54] // CHECK-NEXT: U[.P4].P4Assoc == T[.P3].P3Assoc [explicit @ {{.*}}requirement_inference.swift:{{.*}}:68] func inferSameType2(_: T) { } // CHECK-LABEL: .inferSameType3@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : PCommonAssoc1 [explicit @ {{.*}}requirement_inference.swift:{{.*}}:25] // CHECK-NEXT: T : PCommonAssoc2 [explicit @ {{.*}}requirement_inference.swift:{{.*}}:69] // CHECK-NEXT: T[.PCommonAssoc1].CommonAssoc witness marker // CHECK-NEXT: T[.PCommonAssoc1].CommonAssoc : P1 [explicit @ {{.*}}requirement_inference.swift:{{.*}}:61] // CHECK-NEXT: T[.PCommonAssoc2].CommonAssoc == T[.PCommonAssoc1].CommonAssoc [inferred @ {{.*}}requirement_inference.swift:{{.*}}:69] // CHECK-NEXT: Generic signature func inferSameType3(_: T) { } protocol P5 { associatedtype Element } protocol P6 { associatedtype AssocP6 : P5 } protocol P7 : P6 { associatedtype AssocP7: P6 } // CHECK-LABEL: P7.nestedSameType1()@ // CHECK: Canonical generic signature for mangling: <τ_0_0 where τ_0_0 : P7, τ_0_0.AssocP6.Element : P6, τ_0_0.AssocP6.Element == τ_0_0.AssocP7.AssocP6.Element> extension P7 where AssocP6.Element : P6, AssocP7.AssocP6.Element : P6, AssocP6.Element == AssocP7.AssocP6.Element { func nestedSameType1() { } }