// 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() } } // FIXME: Infer superclass requirements. // ---------------------------------------------------------------------------- // Same-type requirements // ---------------------------------------------------------------------------- protocol P3 { typealias P3Assoc : P2 } protocol P4 { typealias P4Assoc : P1 } protocol PCommonAssoc1 { typealias CommonAssoc } protocol PCommonAssoc2 { typealias CommonAssoc } protocol PAssoc { typealias Assoc } struct Model_P3_P4_Eq { } // CHECK-LABEL: .inferSameType1@ // CHECK-NEXT: Requirements: // CHECK-NEXT: T witness marker // CHECK-NEXT: T : P3 [inferred @ {{.*}}:26] // CHECK-NEXT: U witness marker // CHECK-NEXT: U : P4 [inferred @ {{.*}}:26] // CHECK-NEXT: T[.P3].P3Assoc witness marker // CHECK-NEXT: T[.P3].P3Assoc : P1 [protocol @ {{.*}}:26] // CHECK-NEXT: T[.P3].P3Assoc : P2 [protocol @ {{.*}}:26] // CHECK-NEXT: U[.P4].P4Assoc == T[.P3].P3Assoc [inferred @ {{.*}}26] 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:{{.*}}:21] // CHECK-NEXT: U witness marker // CHECK-NEXT: U : P4 [explicit @ {{.*}}requirement_inference.swift:{{.*}}:29] // CHECK-NEXT: T[.P3].P3Assoc witness marker // CHECK-NEXT: T[.P3].P3Assoc : P1 [protocol @ {{.*}}requirement_inference.swift:{{.*}}:21] // 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:{{.*}}:21] // 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) { }