File: keypaths_noncopyable.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 (63 lines) | stat: -rw-r--r-- 1,819 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
// RUN: %target-typecheck-verify-swift

public protocol P: ~Copyable {
    var protocolProp: String { get }
}

public struct NC: ~Copyable {
   var data: [Int] = []
   var next: Box<NC>? = nil
}

public struct M<T: ~Copyable & P>: ~Copyable {
   var nc: NC
   var string: String
   let ncg: T
   init(_ t: consuming T) {
    self.string = ""
    self.nc = NC()
    self.ncg = t
   }
}

public class Box<Wrapped: ~Copyable> {
  var wrapped: Wrapped
  init(_ t: consuming Wrapped) { self.wrapped = t }
  func with<T: ~Copyable>(_ op: (borrowing Wrapped)->T) -> T { op(wrapped) }
}

class A {
  var b: B
  init(_ b: consuming B) { self.b = b }
}
struct B: ~Copyable {
  var c: C
}
struct C {
  var d: Int
}

// rdar://109287447
public func testKeypath<V: ~Copyable>(m: consuming M<V>) {
  _ = m[keyPath: \.nc] // expected-error {{key path cannot refer to noncopyable type 'NC'}}
  _ = m[keyPath: \.nc.data] // expected-error {{key path cannot refer to noncopyable type 'NC'}}
  _ = m[keyPath: \.ncg] // expected-error {{key path cannot refer to noncopyable type 'V'}}
  _ = m[keyPath: \.ncg.protocolProp] // expected-error {{key path cannot refer to noncopyable type 'V'}}
  _ = m[keyPath: \.string]

  let b = Box(NC())
  _ = b.with(\.data)
  _ = b.with(\.next)
  _ = b.with(\.next?.wrapped) // expected-error {{key path cannot refer to noncopyable type 'NC'}}
  _ = b.with(\.next!.wrapped.data) // expected-error {{key path cannot refer to noncopyable type 'NC'}}
}

// rdar://109162739
func testKeypath2(_ someA: A) -> Int {
  let kp: KeyPath<A, Int> = \A.b.c.d  // expected-error {{key path cannot refer to noncopyable type 'B'}}
  return someA[keyPath: kp]
}
func testAsFunc(_ someA: A) -> Int {
  let fn: (A) -> Int = \A.b.c.d // expected-error {{key path cannot refer to noncopyable type 'B'}}
  return fn(someA)
}