Files
swift-mirror/test/Parse/copy_expr.swift
Kavon Farvardin 31aa2f77e3 polish noncopyable types diagnostic wordings
- replaces "move-only" terminology with "noncopyable"
- replaces compiler jargon like "guaranteed parameters"
  and "lvalue" with corresponding language-level notions
- simplifies diagnostics about closures.

and probably more.

rdar://109281444
2023-05-24 20:56:36 -07:00

117 lines
2.4 KiB
Swift

// RUN: %target-typecheck-verify-swift -disable-availability-checking
var global: Int = 5
func testGlobal() {
let _ = copy global
}
func testLet() {
let t = String()
let _ = copy t
}
func testVar() {
var t = String()
t = String()
let _ = copy t
}
func copy() {}
func copy(_: String) {}
func copy(_: String, _: Int) {}
func copy(x: String, y: Int) {}
// Ensure that we can still call a function named copy.
func useCopyFunc() {
var s = String()
var i = global
copy()
copy(s)
copy(i) // expected-error{{cannot convert value of type 'Int' to expected argument type 'String'}}
copy(s, i)
copy(i, s) // expected-error{{unnamed argument #2 must precede unnamed argument #1}}
copy(x: s, y: i)
copy(y: i, x: s) // expected-error{{argument 'x' must precede argument 'y'}}
}
// Ensure that we can still use a variable named copy.
func useCopyVar(copy: inout String) {
let s = copy
copy = s
// We can copy from a variable named `copy`
let t = copy copy
copy = t
// We can do member access and subscript a variable named `copy`
let i = copy.startIndex
let _ = copy[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 copySelf() {
_ = copy self
}
func copyPropertyWrapper() {
// Make sure that we can parse.
_ = copy wrapperTest // expected-error {{'copy' can only be applied to a local binding ('let', 'var', or parameter)}}
_ = copy _wrapperTest // expected-error {{'copy' can only be applied to a local binding ('let', 'var', or parameter)}}
_ = copy $wrapperTest // expected-error {{'copy' can only be applied to a local binding ('let', 'var', or parameter)}}
}
}
func testParseCopyWithDollarIdentifier() {
class Klass {}
let f: (Klass) -> () = {
let _ = copy $0
}
_ = f
}
func testParseCopySelf() {
class Klass {
func test() {
let _ = copy self
}
}
}
func testForLoop() {
for copy in 0..<1024 {
_ = copy
}
}
class ParentKlass {}
class ChildKlass : ParentKlass {}
func testAsBindingVariableInSwitch(_ x: ChildKlass) {
switch x {
case let copy as ParentKlass:
_ = copy
break
}
}