1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// RUN: %target-typecheck-verify-swift
struct borrowing {}
struct consuming {}
struct Foo {}
func foo(x: borrowing Foo) {}
func bar(x: consuming Foo) {}
func baz(x: (borrowing Foo, consuming Foo) -> ()) {}
func bad(x: borrowing borrowing Foo) {} // expected-error{{at most one}}
func worse(x: borrowing consuming Foo) {} // expected-error{{at most one}}
func worst(x: (borrowing consuming Foo) -> ()) {} // expected-error{{at most one}}
// `borrowing` and `consuming` are contextual keywords, so they should also
// continue working as type and/or parameter names
func zim(x: borrowing) {}
func zang(x: consuming) {}
func zung(x: borrowing consuming) {}
func zip(x: consuming borrowing) {}
func zap(x: (borrowing, consuming) -> ()) {}
func zoop(x: (borrowing consuming, consuming borrowing) -> ()) {}
func worster(x: borrowing borrowing borrowing) {} // expected-error{{at most one}}
func worstest(x: (borrowing borrowing borrowing) -> ()) {} // expected-error{{at most one}}
// Parameter specifier names are regular identifiers in other positions,
// including argument labels.
func argumentLabel(borrowing consuming: Int) {}
func argumentLabel(consuming borrowing: Int) {}
func argumentLabel(__shared __owned: Int) {}
func argumentLabel(__owned __shared: Int) {}
// We should parse them as argument labels in function types, even though that
// isn't currently supported.
func argumentLabel(borrowingInClosure: (borrowing consuming: Int) -> ()) {} // expected-error{{function types cannot have argument labels}}
func argumentLabel(consumingInClosure: (consuming borrowing: Int) -> ()) {} // expected-error{{function types cannot have argument labels}}
func argumentLabel(sharedInClosure: (__shared __owned: Int) -> ()) {} // expected-error{{function types cannot have argument labels}}
func argumentLabel(ownedInClosure: (__owned __shared: Int) -> ()) {} // expected-error{{function types cannot have argument labels}}
func argumentLabel(anonBorrowingInClosure: (_ borrowing: Int) -> ()) {}
func argumentLabel(anonConsumingInClosure: (_ consuming: Int) -> ()) {}
func argumentLabel(anonSharedInClosure: (_ __shared: Int) -> ()) {}
func argumentLabel(anonOwnedInClosure: (_ __owned: Int) -> ()) {}
struct MethodModifiers {
mutating func mutating() {}
borrowing func borrowing() {}
consuming func consuming() {}
nonmutating func nonmutating() {}
__consuming func __consuming() {}
mutating borrowing func tooManyA() {} // expected-error{{method must not be declared both 'mutating' and 'borrowing'}}
nonmutating borrowing func tooManyB() {} // expected-error{{method must not be declared both 'nonmutating' and 'borrowing'}}
borrowing consuming func tooManyC() {} // expected-error{{method must not be declared both 'borrowing' and 'consuming'}}
borrowing mutating consuming func tooManyD() {} // expected-error 2 {{method must not be declared both }}
}
func chalk(_ a: consuming String,
_ b: borrowing [Int],
_ c: __shared [String],
_ d: __owned Int?)
{}
struct Stepping {
consuming func perform() {}
borrowing func doIt() {}
mutating func change() {}
var ex: Int {
__consuming get { 0 }
}
}
class Clapping {
consuming func perform() {}
borrowing func doIt() {}
var ex: Int {
__consuming get { 0 }
}
}
protocol Popping {
consuming func perform()
borrowing func doIt()
mutating func change()
var ex: Int {
__consuming get
}
}
enum Exercising {
consuming func perform() {}
borrowing func doIt() {}
mutating func change() {}
var ex: Int {
__consuming get { 0 }
}
}
func consumingClosure1(_ f: consuming () -> ()) { } // expected-error {{'consuming' cannot be applied to nonescaping closure}}
func consumingClosure2(_ f: consuming @escaping () -> ()) { }
func borrowingClosure1(_ f: borrowing () -> ()) { }
func borrowingClosure2(_ f: borrowing @escaping () -> ()) { }
|