1- // RUN: %target-typecheck-verify-swift -dump-requirement-machine 2>&1 | %FileCheck %s
1+ // RUN: %target-typecheck-verify-swift -debug-generic-signatures -requirement-machine-inferred-signatures=off 2>&1 | %FileCheck %s
2+ // RUN: %target-typecheck-verify-swift -dump-requirement-machine -requirement-machine-inferred-signatures=off 2>&1 | %FileCheck %s --check-prefix=CHECK-RULE
23
34// Note: The GSB fails this test, because it doesn't implement unification of
45// superclass type constructor arguments.
56
7+ // FIXME: The Requirement Machine also fails to minimize the signature of
8+ // unifySuperclassTest(). rdar://90469643
9+
610class Generic < T, U, V> { }
711
812class Derived < TT, UU> : Generic < Int , TT , UU > { }
@@ -23,32 +27,34 @@ func sameType<T>(_: T.Type, _: T.Type) {}
2327
2428func takesDerivedString< U> ( _: Derived < String , U > . Type ) { }
2529
30+ // CHECK-LABEL: .unifySuperclassTest@
31+ // CHECK-NEXT: Generic signature: <T where T : P1, T : P2>
2632func unifySuperclassTest< T : P1 & P2 > ( _: T ) {
2733 sameType ( T . A1. self, String . self)
2834 sameType ( T . A2. self, Int . self)
2935 sameType ( T . B1. self, T . B2. self)
3036 takesDerivedString ( T . X. self)
3137}
3238
33- // CHECK-LABEL: Requirement machine for <τ_0_0 where τ_0_0 : P1, τ_0_0 : P2>
34- // CHECK-NEXT: Rewrite system: {
35- // CHECK: - [P1:X].[layout: _NativeClass] => [P1:X]
36- // CHECK: - [P2:X].[layout: _NativeClass] => [P2:X]
37- // CHECK: - τ_0_0.[P2:X] => τ_0_0.[P1:X]
38- // CHECK: - τ_0_0.[P1:X].[superclass: Generic<Int, τ_0_0.[P1:A1], τ_0_0.[P1:B1]>] => τ_0_0.[P1:X]
39- // CHECK: - τ_0_0.[P1:X].[superclass: Generic<Int, String, τ_0_0.[P1:B1]>] => τ_0_0.[P1:X]
40- // CHECK: - τ_0_0.[P2:A2].[concrete: Int] => τ_0_0.[P2:A2]
41- // CHECK: - τ_0_0.[P2:B2] => τ_0_0.[P1:B1]
42- // CHECK: - τ_0_0.[P1:A1].[concrete: String] => τ_0_0.[P1:A1]
43- // CHECK: - τ_0_0.B2 => τ_0_0.[P1:B1]
44- // CHECK: }
45- // CHECK: Property map: {
46- // CHECK-NEXT: [P1] => { conforms_to: [P1] }
47- // CHECK-NEXT: [P1:X] => { layout: _NativeClass superclass: [superclass: Derived<[P1:A1], [P1:B1]>] }
48- // CHECK-NEXT: [P2] => { conforms_to: [P2] }
49- // CHECK-NEXT: [P2:X] => { layout: _NativeClass superclass: [superclass: Generic<[P2:A2], String, [P2:B2]>] }
50- // CHECK-NEXT: τ_0_0 => { conforms_to: [P1 P2] }
51- // CHECK-NEXT: τ_0_0.[P1:X] => { layout: _NativeClass superclass: [superclass: Derived<τ_0_0.[P1:A1], τ_0_0.[P1:B1]>] }
52- // CHECK-NEXT: τ_0_0.[P2:A2] => { concrete_type: [concrete: Int] }
53- // CHECK-NEXT: τ_0_0.[P1:A1] => { concrete_type: [concrete: String] }
54- // CHECK-NEXT: }
39+ // CHECK-RULE- LABEL: Requirement machine for <τ_0_0 where τ_0_0 : P1, τ_0_0 : P2>
40+ // CHECK-RULE- NEXT: Rewrite system: {
41+ // CHECK-RULE : - [P1:X].[layout: _NativeClass] => [P1:X]
42+ // CHECK-RULE : - [P2:X].[layout: _NativeClass] => [P2:X]
43+ // CHECK-RULE : - τ_0_0.[P2:X] => τ_0_0.[P1:X]
44+ // CHECK-RULE : - τ_0_0.[P1:X].[superclass: Generic<Int, τ_0_0.[P1:A1], τ_0_0.[P1:B1]>] => τ_0_0.[P1:X]
45+ // CHECK-RULE : - τ_0_0.[P1:X].[superclass: Generic<Int, String, τ_0_0.[P1:B1]>] => τ_0_0.[P1:X]
46+ // CHECK-RULE : - τ_0_0.[P2:A2].[concrete: Int] => τ_0_0.[P2:A2]
47+ // CHECK-RULE : - τ_0_0.[P2:B2] => τ_0_0.[P1:B1]
48+ // CHECK-RULE : - τ_0_0.[P1:A1].[concrete: String] => τ_0_0.[P1:A1]
49+ // CHECK-RULE : - τ_0_0.B2 => τ_0_0.[P1:B1]
50+ // CHECK-RULE : }
51+ // CHECK-RULE : Property map: {
52+ // CHECK-RULE- NEXT: [P1] => { conforms_to: [P1] }
53+ // CHECK-RULE- NEXT: [P1:X] => { layout: _NativeClass superclass: [superclass: Derived<[P1:A1], [P1:B1]>] }
54+ // CHECK-RULE- NEXT: [P2] => { conforms_to: [P2] }
55+ // CHECK-RULE- NEXT: [P2:X] => { layout: _NativeClass superclass: [superclass: Generic<[P2:A2], String, [P2:B2]>] }
56+ // CHECK-RULE- NEXT: τ_0_0 => { conforms_to: [P1 P2] }
57+ // CHECK-RULE- NEXT: τ_0_0.[P1:X] => { layout: _NativeClass superclass: [superclass: Derived<τ_0_0.[P1:A1], τ_0_0.[P1:B1]>] }
58+ // CHECK-RULE- NEXT: τ_0_0.[P2:A2] => { concrete_type: [concrete: Int] }
59+ // CHECK-RULE- NEXT: τ_0_0.[P1:A1] => { concrete_type: [concrete: String] }
60+ // CHECK-RULE- NEXT: }
0 commit comments