// RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s struct G {} // Three requirements where any two imply the third: // // a) T == G // b) T == G // c) U == Int // CHECK-LABEL: minimize_concrete_unification.(file).Pab@ // CHECK-NEXT: Requirement signature: , Self.[Pab]U == Int> protocol Pab { associatedtype T where T == G, T == G associatedtype U } // CHECK-LABEL: minimize_concrete_unification.(file).Pac@ // CHECK-NEXT: Requirement signature: , Self.[Pac]U == Int> protocol Pac { associatedtype T where T == G associatedtype U where U == Int } // CHECK-LABEL: minimize_concrete_unification.(file).Pbc@ // CHECK-NEXT: Requirement signature: , Self.[Pbc]U == Int> protocol Pbc { associatedtype T where T == G associatedtype U where U == Int } // CHECK-LABEL: minimize_concrete_unification.(file).Pabc@ // CHECK-NEXT: Requirement signature: , Self.[Pabc]U == Int> protocol Pabc { associatedtype T where T == G, T == G associatedtype U where U == Int } // // CHECK-LABEL: minimize_concrete_unification.(file).Pa@ // CHECK-NEXT: Requirement signature: > protocol Pa { associatedtype T where T == G associatedtype U } // CHECK-LABEL: minimize_concrete_unification.(file).PaQb@ // CHECK-NEXT: Requirement signature: protocol PaQb { associatedtype X : Pa where X.T == G } // CHECK-LABEL: minimize_concrete_unification.(file).PaQc@ // CHECK-NEXT: Requirement signature: protocol PaQc { associatedtype X : Pa where X.U == Int } // // CHECK-LABEL: minimize_concrete_unification.(file).Pb@ // CHECK-NEXT: Requirement signature: > protocol Pb { associatedtype T where T == G associatedtype U } // CHECK-LABEL: minimize_concrete_unification.(file).PbQa@ // CHECK-NEXT: Requirement signature: protocol PbQa { associatedtype X : Pb where X.T == G } // CHECK-LABEL: minimize_concrete_unification.(file).PbQc@ // CHECK-NEXT: Requirement signature: protocol PbQc { associatedtype X : Pb where X.U == Int } // // CHECK-LABEL: minimize_concrete_unification.(file).Pc@ // CHECK-NEXT: Requirement signature: protocol Pc { associatedtype T associatedtype U where U == Int } // CHECK-LABEL: minimize_concrete_unification.(file).PcQa@ // CHECK-NEXT: Requirement signature: > protocol PcQa { associatedtype X : Pc where X.T == G } // CHECK-LABEL: minimize_concrete_unification.(file).PcQb@ // CHECK-NEXT: Requirement signature: > protocol PcQb { associatedtype X : Pc where X.T == G } // // CHECK-LABEL: minimize_concrete_unification.(file).Q1@ // CHECK-NEXT: Requirement signature: protocol Q1 { associatedtype V where V : Pa, V.T == G associatedtype W } // // CHECK-LABEL: minimize_concrete_unification.(file).P1@ // CHECK-NEXT: Requirement signature: > protocol P1 { associatedtype T associatedtype U where T == G } // CHECK-LABEL: minimize_concrete_unification.(file).P2@ // CHECK-NEXT: Requirement signature: > protocol P2 { associatedtype T where T == G associatedtype U } // CHECK-LABEL: minimize_concrete_unification.(file).P@ // CHECK-NEXT: Requirement signature: protocol P { associatedtype T associatedtype U } // CHECK-LABEL: minimize_concrete_unification.(file).R1@ // CHECK-NEXT: Requirement signature: protocol R1 { // The GSB would drop 'X.T == Int' from the minimal signature. associatedtype X where X : P, X.T == G, X : Pa } // CHECK-LABEL: minimize_concrete_unification.(file).R2@ // CHECK-NEXT: Requirement signature: protocol R2 { // The GSB would drop 'X.T == Int' from the minimal signature. associatedtype X where X : P, X.T == G, X : Pb } // CHECK-LABEL: minimize_concrete_unification.(file).R3@ // CHECK-NEXT: Requirement signature: protocol R3 { // The GSB would include a redundant 'X.T == Int' in the minimal signature. associatedtype X where X : Pa, X.T == G, X : Pb }