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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
// RUN: %target-swift-frontend %s -emit-sil \
// RUN: -verify \
// RUN: -sil-verify-all \
// RUN: -module-name test \
// RUN: -enable-experimental-feature NonescapableTypes
// REQUIRES: asserts
// REQUIRES: swift_in_compiler
// Simply test that it is possible for a module to define a pseudo-Optional type without triggering any compiler errors.
public protocol ExpressibleByNilLiteral: ~Copyable & ~Escapable {
@_unsafeNonescapableResult
init(nilLiteral: ())
}
@frozen
public enum Nillable<Wrapped: ~Copyable & ~Escapable>: ~Copyable & ~Escapable {
case none
case some(Wrapped)
}
extension Nillable: Copyable where Wrapped: Copyable {}
extension Nillable: Escapable where Wrapped: Escapable {}
extension Nillable: Sendable where Wrapped: ~Copyable & ~Escapable & Sendable { }
extension Nillable: BitwiseCopyable where Wrapped: BitwiseCopyable { }
extension Nillable: ExpressibleByNilLiteral where Wrapped: ~Copyable & ~Escapable {
@_transparent
@_unsafeNonescapableResult
public init(nilLiteral: ()) {
self = .none
}
}
extension Nillable where Wrapped: ~Copyable & ~Escapable {
@_transparent
public init(_ some: consuming Wrapped) { self = .some(some) }
}
extension Nillable where Wrapped: ~Copyable {
public consuming func _consumingMap<U: ~Copyable, E: Error>(
_ transform: (consuming Wrapped) throws(E) -> U
) throws(E) -> U? {
switch consume self {
case .some(let y):
return .some(try transform(y))
case .none:
return .none
}
}
public borrowing func _borrowingMap<U: ~Copyable, E: Error>(
_ transform: (borrowing Wrapped) throws(E) -> U
) throws(E) -> U? {
switch self {
case .some(let y):
return .some(try transform(y))
case .none:
return .none
}
}
}
extension Nillable where Wrapped: ~Copyable {
public consuming func _consumingFlatMap<U: ~Copyable, E: Error>(
_ transform: (consuming Wrapped) throws(E) -> U?
) throws(E) -> U? {
switch consume self {
case .some(let y):
return try transform(consume y)
case .none:
return .none
}
}
public func _borrowingFlatMap<U: ~Copyable, E: Error>(
_ transform: (borrowing Wrapped) throws(E) -> U?
) throws(E) -> U? {
switch self {
case .some(let y):
return try transform(y)
case .none:
return .none
}
}
}
extension Nillable where Wrapped: ~Copyable {
public consuming func _consumingUnsafelyUnwrap() -> Wrapped {
switch consume self {
case .some(let x):
return x
case .none:
fatalError("consumingUsafelyUnwrap of nil optional")
}
}
}
extension Optional where Wrapped: ~Copyable {
internal consuming func _consumingUncheckedUnwrapped() -> Wrapped {
if let x = self {
return x
}
fatalError("_uncheckedUnwrapped of nil optional")
}
}
extension Optional where Wrapped: ~Copyable {
public mutating func _take() -> Self {
let result = consume self
self = nil
return result
}
}
extension Optional where Wrapped: ~Copyable {
public static func ~=(
lhs: _OptionalNilComparisonType,
rhs: borrowing Wrapped?
) -> Bool {
switch rhs {
case .some:
return false
case .none:
return true
}
}
public static func ==(
lhs: borrowing Wrapped?,
rhs: _OptionalNilComparisonType
) -> Bool {
switch lhs {
case .some:
return false
case .none:
return true
}
}
public static func !=(
lhs: borrowing Wrapped?,
rhs: _OptionalNilComparisonType
) -> Bool {
switch lhs {
case .some:
return true
case .none:
return false
}
}
public static func ==(
lhs: _OptionalNilComparisonType,
rhs: borrowing Wrapped?
) -> Bool {
switch rhs {
case .some:
return false
case .none:
return true
}
}
public static func !=(
lhs: _OptionalNilComparisonType,
rhs: borrowing Wrapped?
) -> Bool {
switch rhs {
case .some:
return true
case .none:
return false
}
}
}
public func ?? <T: ~Copyable>(
optional: consuming T?,
defaultValue: @autoclosure () throws -> T
) rethrows -> T {
switch consume optional {
case .some(let value):
return value
case .none:
return try defaultValue()
}
}
public func ?? <T: ~Copyable>(
optional: consuming T?,
defaultValue: @autoclosure () throws -> T?
) rethrows -> T? {
switch consume optional {
case .some(let value):
return value
case .none:
return try defaultValue()
}
}
|