@@ -8,7 +8,7 @@ struct GenericTangentVectorMember<T: Differentiable>: Differentiable,
88 var x : T . TangentVector
99}
1010
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
1212// CHECK-AST: internal var x: T.TangentVector
1313// CHECK-AST: internal init(x: T.TangentVector)
1414// CHECK-AST: internal typealias TangentVector = GenericTangentVectorMember<T>
@@ -62,15 +62,15 @@ final class AdditiveArithmeticClass<T: AdditiveArithmetic & Differentiable>: Add
6262
6363// CHECK-AST-LABEL: final internal class AdditiveArithmeticClass<T> : AdditiveArithmetic, Differentiable where T : AdditiveArithmetic, T : Differentiable {
6464// 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)}}
6666// CHECK-AST: }
6767
6868@frozen
6969public struct FrozenStruct : Differentiable { }
7070
7171// CHECK-AST-LABEL: @frozen public struct FrozenStruct : Differentiable {
7272// CHECK-AST: internal init()
73- // CHECK-AST: @frozen public struct TangentVector : Differentiable, AdditiveArithmetic {
73+ // CHECK-AST: @frozen public struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} {
7474
7575@usableFromInline
7676struct UsableFromInlineStruct : Differentiable { }
@@ -79,7 +79,7 @@ struct UsableFromInlineStruct: Differentiable {}
7979// CHECK-AST: struct UsableFromInlineStruct : Differentiable {
8080// CHECK-AST: internal init()
8181// CHECK-AST: @usableFromInline
82- // CHECK-AST: struct TangentVector : Differentiable, AdditiveArithmetic {
82+ // CHECK-AST: struct TangentVector : {{( Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} {
8383
8484// Test property wrappers.
8585
@@ -96,7 +96,7 @@ struct WrappedPropertiesStruct: Differentiable {
9696}
9797
9898// 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)}} {
100100// CHECK-AST: internal var x: Float.TangentVector
101101// CHECK-AST: internal var y: Float.TangentVector
102102// CHECK-AST: internal var z: Float.TangentVector
@@ -111,9 +111,48 @@ class WrappedPropertiesClass: Differentiable {
111111}
112112
113113// 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)}} {
115115// CHECK-AST: internal var x: Float.TangentVector
116116// CHECK-AST: internal var y: Float.TangentVector
117117// CHECK-AST: internal var z: Float.TangentVector
118118// CHECK-AST: }
119119// 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