Skip to content

Commit a348c51

Browse files
authored
Merge pull request #82703 from glessard/rdar154776967-generalize-expectNil-62
2 parents 6fbf38f + 1e6a65a commit a348c51

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

stdlib/private/StdlibUnittest/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ endif()
1717

1818
set(swift_stdlib_unittest_compile_flags
1919
"-Xfrontend" "-disable-objc-attr-requires-foundation-module")
20+
21+
list(APPEND swift_stdlib_unittest_compile_flags "-enable-experimental-feature" "Lifetimes")
22+
2023
if (SWIFT_RUNTIME_ENABLE_LEAK_CHECKER)
2124
list(APPEND swift_stdlib_unittest_compile_flags "-DSWIFT_RUNTIME_ENABLE_LEAK_CHECKER")
2225
endif()

stdlib/private/StdlibUnittest/StdlibUnittest.swift

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -739,20 +739,40 @@ 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
755-
@lifetime(copy value)
775+
@_lifetime(copy value)
756776
public func expectNotNil<T: ~Copyable & ~Escapable>(
757777
_ value: consuming T?,
758778
_ message: @autoclosure () -> String = "",

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)