mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Add `@autoclosure` to parameter flags associated with function type metadata, which makes it possible to correctly round-trip mangled name <-> metadata of function types which have parameters marked as `@autoclosure`. Resolves: rdar://problem/45489901
149 lines
4.8 KiB
Swift
149 lines
4.8 KiB
Swift
// RUN: %target-run-simple-swift | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
|
|
let a: ((Int, Int)) -> Void = { x in }
|
|
let b: Any = a
|
|
|
|
let cast1 = b as? (Int, Int) -> Void
|
|
let cast2 = b as? ((Int, Int)) -> Void
|
|
|
|
// CHECK: ok
|
|
print((cast1 == nil) ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((cast2 != nil) ? "ok" : "fail")
|
|
|
|
let c: () -> Void = { }
|
|
let d: (()) -> Void = { x in }
|
|
|
|
let e: Any = c
|
|
let f: Any = d
|
|
|
|
let cast3 = e as? () -> Void
|
|
let cast4 = e as? (()) -> Void
|
|
let cast5 = f as? () -> Void
|
|
let cast6 = f as? (()) -> Void
|
|
|
|
// CHECK: ok
|
|
print((cast3 != nil) ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((cast4 == nil) ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((cast5 == nil) ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((cast6 != nil) ? "ok" : "fail")
|
|
|
|
let g: (Int, Int) -> Void = { x, y in }
|
|
let h: Any = g
|
|
|
|
let cast7 = h as? ((Int, Int)) -> Void
|
|
let cast8 = h as? (Int, Int) -> Void
|
|
|
|
// CHECK: ok
|
|
print((cast7 == nil) ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((cast8 != nil) ? "ok" : "fail")
|
|
|
|
let t1: Any.Type = ((Int, Int) -> ()).self
|
|
let t2: Any.Type = (((Int, Int)) -> ()).self
|
|
|
|
// CHECK: ok
|
|
print((t1 == t2) ? "fail" : "ok")
|
|
|
|
let i: (inout Int) -> Void = { _ in }
|
|
let j: (__shared Int) -> Void = { _ in }
|
|
let k: (Int, inout Int) -> Void = { _,_ in }
|
|
let l: (inout Int, Float, inout String) -> Void = { _,_,_ in }
|
|
let m: (__shared Int, String, inout Float, Double) -> Void = { _,_,_,_ in }
|
|
let n: () -> Int = { 42 }
|
|
let o: (@autoclosure () -> Int) -> Void = { (x: @autoclosure () -> Int) -> Void in }
|
|
let p: (@autoclosure @escaping () -> Int) -> Void = { (x: @autoclosure @escaping () -> Int) -> Void in }
|
|
|
|
let i_any: Any = i
|
|
let j_any: Any = j
|
|
let k_any: Any = k
|
|
let l_any: Any = l
|
|
let m_any: Any = m
|
|
let n_any: Any = n
|
|
let o_any: Any = o
|
|
let p_any: Any = p
|
|
|
|
// CHECK: ok
|
|
print((i_any as? (Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((i_any as? (__shared Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((i_any as? (inout Int) -> Void) != nil ? "ok" : "fail")
|
|
|
|
// CHECK: ok
|
|
print((j_any as? (Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((j_any as? (inout Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((j_any as? (__shared Int) -> Void) != nil ? "ok" : "fail")
|
|
|
|
// CHECK: ok
|
|
print((k_any as? (Int, Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((k_any as? (Int, inout Int) -> Void) != nil ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((k_any as? (inout Int, Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((k_any as? (inout Int, __shared Int) -> Void) != nil ? "fail" : "ok")
|
|
|
|
// CHECK: ok
|
|
print((l_any as? (Int, Float, String) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((l_any as? (Int, Float, inout String) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((l_any as? (Int, inout Float, String) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((l_any as? (inout Int, Float, String) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((l_any as? (inout Int, inout Float, String) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((l_any as? (inout Int, Float, __shared String) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((l_any as? (inout Int, Float, inout String) -> Void) != nil ? "ok" : "fail")
|
|
|
|
// CHECK: ok
|
|
print((m_any as? (Int, String, Float, Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (Int, String, Float, inout Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (Int, String, Float, __shared Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (Int, String, inout Float, Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (Int, __shared String, Float, Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (inout Int, String, __shared Float, Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (__shared Int, String, Float, inout Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (Int, __shared String, inout Float, Double) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((m_any as? (__shared Int, String, inout Float, Double) -> Void) != nil ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((n_any as? () -> Int) != nil ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((n_any as? () -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((n_any as? (Int) -> Int) != nil ? "fail" : "ok")
|
|
|
|
// CHECK: ok
|
|
print((o_any as? (() -> Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((o_any as? (inout () -> Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((o_any as? (@escaping () -> Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((o_any as? (@autoclosure () -> Int) -> Void) != nil ? "ok" : "fail")
|
|
// CHECK: ok
|
|
print((o_any as? (@autoclosure @escaping () -> Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((p_any as? (@escaping () -> Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((p_any as? (@autoclosure () -> Int) -> Void) != nil ? "fail" : "ok")
|
|
// CHECK: ok
|
|
print((p_any as? (@autoclosure @escaping () -> Int) -> Void) == nil ? "fail" : "ok")
|