mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Introduce an algorithm to canonicalize and minimize same-type constraints. The algorithm itself computes the equivalence classes that would exist if all explicitly-provided same-type constraints are ignored, and then forms a minimal, canonical set of explicit same-type constraints to reform the actual equivalence class known to the type checker. This should eliminate a number of problems we've seen with inconsistently-chosen same-type constraints affecting canonicalization.
33 lines
935 B
Swift
33 lines
935 B
Swift
// RUN: %target-typecheck-verify-swift -swift-version 4
|
|
|
|
protocol P {
|
|
associatedtype A
|
|
associatedtype B
|
|
|
|
func f<T: P>(_: T) where T.A == Self.A, T.A == Self.B // expected-error{{instance method requirement 'f' cannot add constraint 'Self.A == Self.B' on 'Self'}}
|
|
}
|
|
|
|
extension P {
|
|
func f<T: P>(_: T) where T.A == Self.A, T.A == Self.B { }
|
|
}
|
|
|
|
struct X : P {
|
|
typealias A = X
|
|
typealias B = Int
|
|
}
|
|
|
|
protocol P2 {
|
|
associatedtype A
|
|
|
|
func f<T: P2>(_: T) where T.A == Self.A, T.A: P2 // expected-error{{instance method requirement 'f' cannot add constraint 'Self.A: P2' on 'Self'}}
|
|
}
|
|
|
|
class C { }
|
|
|
|
protocol P3 {
|
|
associatedtype A
|
|
|
|
func f<T: P3>(_: T) where T.A == Self.A, T.A: C // expected-error{{instance method requirement 'f' cannot add constraint 'Self.A: C' on 'Self'}}
|
|
func g<T: P3>(_: T) where T.A: C, T.A == Self.A // expected-error{{instance method requirement 'g' cannot add constraint 'Self.A: C' on 'Self'}}
|
|
}
|