mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
If the type used in for-each loop doesn't conform to `Sequence` let's not try to diagnose anything about its element since such diagnostics would include unresolved types and actual problem (missing conformance) would already be diagnosed.
64 lines
3.1 KiB
Swift
64 lines
3.1 KiB
Swift
// RUN: %target-typecheck-verify-swift
|
|
|
|
infix operator •
|
|
|
|
protocol Runcible { func runce() }
|
|
protocol Fungible { func funge() }
|
|
protocol Ansible { func anse() }
|
|
|
|
protocol NeedsGenericMethods {
|
|
func oneArgNoConstraints<T>(x : T) // expected-note {{protocol requires function 'oneArgNoConstraints(x:)' with type '<T> (x: T) -> ()'}}
|
|
func oneArgWithConstraint<T : Runcible>(x: T) // expected-note {{protocol requires function 'oneArgWithConstraint(x:)' with type '<T> (x: T) -> ()'}}
|
|
func oneArgWithConstraints<T : Runcible & Fungible>(x: T) // expected-note {{protocol requires function 'oneArgWithConstraints(x:)' with type '<T> (x: T) -> ()'}}
|
|
|
|
func twoArgsOneVar<T>(x: T, y: T) // expected-note {{protocol requires function 'twoArgsOneVar(x:y:)' with type '<T> (x: T, y: T) -> ()'}}
|
|
func twoArgsTwoVars<T, U>(x: T, y: U) // expected-note {{protocol requires function 'twoArgsTwoVars(x:y:)' with type '<T, U> (x: T, y: U) -> ()'}}
|
|
|
|
static func •<T : Fungible>(x: Self, y: T) // expected-note {{protocol requires function '•' with type '<T> (TooTightConstraints, T) -> ()'}}
|
|
}
|
|
|
|
class EqualConstraints : NeedsGenericMethods {
|
|
func oneArgNoConstraints<U>(x: U) {}
|
|
func oneArgWithConstraint<U : Runcible>(x: U) {}
|
|
func oneArgWithConstraints<U : Fungible & Runcible>(x: U) {}
|
|
|
|
func twoArgsOneVar<U>(x: U, y: U) {}
|
|
func twoArgsTwoVars<V, U>(x: U, y: V) {}
|
|
}
|
|
func •<T : Fungible>(x: EqualConstraints, y: T) {} // expected-note {{candidate has non-matching type '<T where T : Fungible> (EqualConstraints, T) -> ()'}}
|
|
|
|
class LooseConstraints : NeedsGenericMethods {
|
|
func oneArgNoConstraints<U>(x: U) {}
|
|
func oneArgWithConstraint<U>(x: U) {}
|
|
func oneArgWithConstraints<U : Fungible>(x: U) {}
|
|
|
|
func twoArgsOneVar<V, U>(x: U, y: V) {}
|
|
func twoArgsTwoVars<V, U>(x: U, y: V) {}
|
|
}
|
|
func •<T>(_ x: LooseConstraints, y: T) {} // expected-note {{candidate has non-matching type '<T> (LooseConstraints, T) -> ()'}}
|
|
|
|
class TooTightConstraints : NeedsGenericMethods { // expected-error{{type 'TooTightConstraints' does not conform to protocol 'NeedsGenericMethods'}}
|
|
func oneArgNoConstraints<U : Runcible>(x: U) {} // expected-note{{candidate has non-matching type '<U> (x: U) -> ()'}}
|
|
func oneArgWithConstraint<U : Fungible>(x: U) {} // expected-note{{candidate has non-matching type '<U> (x: U) -> ()'}}
|
|
func oneArgWithConstraints<U : Runcible & Fungible & Ansible>(x: U) {} // expected-note{{candidate has non-matching type '<U> (x: U) -> ()'}}
|
|
|
|
func twoArgsOneVar<U : Runcible>(x: U) {}
|
|
func twoArgsTwoVars<U>(x: U, y: U) {} // expected-note{{candidate has non-matching type '<U> (x: U, y: U) -> ()'}}
|
|
}
|
|
func •(_ x: TooTightConstraints, y: Int) {} // expected-note {{candidate has non-matching type '(TooTightConstraints, Int) -> ()'}}
|
|
|
|
// Regression test for a crash when resolving a reference to a generic method
|
|
// in a protocol.
|
|
protocol NeedsAGenericMethod {
|
|
func method<T>(_ x: T)
|
|
}
|
|
func usesAGenericMethod<U : NeedsAGenericMethod>(_ x: U) {
|
|
x.method(5)
|
|
}
|
|
|
|
struct L<T>: Sequence {} // expected-error {{type 'L<T>' does not conform to protocol 'Sequence'}}
|
|
|
|
func z(_ x: L<Int>) {
|
|
for xx in x {}
|
|
}
|