// RUN: %target-parse-verify-swift // Simple subscript of arrays: func simpleSubscript(array: [Float], x: Int) -> Float { _ = array[x] return array[x] } // Subscript of archetype. protocol IntToStringSubscript { subscript (i : Int) -> String { get } } class LameDictionary { subscript (i : Int) -> String { get { return String(i) } } } func archetypeSubscript(t: T, u: U) -> String { // Subscript an archetype. if false { return t[17] } // Subscript an archetype for which the subscript operator is in a base class. return u[17] } // Subscript of existential type. func existentialSubscript(a: IntToStringSubscript) -> String { return a[17] } class MyDictionary { subscript (key : Key) -> Value { get {} } } class MyStringToInt : MyDictionary { } // Subscript of generic type. func genericSubscript(t: T, array: Array, i2i: MyDictionary, t2i: MyDictionary, s2i: MyStringToInt<()>) -> Int { if true { return array[5] } if true { return i2i[5] } if true { return t2i[t] } return s2i["hello"] } // QoI: Poor error message for ambiguous subscript call extension String { func number() -> Int { } // expected-note {{found this candidate}} func number() -> Double { } // expected-note {{found this candidate}} } let _ = "a".number // expected-error {{ambiguous use of 'number()'}} extension Int { subscript(key: String) -> Int { get {} } // expected-note {{found this candidate}} subscript(key: String) -> Double { get {} } // expected-note {{found this candidate}} } let _ = 1["1"] // expected-error {{ambiguous use of 'subscript'}} // rdar://17687826 - QoI: error message when reducing to an untyped dictionary isn't helpful let squares = [ 1, 2, 3 ].reduce([:]) { (dict, n) in // expected-error {{expression type '[_ : _]' is ambiguous without more context}} var dict = dict dict[n] = n * n return dict } // QoI: Misleading error message when assigning a value from [String : AnyObject] func r23670252(dictionary: [String : AnyObject], someObject: AnyObject) { let color : String? color = dictionary["color"] // expected-error {{cannot assign value of type 'AnyObject?' to type 'String?'}} _ = color } // SR-718 - Type mismatch reported as extraneous parameter struct SR718 { subscript(b : Int) -> Int { return 0 } subscript(a a : UInt) -> Int { return 0 } } SR718()[a: Int()] // expected-error {{cannot convert value of type 'Int' to expected argument type 'UInt'}}