mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
98 lines
2.7 KiB
Swift
98 lines
2.7 KiB
Swift
// 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 : IntToStringSubscript, U : LameDictionary>(_ 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<Key, Value> {
|
|
subscript (key : Key) -> Value {
|
|
get {}
|
|
}
|
|
}
|
|
|
|
class MyStringToInt<T> : MyDictionary<String, Int> { }
|
|
|
|
// Subscript of generic type.
|
|
func genericSubscript<T>(_ t: T,
|
|
array: Array<Int>,
|
|
i2i: MyDictionary<Int, Int>,
|
|
t2i: MyDictionary<T, Int>,
|
|
s2i: MyStringToInt<()>) -> Int {
|
|
if true { return array[5] }
|
|
if true { return i2i[5] }
|
|
if true { return t2i[t] }
|
|
return s2i["hello"]
|
|
}
|
|
|
|
|
|
|
|
// <rdar://problem/21364448> 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
|
|
}
|
|
|
|
// <rdar://problem/23670252> 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'}}
|
|
|