Skip to content

Commit 6c588dc

Browse files
authored
Merge pull request #82701 from glessard/rdar154776967-generalize-expectNil
[stdlibUnittest] generalize `expectNil(_:)`
2 parents 010291f + 987fedf commit 6c588dc

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

stdlib/private/StdlibUnittest/StdlibUnittest.swift

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -739,18 +739,38 @@ public func expectDoesNotThrow(_ test: () throws -> Void,
739739
}
740740
}
741741

742-
public func expectNil<T>(_ value: T?,
742+
public func expectNil<T>(
743+
_ value: T?,
743744
_ message: @autoclosure () -> String = "",
744745
stackTrace: SourceLocStack = SourceLocStack(),
745746
showFrame: Bool = true,
746-
file: String = #file, line: UInt = #line) {
747+
file: String = #file, line: UInt = #line
748+
) {
747749
if value != nil {
748750
expectationFailure(
749-
"expected optional to be nil\nactual: \"\(value!)\"", trace: message(),
751+
"expected optional to be nil\nactual: \"\(value!)\"",
752+
trace: message(),
750753
stackTrace: stackTrace.pushIf(showFrame, file: file, line: line))
751754
}
752755
}
753756

757+
@_lifetime(copy value)
758+
public func expectNil<T: ~Copyable & ~Escapable>(
759+
_ value: borrowing T?,
760+
_ message: @autoclosure () -> String = "",
761+
stackTrace: SourceLocStack = SourceLocStack(),
762+
showFrame: Bool = true,
763+
file: String = #file, line: UInt = #line
764+
) {
765+
if value != nil {
766+
expectationFailure(
767+
"expected optional to be nil",
768+
trace: message(),
769+
stackTrace: stackTrace.pushIf(showFrame, file: file, line: line)
770+
)
771+
}
772+
}
773+
754774
@discardableResult
755775
@_lifetime(copy value)
756776
public func expectNotNil<T: ~Copyable & ~Escapable>(

test/stdlib/OptionalGeneralizations.swift

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
// RUN: %target-run-simple-swift(-enable-experimental-feature NonescapableTypes -enable-experimental-feature LifetimeDependence)
1+
// RUN: %target-run-simple-swift(-enable-experimental-feature Lifetimes)
22
// REQUIRES: executable_test
33
// REQUIRES: reflection
4-
// REQUIRES: swift_feature_NonescapableTypes
5-
// REQUIRES: swift_feature_LifetimeDependence
4+
// REQUIRES: swift_feature_Lifetimes
65

76
import StdlibUnittest
87
import Swift
@@ -99,7 +98,7 @@ suite.test("expectNotNil()") {
9998
_ = expectNotNil(opt1(NoncopyableStruct()))
10099
_ = expectNotNil(opt1(RegularClass()))
101100
#if $NonescapableTypes
102-
@lifetime(copy t)
101+
@_lifetime(copy t)
103102
func opt2<T: ~Copyable & ~Escapable>(_ t: consuming T) -> T? { t }
104103

105104
let ne = NonescapableStruct()
@@ -110,5 +109,25 @@ suite.test("expectNotNil()") {
110109

111110
let nent = NonescapableNontrivialStruct()
112111
_ = expectNotNil(opt2(nent))
113-
#endif
112+
#endif // $NonescapableTypes
113+
}
114+
115+
suite.test("expectNil()") {
116+
func opt1<T: ~Copyable>(_ t: consuming T) -> T? { nil }
117+
expectNil(opt1(TrivialStruct()))
118+
expectNil(opt1(NoncopyableStruct()))
119+
expectNil(opt1(RegularClass()))
120+
#if $NonescapableTypes
121+
@_lifetime(copy t)
122+
func opt2<T: ~Copyable & ~Escapable>(_ t: consuming T) -> T? { nil }
123+
124+
let ne = NonescapableStruct()
125+
expectNil(opt2(ne))
126+
127+
let ncne = NoncopyableNonescapableStruct()
128+
expectNil(opt2(ncne))
129+
130+
let nent = NonescapableNontrivialStruct()
131+
expectNil(opt2(nent))
132+
#endif // $NonescapableTypes
114133
}

0 commit comments

Comments
 (0)