mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
- 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
88 lines
1.7 KiB
Swift
88 lines
1.7 KiB
Swift
// RUN: %target-typecheck-verify-swift -disable-availability-checking -enable-experimental-move-only
|
|
|
|
class Klass {
|
|
var k: Klass? = nil
|
|
}
|
|
|
|
func useString(_ x: String) {}
|
|
|
|
var global: String = "5"
|
|
func testGlobal() {
|
|
useString(_borrow global)
|
|
}
|
|
|
|
func testLet() {
|
|
let t = String()
|
|
useString(_borrow t)
|
|
}
|
|
|
|
func testVar() {
|
|
var t = String()
|
|
t = String()
|
|
useString(_borrow t)
|
|
}
|
|
|
|
struct S {
|
|
var k = Klass()
|
|
|
|
func test() {}
|
|
|
|
func test2() {
|
|
(_borrow self).test()
|
|
}
|
|
}
|
|
|
|
func useApply() {
|
|
var s = S()
|
|
s = S()
|
|
(_borrow s).test()
|
|
}
|
|
|
|
func testExprFailureLet() {
|
|
let t = 5
|
|
// Next line is parsed as move(t) + t
|
|
let _ = _borrow t + t
|
|
// Next line is parsed as move(t+t)
|
|
let _ = _borrow (t+t) // expected-error {{'borrow' can only be applied to a local binding ('let', 'var', or parameter)}}
|
|
}
|
|
|
|
func testExprFailureVar() {
|
|
var t = 5
|
|
t = 5
|
|
// Next line is parsed as move(t) + t
|
|
let _ = _borrow t + t
|
|
// Next line is parsed as move(t+t)
|
|
let _ = _borrow (t+t) // expected-error {{'borrow' can only be applied to a local binding ('let', 'var', or parameter)}}
|
|
}
|
|
|
|
func letAddressOnly<T>(_ v: T) {
|
|
let t = v
|
|
let _ = _borrow t
|
|
}
|
|
|
|
struct StructWithField {
|
|
var k: Klass? = nil
|
|
}
|
|
|
|
func testLetStructAccessField() {
|
|
let t = StructWithField()
|
|
let _ = _borrow t.k
|
|
}
|
|
|
|
func testVarStructAccessField() {
|
|
var t = StructWithField()
|
|
t = StructWithField()
|
|
let _ = _borrow t.k
|
|
}
|
|
|
|
func testLetClassAccessField() {
|
|
let t = Klass()
|
|
let _ = _borrow t.k
|
|
}
|
|
|
|
func testVarClassAccessField() {
|
|
var t = Klass()
|
|
t = Klass()
|
|
let _ = _borrow t.k // expected-error {{'borrow' can only be applied to a local binding ('let', 'var', or parameter)}}
|
|
}
|