Skip to content

Commit 5895077

Browse files
committed
[stdlibUnittest] generalize expectNotNil(_:)
Generalizes it for non-copyable and non-escapable values.
1 parent d5ef256 commit 5895077

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

stdlib/private/StdlibUnittest/StdlibUnittest.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -752,11 +752,14 @@ public func expectNil<T>(_ value: T?,
752752
}
753753

754754
@discardableResult
755-
public func expectNotNil<T>(_ value: T?,
755+
@lifetime(copy value)
756+
public func expectNotNil<T: ~Copyable & ~Escapable>(
757+
_ value: consuming T?,
756758
_ message: @autoclosure () -> String = "",
757759
stackTrace: SourceLocStack = SourceLocStack(),
758760
showFrame: Bool = true,
759-
file: String = #file, line: UInt = #line) -> T? {
761+
file: String = #file, line: UInt = #line
762+
) -> T? {
760763
if value == nil {
761764
expectationFailure("expected optional to be non-nil", trace: message(),
762765
stackTrace: stackTrace.pushIf(showFrame, file: file, line: line))

test/stdlib/OptionalGeneralizations.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,23 @@ suite.test("Initializer references") {
9292
expectTrue(r != nil)
9393
}
9494
}
95+
96+
suite.test("expectNotNil()") {
97+
func opt1<T: ~Copyable>(_ t: consuming T) -> T? { Optional.some(t) }
98+
_ = expectNotNil(opt1(TrivialStruct()))
99+
_ = expectNotNil(opt1(NoncopyableStruct()))
100+
_ = expectNotNil(opt1(RegularClass()))
101+
#if $NonescapableTypes
102+
@lifetime(copy t)
103+
func opt2<T: ~Copyable & ~Escapable>(_ t: consuming T) -> T? { t }
104+
105+
let ne = NonescapableStruct()
106+
_ = expectNotNil(opt2(ne))
107+
108+
let ncne = NoncopyableNonescapableStruct()
109+
_ = expectNotNil(opt2(ncne))
110+
111+
let nent = NonescapableNontrivialStruct()
112+
_ = expectNotNil(opt2(nent))
113+
#endif
114+
}

0 commit comments

Comments
 (0)