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
|
// RUN: %target-typecheck-verify-swift
// RUN: %target-swift-frontend -typecheck %s -debug-generic-signatures 2>&1 | %FileCheck %s
// Performance test case reduced from https://github.com/plx/HDXLSIMDSupport.
// CHECK-LABEL: .PA@
// CHECK-NEXT: Requirement signature: <Self where Self : PB, Self : PC, Self : PD>
protocol PA: PB, PC, PD {}
// CHECK-LABEL: .PB@
// CHECK-NEXT: Requirement signature: <Self where Self : PE, Self == Self.[PF]A1, Self.[PG]A2 == Self.[PG]A4>
protocol PB: PE where A2 == A3, A4 == A2, A5 == A6, A1 == Self {}
// CHECK-LABEL: .PC@
// CHECK-NEXT: Requirement signature: <Self where Self : PG, Self.[PG]A3 == Self.[PH]A7.[PI]A8, Self.[PG]A5 == (Self.[PG]A2, Self.[PG]A2)>
protocol PC: PG where A5 == (A2, A2), A3 == A7.A8 {}
// CHECK-LABEL: .PD@
// CHECK-NEXT: Requirement signature: <Self where Self : PG, Self.[PG]A2 == Self.[PH]A7.[PI]A8, Self.[PG]A6 == (Self.[PG]A3, Self.[PG]A3)>
protocol PD: PG where A6 == (A3, A3), A2 == A7.A8 {}
// CHECK-LABEL: .PE@
// CHECK-NEXT: Requirement signature: <Self where Self : PF, Self == Self.[PF]A1.[PF]A1>
protocol PE: PF where A1.A1 == Self {}
// CHECK-LABEL: .PF@
// CHECK-NEXT: Requirement signature: <Self where Self : PG, Self.[PF]A1 : PF, Self.[PG]A2 == Self.[PF]A1.[PG]A3, Self.[PG]A3 == Self.[PF]A1.[PG]A2, Self.[PG]A5 == Self.[PF]A1.[PG]A6, Self.[PG]A6 == Self.[PF]A1.[PG]A5>
protocol PF: PG {
associatedtype A1: PF where A1.A7 == A7, A1.A2 == A3, A1.A3 == A2, A1.A5 == A6, A1.A6 == A5
}
// CHECK-LABEL: .PG@
// CHECK-NEXT: Requirement signature: <Self where Self : PH, Self.[PG]A2 : PJ, Self.[PG]A3 : PJ, Self.[PG]A4 : PJ, Self.[PH]A7 : BinaryFloatingPoint, Self.[PH]A7 : PI, Self.[PH]A7 == Self.[PG]A2.[PH]A7, Self.[PG]A2.[PH]A7 == Self.[PG]A3.[PH]A7, Self.[PG]A3.[PH]A7 == Self.[PG]A4.[PH]A7>
protocol PG: PH where A7: PI, A7: BinaryFloatingPoint {
associatedtype A2: PJ where A2.A7 == A7
associatedtype A3: PJ where A3.A7 == A7
associatedtype A4: PJ where A4.A7 == A7
associatedtype A5
associatedtype A6
}
// CHECK-LABEL: .PH@
// CHECK-NEXT: Requirement signature: <Self where Self.[PH]A7 : SIMDScalar>
protocol PH {
associatedtype A7: SIMDScalar
}
// CHECK-LABEL: .PI@
// CHECK-NEXT: Requirement signature: <Self where Self == Self.[PI]A10.[PH]A7, Self.[PI]A10 == Self.[PI]A11.[PN]A10, Self.[PI]A11 == Self.[PI]A12.[PM]A11, Self.[PI]A12 == Self.[PI]A13.[PL]A12, Self.[PI]A13 == Self.[PI]A14.[PK]A13, Self.[PI]A14 : PK, Self.[PI]A8 == Self.[PI]A10.[PO]A8, Self.[PI]A9 == Self.[PI]A10.[PO]A9, Self.[PI]A10.[PO]A8 == Self.[PI]A9.[PP]A8>
protocol PI {
// expected-warning@-1 {{protocol 'PI' should be declared to refine 'Decodable' due to a same-type constraint on 'Self'}}
// expected-warning@-2 {{protocol 'PI' should be declared to refine 'Encodable' due to a same-type constraint on 'Self'}}
// expected-warning@-3 {{protocol 'PI' should be declared to refine 'Hashable' due to a same-type constraint on 'Self'}}
// expected-warning@-4 {{protocol 'PI' should be declared to refine 'SIMDScalar' due to a same-type constraint on 'Self'}}
associatedtype A8 where A8.A7 == Self
associatedtype A9 where A9.A7 == Self, A9.A8 == A8
associatedtype A10 where A10.A7 == Self, A10.A8 == A8, A10.A9 == A9
associatedtype A11 where A11.A7 == Self, A11.A10 == A10
associatedtype A12 where A12.A7 == Self, A12.A11 == A11
associatedtype A13 where A13.A7 == Self, A13.A12 == A12
associatedtype A14: PK where A14.A7 == Self, A14.A13 == A13
}
// CHECK-LABEL: .PJ@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PH]A7 == Self.[SIMDStorage]Scalar>
protocol PJ: SIMD, PH where Scalar == A7 {}
// CHECK-LABEL: .PK@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PK]A13 : PL, Self.[PH]A7 == Self.[SIMDStorage]Scalar, Self.[SIMDStorage]Scalar == Self.[PK]A13.[PH]A7>
protocol PK: SIMD, PH where Scalar == A7 {
associatedtype A13: PL where A13.Scalar == Scalar
}
// CHECK-LABEL: .PL@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PL]A12 : PM, Self.[PH]A7 == Self.[SIMDStorage]Scalar, Self.[SIMDStorage]Scalar == Self.[PL]A12.[PH]A7>
protocol PL: SIMD, PH where Scalar == A7 {
associatedtype A12: PM where A12.Scalar == Scalar
}
// CHECK-LABEL: .PM@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PM]A11 : PN, Self.[PH]A7 == Self.[SIMDStorage]Scalar, Self.[SIMDStorage]Scalar == Self.[PM]A11.[PH]A7>
protocol PM: SIMD, PH where Scalar == A7 {
associatedtype A11: PN where A11.Scalar == Scalar
}
// CHECK-LABEL: .PN@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PN]A10 : PO, Self.[PH]A7 == Self.[SIMDStorage]Scalar, Self.[SIMDStorage]Scalar == Self.[PN]A10.[PH]A7>
protocol PN: SIMD, PH where Scalar == A7 {
associatedtype A10: PO where A10.Scalar == Scalar
}
// CHECK-LABEL: .PO@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PH]A7 == Self.[SIMDStorage]Scalar, Self.[PO]A8 : PQ, Self.[PO]A9 : PP, Self.[SIMDStorage]Scalar == Self.[PO]A8.[PH]A7, Self.[PO]A8.[PH]A7 == Self.[PO]A9.[PH]A7>
protocol PO: SIMD, PH where Scalar == A7 {
associatedtype A8: PQ where A8.Scalar == Scalar
associatedtype A9: PP where A9.Scalar == Scalar
}
// CHECK-LABEL: .PP@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PH]A7 == Self.[SIMDStorage]Scalar, Self.[PP]A8 : PQ, Self.[SIMDStorage]Scalar == Self.[PP]A8.[PH]A7>
protocol PP: SIMD, PH where Scalar == A7 {
associatedtype A8: PQ where A8.Scalar == Scalar
}
// CHECK-LABEL: .PQ@
// CHECK-NEXT: Requirement signature: <Self where Self : SIMD, Self : PH, Self.[PH]A7 == Self.[SIMDStorage]Scalar>
protocol PQ: SIMD, PH where Scalar == A7 {}
func sameType<T>(_: T, _: T) {}
func testPI1<T : PI>(_: T) {
sameType(T.A8.A7.self, T.self)
}
func testPI2<T : PI>(_: T) {
sameType(T.A10.A7.self, T.self)
}
func testPI3<T : PI>(_: T) {
sameType(T.A11.A7.self, T.self)
}
func testPI4<T : PI>(_: T) {
sameType(T.A12.A7.self, T.self)
}
func testPI5<T : PI>(_: T) {
sameType(T.A13.A7.self, T.self)
}
func testPI6<T : PI>(_: T) {
sameType(T.A14.A7.self, T.self)
}
func testPF1<T : PF>(_: T) {
sameType(T.A1.A7.self, T.A7.self)
}
func testPB1<T : PB>(_: T) {
sameType(T.A2.self, T.A3.self)
}
func testPB2<T : PB>(_: T) {
sameType(T.A5.self, T.A6.self)
}
|