File: moveonly_generics_casting.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (151 lines) | stat: -rw-r--r-- 4,039 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
143
144
145
146
147
148
149
150
151
// RUN: %target-run-simple-swift(-Xfrontend -sil-verify-all -Xfrontend -disable-availability-checking) | %FileCheck %s
// RUN: %target-run-simple-swift(-O -Xfrontend -sil-verify-all -Xfrontend -disable-availability-checking) | %FileCheck %s

// REQUIRES: executable_test

// UNSUPPORTED: use_os_stdlib
// UNSUPPORTED: back_deployment_runtime

protocol P {
  func speak()
}

extension P {
  func speak() { print("hello") }
}

struct Noncopyable: ~Copyable {}
struct Ordinary {}

struct Dog<T: ~Copyable>: Copyable {}
extension Dog: P where T: Copyable {}

enum Cat<Left: ~Copyable, Right: ~Copyable>: Copyable {
    case meows
    init() { self = .meows }
}
extension Cat: P where Left: Copyable, Right: ~Copyable {}

struct ConditionallyCopyable<T: ~Copyable>: ~Copyable {
  var value: Int = 17
}
extension ConditionallyCopyable: Copyable where T: Copyable { }

// FIXME: Not yet supported
// struct VariadicCopyable<each T: ~Copyable>: Copyable { }
// extension VariadicCopyable: P where repeat each T: Copyable { }

func attemptCall(_ a: Any) {
  if let value = a as? P {
    value.speak()
    return
  }
  print("failed to cast (attemptCall)")
}

@_silgen_name("swift_getExtendedFunctionTypeMetadata")
func _getExtendedFunctionTypeMetadata(
    flags: UInt, differentiabilityKind: UInt,
    parameterTypes: UnsafePointer<Any.Type>?,
    parameterFlags: UnsafePointer<UInt32>?,
    resultType: Any.Type, globalActorType: Any.Type? = nil,
    extendedFlags: UInt32, thrownErrorType: Any.Type? = nil) -> Any.Type


defer { main() }
func main() {
  // CHECK: hello
  attemptCall(Dog<Ordinary>())

  // CHECK: failed to cast (attemptCall)
  attemptCall(Dog<Noncopyable>())

  // CHECK: failed to cast (attemptCall)
  attemptCall(Dog<ConditionallyCopyable<Noncopyable>>())

  // CHECK: hello
  attemptCall(Cat<Ordinary, Noncopyable>())

  // CHECK: failed to cast (attemptCall)
  attemptCall(Cat<Noncopyable, Ordinary>())

   // CHECK: failed to cast (attemptCall)
  attemptCall(Cat<Noncopyable, ConditionallyCopyable<Ordinary>>())

  // CHECK-FIXME: hello
  // attemptCall(VariadicCopyable<Ordinary, ConditionallyCopyable<Ordinary>>())

  // CHECK-FIXME: failed to cast (attemptCall)
  // attemptCall(VariadicCopyable<Ordinary, ConditionallyCopyable<Noncopyable>>())

  // CHECK: tuple types
  print("tuple types")

  // CHECK: hello
  attemptCall(Dog<(Ordinary, Ordinary)>())

  // CHECK-FIXME: failed to cast (attemptCall)
  // FIXME: Requires the ability to create such tuple types
  // attemptCall(Dog<(Ordinary, Noncopyable)>())

  // CHECK: metatype types
  print("metatype types")

  // CHECK: hello
  attemptCall(Dog<Ordinary.Type>())

  // CHECK: hello
  attemptCall(Dog<Noncopyable.Type>())

  // CHECK: function types
  print("function types")

  attemptCall(Dog<(Ordinary) -> Noncopyable>())

  // This is a nonmovable function type, which cannot currently be
  // expressed in the language.
  let noncopyableFnType = _getExtendedFunctionTypeMetadata(
    flags: 0x04000000 | 0x80000000,
    differentiabilityKind: 0,
    parameterTypes: nil,
    parameterFlags: nil,
    resultType: Void.self,
    extendedFlags: 0x1 << 16)

  // CHECK: failed to cast (attemptCall)
  func doFuncCall<F>(_: F.Type) {
    attemptCall(Dog<F>())
  }
  _openExistential(noncopyableFnType, do: doFuncCall)

  // CHECK: existential types
  print("existential types")

  // CHECK: hello
  attemptCall(Dog<Any>())

  // CHECK-FIXME: failed to cast (attemptCall)
  // FIXME crashes: attemptCall(Dog<any ~Copyable>())

  // CHECK: cast succeeded
  test_radar124171788(.nothing)
}

// coverage for rdar://124171788
enum Maybe<Wrapped: ~Copyable>: ~Copyable {
  case just(Wrapped)
  case nothing
}
extension Maybe: Copyable where Wrapped: Copyable {}
extension Maybe: CustomDebugStringConvertible {
  var debugDescription: String {
    "cast succeeded"
  }
}
func test_radar124171788(_ v: Maybe<Int>) {
  if let foo = v as? CustomDebugStringConvertible {
    print("\(foo.debugDescription)")
    return
  }
  print("failed to cast (test_radar124171788)")
}