File: moveonly_casts.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (142 lines) | stat: -rw-r--r-- 4,223 bytes parent folder | download
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// RUN: %target-typecheck-verify-swift

struct NC: ~Copyable {}

func testBorrowing(_ v: borrowing NC?) {}
func testConsuming(_ v: consuming NC?) {}
func testInout(_ v: inout NC?) {}

class MethodSir {
  func borrow(_ v: borrowing NC?) {}
  func consume(_ v: consuming NC?) {}
}

func testExplicitCasts() {
  let nc = NC()
  _ = nc as NC?
}

func testCalls() {
  let method = MethodSir()
  let foo = NC()
  testBorrowing(foo) // expected-error {{implicit conversion to 'NC?' is consuming}}
                     // expected-note@-1 {{add 'consume' to make consumption explicit}} {{17-17=consume }}
  testBorrowing(consume foo)
  testBorrowing(foo as NC?)

  method.borrow(foo) // expected-error {{implicit conversion to 'NC?' is consuming}}
                     // expected-note@-1 {{add 'consume' to make consumption explicit}} {{17-17=consume }}
  method.borrow(consume foo)

  testConsuming(foo)
  testConsuming(consume foo)

  var optNC: NC? = NC() // ConstraintLocator::ContextualType
  testInout(&optNC)
}

func testReturn() -> NC? {
    let foo = NC()
    return foo // ConstraintLocator::ContextualType
}

func higherOrder(_ f: () -> NC?) -> NC? {
  if let nc = f() {
    nc // ConstraintLocator::ContextualType
  } else {
    nil
  }
}
func callHigherOrder() {
  let nc = NC()
  let _ = higherOrder { nc } // ConstraintLocator::ClosureBody

  let _ = higherOrder { return nc } // ConstraintLocator::ClosureBody
}


func delay(_ f: @autoclosure () -> NC?) -> NC? { f() }

func testDelay() {
  let nc = NC()
  let _ = delay(nc) // expected-error {{implicit conversion to 'NC?' is consuming}}
                    // expected-note@-1 {{add 'consume' to make consumption explicit}} {{17-17=consume }}
}

struct PropCity {
  var harmless1: NC? { NC() }
  var harmless2: NC? {
    get { return NC() }
  }

  subscript(_ i: Int) -> NC? { return NC() }

  func chk(_ t: borrowing NC!) {}
  func chkWithDefaultArg(_ oath: borrowing NC? = NC()) {}
  func test(_ nc: consuming NC) {
    chk(nc) // expected-error {{implicit conversion to 'NC?' is consuming}}
            // expected-note@-1 {{add 'consume' to make consumption explicit}} {{9-9=consume }}

    chk(consume nc)

    chkWithDefaultArg()
    chkWithDefaultArg(nc) // expected-error {{implicit conversion to 'NC?' is consuming}}
                          // expected-note@-1 {{add 'consume' to make consumption explicit}} {{23-23=consume }}
  }
}

protocol Veggie: ~Copyable {}
struct Carrot: ~Copyable, Veggie {}

func restockBorrow(_ x: borrowing any Veggie & ~Copyable) {}
func restockConsume(_ x: consuming any Veggie & ~Copyable) {}

func checkExistential() {
  let carrot = Carrot()
  restockBorrow(carrot) // expected-error {{implicit conversion to 'any Veggie & ~Copyable' is consuming}}
                        // expected-note@-1 {{add 'consume' to make consumption explicit}} {{17-17=consume }}
  restockBorrow(consume carrot)

  restockConsume(carrot)
}

func genericErasure<T: Veggie & ~Copyable>(_ veg: consuming T) {
  restockBorrow(veg) // expected-error {{implicit conversion to 'any Veggie & ~Copyable' is consuming}}
                     // expected-note@-1 {{add 'consume' to make consumption explicit}} {{17-17=consume }}
  restockBorrow(consume veg)
  restockBorrow(veg as any Veggie & ~Copyable)
  restockConsume(veg)

  let _ = veg as any Veggie & ~Copyable
}

extension Veggie where Self: ~Copyable {
  func inspect(_ b: borrowing any Veggie & ~Copyable) {}
}
extension Carrot {
  consuming func check() {
    inspect(self) // expected-error {{implicit conversion to 'any Veggie & ~Copyable' is consuming}}
                  // expected-note@-1 {{add 'consume' to make consumption explicit}} {{13-13=consume }}
    inspect(consume self)
    inspect(self as any Veggie & ~Copyable)

    let _: any Veggie & ~Copyable = self
  }
}

// rdar://131546153 (implicit consuming conversion error triggers incorrectly for implicit initializers)
struct ImplicitInit: ~Copyable {
  let x: NC?
}
func test(_ nc: consuming NC) -> ImplicitInit {
  return .init(x: nc)
}


// rdar://134371893 (optional chaining on ~Copyable type)
struct NonCopyable: ~Copyable {
    var shared: Self { .init() }
}
func f() {
    _ = (Optional<NonCopyable>.none)?.shared
}