mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
These two declarations are now equivalent:
protocol P : SomeClass { ... }
protocol P where Self : SomeClass { ... }
There's a long, complicated story here:
- Swift 4.2 rejected classes in the inheritance clause of a
protocol, but it accepted the 'where' clause form, even
though it didn't always work and would sometimes crash
- Recently we got the inheritance clause form working, and
added a diagnostic to ban the 'where' clause form, because
we thought it would simplify name lookup to not have to
consider the 'where' clause
- However, we already had to support looking at the 'where'
clause from name lookup anyway, because you could write
extension P where Self : SomeClass { ... }
- It turns out that despite the crashes, protocols with
'Self' constraints were already common enough that it was
worth supporting the existing behavior, instead of banning
it
Fixes <rdar://problem/43028442>.
33 lines
907 B
Swift
33 lines
907 B
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
// rdar://problem/31401161
|
|
class C1 {}
|
|
|
|
protocol P1 {
|
|
associatedtype Element
|
|
}
|
|
|
|
protocol P2 : P1 {
|
|
associatedtype SubSequence : P1 // expected-note{{'SubSequence' declared here}}
|
|
}
|
|
|
|
protocol P3 : P2 {
|
|
associatedtype SubSequence : P2 // expected-warning{{redeclaration of associated type 'SubSequence' from protocol 'P2' is better expressed as a 'where' clause on the protocol}}
|
|
}
|
|
|
|
func foo<S>(_: S) where S.SubSequence.Element == C1, S : P3 {}
|
|
|
|
protocol SelfWhereClause where Self: AnyObject {}
|
|
|
|
func takesAnyObject<T : AnyObject>(_: T) {}
|
|
func takesSelfWhereClause<T : SelfWhereClause>(_ t: T) {
|
|
takesAnyObject(t)
|
|
}
|
|
|
|
class AlsoBad {}
|
|
|
|
protocol InvalidWhereClause2 {
|
|
associatedtype T where Self: AlsoBad
|
|
// expected-error@-1 {{constraint with subject type of 'Self' is not supported; consider adding requirement to protocol inheritance clause instead}}
|
|
}
|