| // RUN: %target-typecheck-verify-swift |
| |
| var global: () -> () = {} |
| |
| struct Properties { |
| var property1: () -> () { |
| get { |
| return global |
| } |
| set { |
| global = newValue |
| } |
| } |
| |
| var property2: () -> () { |
| get { |
| return global |
| } |
| set(value) { |
| global = value |
| } |
| } |
| } |
| |
| func testProperties_property1(nonescaping: () -> (), // expected-note {{implicitly non-escaping}} |
| escaping: @escaping () -> ()) { |
| var p = Properties() |
| p.property1 = nonescaping // expected-error {{assigning non-escaping parameter}} |
| p.property1 = escaping |
| } |
| |
| func testProperties_property2(nonescaping: () -> (), // expected-note {{implicitly non-escaping}} |
| escaping: @escaping () -> ()) { |
| var p = Properties() |
| p.property2 = nonescaping // expected-error {{assigning non-escaping parameter}} |
| p.property2 = escaping |
| } |
| |
| struct Subscripts { |
| subscript(value1 fn: Int) -> () -> () { |
| get { |
| return global |
| } |
| set { |
| global = newValue |
| } |
| } |
| |
| subscript(value2 fn: Int) -> () -> () { |
| get { |
| return global |
| } |
| set(value) { |
| global = value |
| } |
| } |
| |
| subscript(nonescapingIndexWithAddressor fn: () -> Void) -> Int { |
| get { |
| return 0 |
| } |
| unsafeMutableAddress { |
| fatalError() |
| } |
| } |
| |
| // expected-note@+1 2 {{implicitly non-escaping}} |
| subscript(nonescapingIndex fn: () -> ()) -> Int { |
| get { |
| global = fn // expected-error {{assigning non-escaping parameter}} |
| return 0 |
| } |
| set { |
| global = fn // expected-error {{assigning non-escaping parameter}} |
| } |
| } |
| |
| subscript(escapingIndex fn: @escaping () -> ()) -> Int { |
| get { |
| global = fn |
| return 0 |
| } |
| set { |
| global = fn |
| } |
| } |
| } |
| |
| // expected-note@+1 {{implicitly non-escaping}} |
| func testSubscripts_value1(nonescaping: () -> (), |
| escaping: @escaping () -> ()) { |
| var s = Subscripts() |
| _ = s[value1: 0] |
| s[value1: 0] = escaping |
| s[value1: 0] = nonescaping // expected-error {{assigning non-escaping parameter}} |
| } |
| |
| // expected-note@+1 {{implicitly non-escaping}} |
| func testSubscripts_value2(nonescaping: () -> (), |
| escaping: @escaping () -> ()) { |
| var s = Subscripts() |
| _ = s[value2: 0] |
| s[value2: 0] = escaping |
| s[value2: 0] = nonescaping // expected-error {{assigning non-escaping parameter}} |
| } |
| |
| func testSubscripts_nonescapingIndex(nonescaping: () -> (), |
| escaping: @escaping () -> ()) { |
| var s = Subscripts() |
| _ = s[nonescapingIndex: nonescaping] |
| _ = s[nonescapingIndex: escaping] |
| s[nonescapingIndex: nonescaping] = 0 |
| s[nonescapingIndex: escaping] = 0 |
| } |
| |
| // expected-note@+1 2 {{implicitly non-escaping}} |
| func testSubscripts_escapingIndex(nonescaping: () -> (), |
| escaping: @escaping () -> ()) { |
| var s = Subscripts() |
| _ = s[escapingIndex: nonescaping] // expected-error {{passing non-escaping parameter}} |
| _ = s[escapingIndex: escaping] |
| s[escapingIndex: nonescaping] = 0 // expected-error {{passing non-escaping parameter}} |
| s[escapingIndex: escaping] = 0 |
| } |