Files
swift-mirror/test/Generics/tuple-conformances.swift
Daniel Rodríguez Troitiño ba68faaed5 [test] Mark tests that use experimental/upcoming features as such
Find all the usages of `--enable-experimental-feature` or
`--enable-upcoming-feature` in the tests and replace some of the
`REQUIRES: asserts` to use `REQUIRES: swift-feature-Foo` instead, which
should correctly apply to depending on the asserts/noasserts mode of the
toolchain for each feature.

Remove some comments that talked about enabling asserts since they don't
apply anymore (but I might had miss some).

All this was done with an automated script, so some formatting weirdness
might happen, but I hope I fixed most of those.

There might be some tests that were `REQUIRES: asserts` that might run
in `noasserts` toolchains now. This will normally be because their
feature went from experimental to upcoming/base and the tests were not
updated.
2024-11-02 11:46:46 -07:00

127 lines
4.1 KiB
Swift

// RUN: %target-typecheck-verify-swift -enable-experimental-feature TupleConformances
// REQUIRES: swift_feature_TupleConformances
extension () {
// expected-error@-1 {{tuple extension must be written as extension of '(repeat each Element)'}}
// expected-error@-2 {{tuple extension must declare conformance to exactly one protocol}}
struct Nested {}
// expected-error@-1 {{type 'Nested' cannot be nested in tuple extension}}
}
typealias BadTuple<each Horse> = (repeat each Horse, Int)
extension BadTuple {}
// expected-error@-1 {{tuple extension must be written as extension of '(repeat each Horse)'}}
// expected-error@-2 {{tuple extension must declare conformance to exactly one protocol}}
typealias Tuple<each Element> = (repeat each Element)
protocol Q {}
class C {}
extension Tuple: Q where repeat each Element: Collection, repeat (each Element).Element == (each Element).Index, repeat (each Element).Indices: AnyObject, repeat (each Element).SubSequence: C {}
// expected-error@-1 {{tuple extension must require that 'each Element' conforms to 'Q'}}
// expected-error@-2 {{tuple extension cannot require that 'each Element' conforms to 'Collection'}}
// expected-error@-3 {{tuple extension cannot require that '(each Element).Element' is the same type as '(each Element).Index'}}
// expected-error@-4 {{tuple extension cannot require that '(each Element).Indices' conforms to 'AnyObject'}}
// expected-error@-5 {{tuple extension cannot require that '(each Element).SubSequence' subclasses 'C'}}
protocol Base1 {}
protocol Derived1: Base1 {}
extension Tuple: Derived1 where repeat each Element: Derived1 {}
// expected-error@-1 {{conditional conformance of type '(repeat each Element)' to protocol 'Derived1' does not imply conformance to inherited protocol 'Base1'}}
// expected-note@-2 {{did you mean to explicitly state the conformance with relaxed bounds using 'where each Element: Base1'?}}
// expected-note@-3 {{did you mean to explicitly state the conformance with the same bounds using 'where repeat each Element: Derived1'?}}
// expected-note@-4 {{did you mean to explicitly state the conformance with different bounds?}}
// expected-error@-5 {{tuple extension must declare conformance to exactly one protocol}}
protocol Base2 {}
protocol Derived2: Base2 {}
extension Tuple: Derived2 {}
// expected-error@-1 {{tuple extension must declare conformance to exactly one protocol}} // FIXME: crappy error
////
protocol P2 {}
typealias FancyTuple1<each Cat: P2> = (repeat each Cat)
extension FancyTuple1: P2 {}
protocol P3 {}
typealias FancyTuple2<each Cat: C> = (repeat each Cat)
extension FancyTuple2: P3 {}
// expected-error@-1 {{tuple extension cannot require that 'each Cat' subclasses 'C'}}
// expected-error@-2 {{tuple extension must require that 'each Cat' conforms to 'P3'}}
////
protocol P {
associatedtype A
associatedtype B
func f()
}
extension Tuple: P where repeat each Element: P {
typealias A = (repeat (each Element).A)
typealias B = (repeat (each Element).B)
func f() {}
}
extension Int: P {
typealias A = Int
typealias B = String
func f() {}
}
func returnsPA<T: P>(_: T) -> T.A.Type {}
func returnsPB<T: P>(_: T) -> T.B.Type {}
func same<T>(_: T, _: T) {}
func useConformance() {
same(returnsPA((1, 2, 3)), (Int, Int, Int).self)
same(returnsPB((1, 2, 3)), (String, String, String).self)
(1, 2, 3).f()
}
////
extension Tuple: Equatable where repeat each Element: Equatable {
// FIXME: Hack
@_disfavoredOverload
public static func ==(lhs: Self, rhs: Self) -> Bool {
for (l, r) in repeat (each lhs, each rhs) {
if l != r { return false }
}
return true
}
}
extension Tuple: Hashable where repeat each Element: Hashable {
public func hash(into hasher: inout Hasher) {
for elt in repeat each self {
elt.hash(into: &hasher)
}
}
}
extension Tuple: Comparable where repeat each Element: Comparable {
// FIXME: Hack
@_disfavoredOverload
public static func <(lhs: Self, rhs: Self) -> Bool {
for (l, r) in repeat (each lhs, each rhs) {
if l > r { return false }
if l < r { return true }
}
return false
}
}