blob: 8d64c6fe886c9979f77b345fe65f37112c349012 [file] [log] [blame]
// SWIFT_ENABLE_TENSORFLOW
// RUN: %target-swift-frontend -typecheck -verify -primary-file %s %S/Inputs/struct_pointwise_multiplicative_other_module.swift
func testPointwiseMultiplicative<T : PointwiseMultiplicative>(
_ x: inout T
) {
// Test `PointwiseMultiplicative` requirements: `one`, `.*`.
let one = T.one
x .*= x .* one
}
struct Empty : PointwiseMultiplicative {}
func testEmpty() {
var empty = Empty()
testPointwiseMultiplicative(&empty)
}
// Test generic type.
struct Vector2<T : PointwiseMultiplicative>: PointwiseMultiplicative {
var x: T
var y: T
}
func testVector2() {
var vec2 = Vector2<Empty>(x: Empty(), y: Empty.one)
testPointwiseMultiplicative(&vec2)
}
// Test nested type.
struct Nested: PointwiseMultiplicative {
var empty: Empty
var vec2: Vector2<Empty>
}
func testNested(vec2: Vector2<Empty>) {
var nested = Nested(empty: Empty(), vec2: vec2)
testPointwiseMultiplicative(&nested)
}
// Test type in generic context.
struct A<T> {
struct B<U, V> {
struct GenericContextNested : PointwiseMultiplicative {
var empty: Empty
var nested: Nested
}
}
}
func testGenericContext<T, U, V>(nested: Nested) -> A<T>.B<U, V>.GenericContextNested {
var genericNested =
A<T>.B<U, V>.GenericContextNested(empty: Empty(), nested: nested)
testPointwiseMultiplicative(&genericNested)
return genericNested
}
// Test extension.
struct Extended {
var empty: Empty
}
extension Extended : Equatable, AdditiveArithmetic, PointwiseMultiplicative {}
// Test extension of generic type.
struct GenericExtended<T> {
var x: T
}
extension GenericExtended : Equatable, AdditiveArithmetic, PointwiseMultiplicative
where T : PointwiseMultiplicative {}
// Test memberwise initializer synthesis.
struct NoMemberwiseInitializer<T : PointwiseMultiplicative> : PointwiseMultiplicative {
var value: T
init(randomLabel value: T) { self.value = value }
}
struct NoMemberwiseInitializerCustomOne: PointwiseMultiplicative {
var x: Empty
static var one: Self { return NoMemberwiseInitializerCustomOne(Empty()) }
init(_ x: Empty) {
self.x = x
}
}
struct NoMemberwiseInitializerExtended<T> {
var value: T
init(_ value: T) {
self.value = value
}
}
extension NoMemberwiseInitializerExtended: Equatable, AdditiveArithmetic, PointwiseMultiplicative
where T : PointwiseMultiplicative {}
// Test derived conformances in disallowed contexts.
// expected-error @+1 3 {{extension outside of file declaring struct 'OtherFileNonconforming' prevents automatic synthesis of}}
extension OtherFileNonconforming : PointwiseMultiplicative {}
// expected-error @+1 3 {{extension outside of file declaring generic struct 'GenericOtherFileNonconforming' prevents automatic synthesis of}}
extension GenericOtherFileNonconforming : PointwiseMultiplicative {}