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
|
// RUN: %target-typecheck-verify-swift -disable-availability-checking
var global: Int = 5
func testGlobal() {
let _ = consume global // expected-warning {{'consume' applied to bitwise-copyable type 'Int' has no effect}}
}
func testLet() {
let t = String()
let _ = consume t
}
func testVar() {
var t = String()
t = String()
let _ = consume t
}
func consume() {}
func consume(_: String) {}
func consume(_: String, _: Int) {}
func consume(x: String, y: Int) {}
// Ensure that we can still call a function named consume.
func useConsumeFunc() {
var s = String()
var i = global
consume()
consume(s)
consume(i) // expected-error{{cannot convert value of type 'Int' to expected argument type 'String'}}
consume(s, i)
consume(i, s) // expected-error{{unnamed argument #2 must precede unnamed argument #1}}
consume(x: s, y: i)
consume(y: i, x: s) // expected-error{{argument 'x' must precede argument 'y'}}
}
// Ensure that we can still use a variable named consume.
func useConsumeVar(consume: inout String) {
let s = consume
consume = s
// We can consume from a variable named `consume`
let t = consume consume
consume = t
// We can do member access and subscript a variable named `consume`
let i = consume.startIndex
let _ = consume[i]
}
@propertyWrapper
struct FooWrapper<T> {
var value: T
init(wrappedValue: T) { value = wrappedValue }
var wrappedValue: T {
get { value }
nonmutating set {}
}
var projectedValue: T {
get { value }
nonmutating set {}
}
}
struct Foo {
@FooWrapper var wrapperTest: String
func consumeSelf() {
_ = consume self
}
func consumePropertyWrapper() {
// should still parse, even if it doesn't semantically work out
_ = consume wrapperTest // expected-error{{'consume' can only be used to partially consume storage of a noncopyable type}}
_ = consume _wrapperTest // expected-error{{'consume' can only be used to partially consume storage of a noncopyable type}}
_ = consume $wrapperTest // expected-error{{'consume' can only be used to partially consume storage of a noncopyable type}}
}
}
func testParseConsumeWithDollarIdentifier() {
class Klass {}
let f: (Klass) -> () = {
let _ = consume $0
}
_ = f
}
class ParentKlass {}
class ChildKlass : ParentKlass {}
func testAsBindingVariableInSwitch(_ x: ChildKlass) {
switch x {
case let consume as ParentKlass:
_ = consume
break
}
}
|