blob: 4075c986047dddab842428772f83939e60206dc4 [file] [log] [blame]
// RUN: %target-swift-frontend -print-ast %s | %FileCheck %s --check-prefix=CHECK-AST
import _Differentiation
struct GenericTangentVectorMember<T: Differentiable>: Differentiable,
AdditiveArithmetic
{
var x: T.TangentVector
}
// CHECK-AST-LABEL: internal struct GenericTangentVectorMember<T> : {{(Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}} where T : Differentiable
// CHECK-AST: internal var x: T.TangentVector
// CHECK-AST: internal init(x: T.TangentVector)
// CHECK-AST: internal typealias TangentVector = GenericTangentVectorMember<T>
// CHECK-AST: internal static var zero: GenericTangentVectorMember<T> { get }
// CHECK-AST: internal static func + (lhs: GenericTangentVectorMember<T>, rhs: GenericTangentVectorMember<T>) -> GenericTangentVectorMember<T>
// CHECK-AST: internal static func - (lhs: GenericTangentVectorMember<T>, rhs: GenericTangentVectorMember<T>) -> GenericTangentVectorMember<T>
// CHECK-AST: @_implements(Equatable, ==(_:_:)) internal static func __derived_struct_equals(_ a: GenericTangentVectorMember<T>, _ b: GenericTangentVectorMember<T>) -> Bool
public struct ConditionallyDifferentiable<T> {
public var x: T
}
extension ConditionallyDifferentiable: Differentiable where T: Differentiable {}
// CHECK-AST-LABEL: public struct ConditionallyDifferentiable<T> {
// CHECK-AST: @differentiable(wrt: self where T : Differentiable)
// CHECK-AST: public var x: T
// CHECK-AST: internal init(x: T)
// CHECK-AST: }
// Verify that `TangentVector` is not synthesized to be `Self` for
// `AdditiveArithmetic`-conforming classes.
final class AdditiveArithmeticClass<T: AdditiveArithmetic & Differentiable>: AdditiveArithmetic,
Differentiable
{
var x, y: T
init(x: T, y: T) {
self.x = x
self.y = y
}
// Dummy `AdditiveArithmetic` requirements.
static func == (lhs: AdditiveArithmeticClass, rhs: AdditiveArithmeticClass)
-> Bool
{
fatalError()
}
static var zero: AdditiveArithmeticClass {
fatalError()
}
static func + (lhs: AdditiveArithmeticClass, rhs: AdditiveArithmeticClass)
-> Self
{
fatalError()
}
static func - (lhs: AdditiveArithmeticClass, rhs: AdditiveArithmeticClass)
-> Self
{
fatalError()
}
}
// CHECK-AST-LABEL: final internal class AdditiveArithmeticClass<T> : AdditiveArithmetic, Differentiable where T : AdditiveArithmetic, T : Differentiable {
// CHECK-AST: final internal var x: T, y: T
// CHECK-AST: internal struct TangentVector : {{(Differentiable, AdditiveArithmetic)|(AdditiveArithmetic, Differentiable)}}
// CHECK-AST: }
@frozen
public struct FrozenStruct: Differentiable {}
// CHECK-AST-LABEL: @frozen public struct FrozenStruct : Differentiable {
// CHECK-AST: internal init()
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: @frozen public struct TangentVector {{(([:,] (Differentiable|AdditiveArithmetic|PointwiseMultiplicative|ElementaryFunctions)){4})}} {
// SWIFT_ENABLE_TENSORFLOW END
@usableFromInline
struct UsableFromInlineStruct: Differentiable {}
// CHECK-AST-LABEL: @usableFromInline
// CHECK-AST: struct UsableFromInlineStruct : Differentiable {
// CHECK-AST: internal init()
// CHECK-AST: @usableFromInline
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: struct TangentVector {{([:,] (Differentiable|AdditiveArithmetic|PointwiseMultiplicative|ElementaryFunctions)){4} }}{
// SWIFT_ENABLE_TENSORFLOW END
// Test property wrappers.
@propertyWrapper
struct Wrapper<Value> {
var wrappedValue: Value
}
struct WrappedPropertiesStruct: Differentiable {
@Wrapper @Wrapper var x: Float
@Wrapper var y: Float
var z: Float
@noDerivative @Wrapper var nondiff: Float
}
// CHECK-AST-LABEL: internal struct WrappedPropertiesStruct : Differentiable {
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: internal struct TangentVector {{([:,] (Differentiable|AdditiveArithmetic|VectorProtocol|ElementaryFunctions)){4} }}{
// SWIFT_ENABLE_TENSORFLOW END
// CHECK-AST: internal var x: Float.TangentVector
// CHECK-AST: internal var y: Float.TangentVector
// CHECK-AST: internal var z: Float.TangentVector
// CHECK-AST: }
// CHECK-AST: }
class WrappedPropertiesClass: Differentiable {
@Wrapper @Wrapper var x: Float = 1
@Wrapper var y: Float = 2
var z: Float = 3
@noDerivative @Wrapper var noDeriv: Float = 4
}
// CHECK-AST-LABEL: internal class WrappedPropertiesClass : Differentiable {
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: internal struct TangentVector {{([:,] (Differentiable|AdditiveArithmetic|VectorProtocol|ElementaryFunctions)){4} }}{
// SWIFT_ENABLE_TENSORFLOW END
// CHECK-AST: internal var x: Float.TangentVector
// CHECK-AST: internal var y: Float.TangentVector
// CHECK-AST: internal var z: Float.TangentVector
// CHECK-AST: }
// CHECK-AST: }
protocol TangentVectorMustBeEncodable: Differentiable where TangentVector: Encodable {}
struct AutoDeriveEncodableTV1: TangentVectorMustBeEncodable {
var x: Float
}
// CHECK-AST-LABEL: internal struct AutoDeriveEncodableTV1 : TangentVectorMustBeEncodable {
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: internal struct TangentVector {{([:,] (Differentiable|AdditiveArithmetic|VectorProtocol|ElementaryFunctions|Encodable)){5} }}{
// SWIFT_ENABLE_TENSORFLOW END
struct AutoDeriveEncodableTV2 {
var x: Float
}
extension AutoDeriveEncodableTV2: TangentVectorMustBeEncodable {}
// CHECK-AST-LABEL: extension AutoDeriveEncodableTV2 : TangentVectorMustBeEncodable {
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: internal struct TangentVector {{([:,] (Differentiable|AdditiveArithmetic|VectorProtocol|ElementaryFunctions|Encodable)){5} }}{
// SWIFT_ENABLE_TENSORFLOW END
protocol TangentVectorP: Differentiable {
var requirement: Int { get }
}
protocol TangentVectorConstrained: Differentiable where TangentVector: TangentVectorP {}
struct StructWithTangentVectorConstrained: TangentVectorConstrained {
var x: Float
}
// `extension StructWithTangentVectorConstrained.TangentVector: TangentVectorP` gives
// "error: type 'StructWithTangentVectorConstrained.TangentVector' does not conform to protocol 'TangentVectorP'",
// maybe because it typechecks the conformance before seeing the extension. But this roundabout way
// of stating the same thing works.
extension TangentVectorP where Self == StructWithTangentVectorConstrained.TangentVector {
var requirement: Int { 42 }
}
// CHECK-AST-LABEL: internal struct StructWithTangentVectorConstrained : TangentVectorConstrained {
// SWIFT_ENABLE_TENSORFLOW
// CHECK-AST: internal struct TangentVector {{([:,] (Differentiable|AdditiveArithmetic|VectorProtocol|ElementaryFunctions|TangentVectorP)){5} }}{
// SWIFT_ENABLE_TENSORFLOW END