1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
// RUN: %target-typecheck-verify-swift -swift-version 5
func f0(_ i: Int, _ d: Double) {} // expected-note{{found this candidate}}
func f0(_ d: Double, _ i: Int) {} // expected-note{{found this candidate}}
f0(1, 2) // expected-error{{ambiguous use of 'f0'}}
func f1(_ i: Int16) {} // expected-note{{found this candidate}}
func f1(_ i: Int32) {} // expected-note{{found this candidate}}
f1(0) // expected-error{{ambiguous use of 'f1'}}
infix operator +++
func +++(i: Int, d: Double) {} // expected-note{{found this candidate}}
func +++(d: Double, i: Int) {} // expected-note{{found this candidate}}
1 +++ 2 // expected-error{{ambiguous use of operator '+++'}}
class C {
init(_ action: (Int) -> ()) {}
init(_ action: (Int, Int) -> ()) {}
}
func g(_ x: Int) -> () {} // expected-note{{found this candidate}}
func g(_ x: Int, _ y: Int) -> () {} // expected-note{{found this candidate}}
C(g) // expected-error{{ambiguous use of 'g'}}
func h<T>(_ x: T) -> () {}
_ = C(h) // OK - init(_: (Int) -> ())
func rdar29691909_callee(_ o: AnyObject?) -> Any? { return o } // expected-note {{found this candidate}}
func rdar29691909_callee(_ o: AnyObject) -> Any { return o } // expected-note {{found this candidate}}
func rdar29691909(o: AnyObject) -> Any? {
return rdar29691909_callee(o) // expected-error{{ambiguous use of 'rdar29691909_callee'}}
}
func rdar29907555(_ value: Any!) -> String {
return "\(value)" // expected-warning {{string interpolation produces a debug description for an optional value; did you mean to make this explicit?}}
// expected-note@-1 {{use 'String(describing:)' to silence this warning}}
// expected-note@-2 {{provide a default value to avoid this warning}}
}
// https://github.com/apple/swift/issues/46300
struct S_46300 {
var overloaded: Int! // expected-note {{implicitly unwrapped property 'overloaded' declared here}}
func overloaded(_ x: Int) {}
func overloaded(_ x: Float) {}
func take(_ a: [Any]) {}
func test() {
take([overloaded])
// expected-warning@-1 {{coercion of implicitly unwrappable value of type 'Int?' to 'Any' does not unwrap optional}}
// expected-note@-2 {{provide a default value to avoid this warning}}
// expected-note@-3 {{force-unwrap the value to avoid this warning}}
// expected-note@-4 {{explicitly cast to 'Any' with 'as Any' to silence this warning}}
}
}
// rdar://35116378 - Here the ambiguity is in the pre-check pass; make sure
// we emit a diagnostic instead of crashing.
struct Movie {}
class MoviesViewController {
typealias itemType = Movie // expected-note {{'itemType' declared here}}
let itemType = [Movie].self // expected-note {{'itemType' declared here}}
var items: [Movie] = [Movie]()
func loadData() {
_ = itemType // expected-error {{ambiguous use of 'itemType'}}
}
}
// https://github.com/apple/swift/issues/57380
func f1_57380<T : Numeric>(_ a: T, _ b: T) -> T {
(a + b) / 2 // expected-note {{overloads for '/' exist with these partially matching parameter lists: (Int, Int)}}
// expected-error@-1 {{binary operator '/' cannot be applied to operands of type 'T' and 'Int'}}
}
infix operator %%
func %% (_ lhs: Int, _ rhs: Int) -> Int {
lhs / rhs
}
func %% (_ lhs: Float, _ rhs: Float) -> Float {
lhs / rhs
}
func f2_57380<T : Numeric>(_ a: T, _ b: T) {
(a + b) %% 2 // expected-error {{cannot convert value of type 'T' to expected argument type 'Int'}}
}
// rdar://94360230 - diagnosing 'filter' instead of ambiguity in its body
func test_diagnose_deepest_ambiguity() {
struct S {
func ambiguous(_: Int = 0) -> Bool { true } // expected-note 2 {{found this candidate}}
func ambiguous(_: String = "") -> Bool { true } // expected-note 2 {{found this candidate}}
}
func test_single(arr: [S]) {
arr.filter { $0.ambiguous() } // expected-error {{ambiguous use of 'ambiguous'}}
}
func test_multi(arr: [S]) {
arr.filter {
if true {
print($0.ambiguous()) // expected-error {{ambiguous use of 'ambiguous'}}
}
return true
}
}
}
|