| // 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 {} |