@@ -8,7 +8,7 @@ struct GenericTangentVectorMember<T: Differentiable>: Differentiable,
8
8
var x : T . TangentVector
9
9
}
10
10
11
- // CHECK-AST-LABEL: internal struct GenericTangentVectorMember<T> : Differentiable, AdditiveArithmetic where T : Differentiable
11
+ // CHECK-AST-LABEL: internal struct GenericTangentVectorMember<T> : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} where T : Differentiable
12
12
// CHECK-AST: internal var x: T.TangentVector
13
13
// CHECK-AST: internal init(x: T.TangentVector)
14
14
// CHECK-AST: internal typealias TangentVector = GenericTangentVectorMember<T>
@@ -62,15 +62,15 @@ final class AdditiveArithmeticClass<T: AdditiveArithmetic & Differentiable>: Add
62
62
63
63
// CHECK-AST-LABEL: final internal class AdditiveArithmeticClass<T> : AdditiveArithmetic, Differentiable where T : AdditiveArithmetic, T : Differentiable {
64
64
// CHECK-AST: final internal var x: T, y: T
65
- // CHECK-AST: internal struct TangentVector : Differentiable, AdditiveArithmetic
65
+ // CHECK-AST: internal struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}}
66
66
// CHECK-AST: }
67
67
68
68
@frozen
69
69
public struct FrozenStruct : Differentiable { }
70
70
71
71
// CHECK-AST-LABEL: @frozen public struct FrozenStruct : Differentiable {
72
72
// CHECK-AST: internal init()
73
- // CHECK-AST: @frozen public struct TangentVector : Differentiable, AdditiveArithmetic {
73
+ // CHECK-AST: @frozen public struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} {
74
74
75
75
@usableFromInline
76
76
struct UsableFromInlineStruct : Differentiable { }
@@ -79,7 +79,7 @@ struct UsableFromInlineStruct: Differentiable {}
79
79
// CHECK-AST: struct UsableFromInlineStruct : Differentiable {
80
80
// CHECK-AST: internal init()
81
81
// CHECK-AST: @usableFromInline
82
- // CHECK-AST: struct TangentVector : Differentiable, AdditiveArithmetic {
82
+ // CHECK-AST: struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} {
83
83
84
84
// Test property wrappers.
85
85
@@ -96,7 +96,7 @@ struct WrappedPropertiesStruct: Differentiable {
96
96
}
97
97
98
98
// CHECK-AST-LABEL: internal struct WrappedPropertiesStruct : Differentiable {
99
- // CHECK-AST: internal struct TangentVector : Differentiable, AdditiveArithmetic {
99
+ // CHECK-AST: internal struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} {
100
100
// CHECK-AST: internal var x: Float.TangentVector
101
101
// CHECK-AST: internal var y: Float.TangentVector
102
102
// CHECK-AST: internal var z: Float.TangentVector
@@ -111,9 +111,48 @@ class WrappedPropertiesClass: Differentiable {
111
111
}
112
112
113
113
// CHECK-AST-LABEL: internal class WrappedPropertiesClass : Differentiable {
114
- // CHECK-AST: internal struct TangentVector : Differentiable, AdditiveArithmetic {
114
+ // CHECK-AST: internal struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} {
115
115
// CHECK-AST: internal var x: Float.TangentVector
116
116
// CHECK-AST: internal var y: Float.TangentVector
117
117
// CHECK-AST: internal var z: Float.TangentVector
118
118
// CHECK-AST: }
119
119
// CHECK-AST: }
120
+
121
+ protocol TangentVectorMustBeEncodable : Differentiable where TangentVector: Encodable { }
122
+
123
+ struct AutoDeriveEncodableTV1 : TangentVectorMustBeEncodable {
124
+ var x : Float
125
+ }
126
+
127
+ // CHECK-AST-LABEL: internal struct AutoDeriveEncodableTV1 : TangentVectorMustBeEncodable {
128
+ // CHECK-AST: internal struct TangentVector : {{(Encodable, Differentiable, AdditiveArithmetic)|(Encodable, AdditiveArithmetic, Differentiable)|(Differentiable, Encodable, AdditiveArithmetic)|(AdditiveArithmetic, Encodable, Differentiable)|(Differentiable, AdditiveArithmetic, Encodable)|(AdditiveArithmetic, Differentiable, Encodable)}} {
129
+
130
+ struct AutoDeriveEncodableTV2 {
131
+ var x : Float
132
+ }
133
+
134
+ extension AutoDeriveEncodableTV2 : TangentVectorMustBeEncodable { }
135
+
136
+ // CHECK-AST-LABEL: extension AutoDeriveEncodableTV2 : TangentVectorMustBeEncodable {
137
+ // CHECK-AST: internal struct TangentVector : {{(Encodable, Differentiable, AdditiveArithmetic)|(Encodable, AdditiveArithmetic, Differentiable)|(Differentiable, Encodable, AdditiveArithmetic)|(AdditiveArithmetic, Encodable, Differentiable)|(Differentiable, AdditiveArithmetic, Encodable)|(AdditiveArithmetic, Differentiable, Encodable)}} {
138
+
139
+ protocol TangentVectorP : Differentiable {
140
+ var requirement : Int { get }
141
+ }
142
+
143
+ protocol TangentVectorConstrained : Differentiable where TangentVector: TangentVectorP { }
144
+
145
+ struct StructWithTangentVectorConstrained : TangentVectorConstrained {
146
+ var x : Float
147
+ }
148
+
149
+ // `extension StructWithTangentVectorConstrained.TangentVector: TangentVectorP` gives
150
+ // "error: type 'StructWithTangentVectorConstrained.TangentVector' does not conform to protocol 'TangentVectorP'",
151
+ // maybe because it typechecks the conformance before seeing the extension. But this roundabout way
152
+ // of stating the same thing works.
153
+ extension TangentVectorP where Self == StructWithTangentVectorConstrained . TangentVector {
154
+ var requirement : Int { 42 }
155
+ }
156
+
157
+ // CHECK-AST-LABEL: internal struct StructWithTangentVectorConstrained : TangentVectorConstrained {
158
+ // CHECK-AST: internal struct TangentVector : {{(TangentVectorP, Differentiable, AdditiveArithmetic)|(TangentVectorP, AdditiveArithmetic, Differentiable)|(Differentiable, TangentVectorP, AdditiveArithmetic)|(AdditiveArithmetic, TangentVectorP, Differentiable)|(Differentiable, AdditiveArithmetic, TangentVectorP)|(AdditiveArithmetic, Differentiable, TangentVectorP)}} {
0 commit comments