1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
// RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s
struct G<T> {}
// Three requirements where any two imply the third:
//
// a) T == G<U>
// b) T == G<Int>
// c) U == Int
// CHECK-LABEL: minimize_concrete_unification.(file).Pab@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pab]T == G<Int>, Self.[Pab]U == Int>
protocol Pab {
associatedtype T where T == G<U>, T == G<Int>
associatedtype U
}
// CHECK-LABEL: minimize_concrete_unification.(file).Pac@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pac]T == G<Int>, Self.[Pac]U == Int>
protocol Pac {
associatedtype T where T == G<U>
associatedtype U where U == Int
}
// CHECK-LABEL: minimize_concrete_unification.(file).Pbc@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pbc]T == G<Int>, Self.[Pbc]U == Int>
protocol Pbc {
associatedtype T where T == G<Int>
associatedtype U where U == Int
}
// CHECK-LABEL: minimize_concrete_unification.(file).Pabc@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pabc]T == G<Int>, Self.[Pabc]U == Int>
protocol Pabc {
associatedtype T where T == G<U>, T == G<Int>
associatedtype U where U == Int
}
//
// CHECK-LABEL: minimize_concrete_unification.(file).Pa@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pa]T == G<Self.[Pa]U>>
protocol Pa {
associatedtype T where T == G<U>
associatedtype U
}
// CHECK-LABEL: minimize_concrete_unification.(file).PaQb@
// CHECK-NEXT: Requirement signature: <Self where Self.[PaQb]X : Pa, Self.[PaQb]X.[Pa]U == Int>
protocol PaQb {
associatedtype X : Pa where X.T == G<Int>
}
// CHECK-LABEL: minimize_concrete_unification.(file).PaQc@
// CHECK-NEXT: Requirement signature: <Self where Self.[PaQc]X : Pa, Self.[PaQc]X.[Pa]U == Int>
protocol PaQc {
associatedtype X : Pa where X.U == Int
}
//
// CHECK-LABEL: minimize_concrete_unification.(file).Pb@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pb]T == G<Int>>
protocol Pb {
associatedtype T where T == G<Int>
associatedtype U
}
// CHECK-LABEL: minimize_concrete_unification.(file).PbQa@
// CHECK-NEXT: Requirement signature: <Self where Self.[PbQa]X : Pb, Self.[PbQa]X.[Pb]U == Int>
protocol PbQa {
associatedtype X : Pb where X.T == G<X.U>
}
// CHECK-LABEL: minimize_concrete_unification.(file).PbQc@
// CHECK-NEXT: Requirement signature: <Self where Self.[PbQc]X : Pb, Self.[PbQc]X.[Pb]U == Int>
protocol PbQc {
associatedtype X : Pb where X.U == Int
}
//
// CHECK-LABEL: minimize_concrete_unification.(file).Pc@
// CHECK-NEXT: Requirement signature: <Self where Self.[Pc]U == Int>
protocol Pc {
associatedtype T
associatedtype U where U == Int
}
// CHECK-LABEL: minimize_concrete_unification.(file).PcQa@
// CHECK-NEXT: Requirement signature: <Self where Self.[PcQa]X : Pc, Self.[PcQa]X.[Pc]T == G<Int>>
protocol PcQa {
associatedtype X : Pc where X.T == G<X.U>
}
// CHECK-LABEL: minimize_concrete_unification.(file).PcQb@
// CHECK-NEXT: Requirement signature: <Self where Self.[PcQb]X : Pc, Self.[PcQb]X.[Pc]T == G<Int>>
protocol PcQb {
associatedtype X : Pc where X.T == G<Int>
}
//
// CHECK-LABEL: minimize_concrete_unification.(file).Q1@
// CHECK-NEXT: Requirement signature: <Self where Self.[Q1]V : Pa, Self.[Q1]W == Self.[Q1]V.[Pa]U>
protocol Q1 {
associatedtype V where V : Pa, V.T == G<W>
associatedtype W
}
//
// CHECK-LABEL: minimize_concrete_unification.(file).P1@
// CHECK-NEXT: Requirement signature: <Self where Self.[P1]T == G<Self.[P1]U>>
protocol P1 {
associatedtype T
associatedtype U where T == G<U>
}
// CHECK-LABEL: minimize_concrete_unification.(file).P2@
// CHECK-NEXT: Requirement signature: <Self where Self.[P2]T == G<Int>>
protocol P2 {
associatedtype T where T == G<Int>
associatedtype U
}
// CHECK-LABEL: minimize_concrete_unification.(file).P@
// CHECK-NEXT: Requirement signature: <Self>
protocol P {
associatedtype T
associatedtype U
}
// CHECK-LABEL: minimize_concrete_unification.(file).R1@
// CHECK-NEXT: Requirement signature: <Self where Self.[R1]X : P, Self.[R1]X : Pa, Self.[R1]X.[P]U == Int>
protocol R1 {
// The GSB would drop 'X.T == Int' from the minimal signature.
associatedtype X where X : P, X.T == G<Int>, X : Pa
}
// CHECK-LABEL: minimize_concrete_unification.(file).R2@
// CHECK-NEXT: Requirement signature: <Self where Self.[R2]X : P, Self.[R2]X : Pb, Self.[R2]X.[P]U == Int>
protocol R2 {
// The GSB would drop 'X.T == Int' from the minimal signature.
associatedtype X where X : P, X.T == G<X.U>, X : Pb
}
// CHECK-LABEL: minimize_concrete_unification.(file).R3@
// CHECK-NEXT: Requirement signature: <Self where Self.[R3]X : Pa, Self.[R3]X : Pb>
protocol R3 {
// The GSB would include a redundant 'X.T == Int' in the minimal signature.
associatedtype X where X : Pa, X.T == G<Int>, X : Pb
}
|