blob: 8fae44bb743df0b60312e57cf88c7afaf3e7d472 [file] [log] [blame]
// RUN: %target-swift-frontend -module-name TestModule -typecheck -verify %s
// Test non-overloaded global function references.
func f1(a: Int, b: Int) -> Int { }
func testF1(a: Int, b: Int) {
_ = f1(a: a, b: a) // okay: direct call requires argument labels
_ = (f1)(a: a, b: a) // okay: direct call requires argument labels
_ = ((f1))(a: a, b: a) // okay: direct call requires argument labels
_ = f1(a:b:)(1, 2) // compound name suppresses argument labels
let _: Int = f1 // expected-error{{cannot convert value of type '(Int, Int) -> Int' to specified type 'Int'}}
}
// Test multiple levels of currying.
func f2(a: Int, b: Int) -> (Int) -> (Int) -> Int { }
func testF2(a: Int, b: Int) {
_ = f2(a: a, b: b)(a) // okay: direct call requires argument labels
_ = f2(a: a, b: b)(a)(b) // okay: direct call requires argument labels
}
// Check throwing functions.
func f3(a: Int, b: Int) throws -> Int { }
func testF3(a: Int, b: Int) {
do {
_ = try f3(a: a, b: a) // okay: direct call requires argument labels
_ = try (f3)(a: a, b: a) // okay: direct call requires argument labels
_ = try ((f3))(a: a, b: a) // okay: direct call requires argument labels
_ = try f3(a:b:)(1, 2) // compound name suppresses argument labels
let i: Int = f3 // expected-error{{cannot convert value of type '(Int, Int) throws -> Int' to specified type 'Int'}}
_ = i
} catch {
}
}
// Test overloaded global function references.
func f4(a: Int, b: Int) -> Int { }
func f4(c: Double, d: Double) -> Double { }
func testF4(a: Int, b: Int, c: Double, d: Double) {
_ = f4(a: a, b: a) // okay: direct call requires argument labels
_ = (f4)(a: a, b: a) // okay: direct call requires argument labels
_ = ((f4))(a: a, b: a) // okay: direct call requires argument labels
_ = f4(c: c, d: d) // okay: direct call requires argument labels
_ = (f4)(c: c, d: d) // okay: direct call requires argument labels
_ = ((f4))(c: c, d: d) // okay: direct call requires argument labels
_ = f4(a:b:)(1, 2) // compound name suppresses argument labels
_ = f4(c:d:)(1.5, 2.5) // compound name suppresses argument labels
let _: (Int, Int) -> Int = f4
let _: (Double, Double) -> Double = f4
let _: (_ x: Int, _ y: Int) -> Int = f4
let _: (_ x: Double, _ y: Double) -> Double = f4
}
// Test module-qualified function references.
func testModuleQualifiedRef(a: Int, b: Int, c: Double, d: Double) {
_ = TestModule.f1(a: a, b: a) // okay: direct call requires argument labels
_ = (TestModule.f1)(a: a, b: a) // okay: direct call requires argument labels
_ = ((TestModule.f1))(a: a, b: a) // okay: direct call requires argument labels
_ = TestModule.f1(a:b:)(1, 2) // compound name suppresses argument labels
let _: Int = TestModule.f1 // expected-error{{cannot convert value of type '(Int, Int) -> Int' to specified type 'Int'}}
_ = TestModule.f4(a: a, b: a) // okay: direct call requires argument labels
_ = (TestModule.f4)(a: a, b: a) // okay: direct call requires argument labels
_ = ((TestModule.f4))(a: a, b: a) // okay: direct call requires argument labels
_ = TestModule.f4(c: c, d: d) // okay: direct call requires argument labels
_ = (TestModule.f4)(c: c, d: d) // okay: direct call requires argument labels
_ = ((TestModule.f4))(c: c, d: d) // okay: direct call requires argument labels
_ = TestModule.f4(a:b:)(1, 2) // compound name suppresses argument labels
_ = TestModule.f4(c:d:)(1.5, 2.5) // compound name suppresses argument labels
let _: (Int, Int) -> Int = TestModule.f4
let _: (Double, Double) -> Double = TestModule.f4
let _: (_ x: Int, _ y: Int) -> Int = TestModule.f4
let _: (_ x: Double, _ y: Double) -> Double = TestModule.f4
}
// Test member references.
struct S0 {
init(a: Int, b: Int) { }
func f1(a: Int, b: Int) -> Int { }
func f2(a: Int, b: Int) -> (Int) -> (Int) -> Int { }
func f4(a: Int, b: Int) -> Int { }
func f4(c: Double, d: Double) -> Double { }
subscript (a a: Int, b b: Int) -> Int {
get { }
set { }
}
}
func testS0Methods(s0: S0, a: Int, b: Int, c: Double, d: Double) {
_ = s0.f1(a: a, b: a) // okay: direct call requires argument labels
_ = (s0.f1)(a: a, b: a) // okay: direct call requires argument labels
_ = ((s0.f1))(a: a, b: a) // okay: direct call requires argument labels
_ = s0.f1(a:b:)(a, b) // compound name suppresses argument labels
let _: Int = s0.f1 // expected-error{{cannot convert value of type '(Int, Int) -> Int' to specified type 'Int'}}
_ = s0.f2(a: a, b: b)(a) // okay: direct call requires argument labels
_ = s0.f2(a: a, b: b)(a)(b) // okay: direct call requires argument labels
_ = s0.f4(a: a, b: a) // okay: direct call requires argument labels
_ = (s0.f4)(a: a, b: a) // okay: direct call requires argument labels
_ = ((s0.f4))(a: a, b: a) // okay: direct call requires argument labels
_ = s0.f4(c: c, d: d) // okay: direct call requires argument labels
_ = (s0.f4)(c: c, d: d) // okay: direct call requires argument labels
_ = ((s0.f4))(c: c, d: d) // okay: direct call requires argument labels
_ = s0.f4(a:b:)(1, 2) // compound name suppresses argument labels
_ = s0.f4(c:d:)(1.5, 2.5) // compound name suppresses argument labels
let _: (Int, Int) -> Int = s0.f4
let _: (Double, Double) -> Double = s0.f4
let _: (_ x: Int, _ y: Int) -> Int = s0.f4
let _: (_ x: Double, _ y: Double) -> Double = s0.f4
}
// Curried instance methods.
func testS0CurriedInstanceMethods(s0: S0, a: Int, b: Int) {
_ = S0.f1(s0)(a: a, b: a) // okay: direct call requires argument labels
_ = (S0.f1)(s0)(a: a, b: a) // okay: direct call requires argument labels
_ = ((S0.f1))(s0)(a: a, b: a) // okay: direct call requires argument labels
_ = S0.f1(a:b:)(s0)(a, b) // compound name suppresses argument labels
let _: Int = S0.f1 // expected-error{{cannot convert value of type '(S0) -> (Int, Int) -> Int' to specified type 'Int'}}
let f1OneLevel = S0.f1(s0)
let _: Int = f1OneLevel // expected-error{{cannot convert value of type '(Int, Int) -> Int' to specified type 'Int'}}
}
// Initializers.
func testS0Initializers(s0: S0, a: Int, b: Int) {
let _ = S0(a: a, b: b) // okay: direct call requires argument labels
let _ = S0.init(a: a, b: b) // okay: direct call requires argument labels
let _ = S0.init(a:b:)(a, b) // compound name suppresses argument labels
// Curried references to the initializer drop argument labels.
let s0c1 = S0.init
let _: Int = s0c1 // expected-error{{cannot convert value of type '(Int, Int) -> S0' to specified type 'Int'}}
let s0c2 = S0.init(a:b:)
let _: Int = s0c2 // expected-error{{cannot convert value of type '(Int, Int) -> S0' to specified type 'Int'}}
}
struct S1 {
subscript (i: Int) -> Int {
get { }
nonmutating set { }
}
}
func testS0Subscripts(s0: S0, s1: S1, a: Int, b: Int) {
let _ = s0[a: a, b: b]
var s0Var = s0
s0Var[a: a, b: b] = a
let _ = s1[a]
s1[a] = b
}
struct S2 {
let s1: S1
}
func testS1Subscripts(s2: S2, a: Int) {
let _ = s2.s1[a]
s2.s1[a] = a
}
// Test delegating initialization.
struct S3 {
init(a: Int, b: Int) { }
init(all: Int) {
self.init(a:b:)(all, all)
}
}
// Check lazy inference, which broke in amusing ways with SE-0111.
class C0 {
lazy var a = 32
}
// Check diagnostics changes.
let _ = min(Int(3), Float(2.5)) // expected-error{{cannot convert value of type 'Float' to expected argument type 'Int'}}