// RUN: %target-run-simple-swift(-enable-experimental-feature Lifetimes) // REQUIRES: executable_test // REQUIRES: reflection // REQUIRES: swift_feature_Lifetimes import StdlibUnittest import Swift let suite = TestSuite("Optional") defer { runAllTests() } func isCopyable(_: T.Type) -> Bool { false } func isCopyable(_: T.Type) -> Bool { true } func isBitwiseCopyable(_: T.Type) -> Bool { false } func isBitwiseCopyable(_: T.Type) -> Bool { true } func isEscapable(_: T.Type) -> Bool { false } func isEscapable(_: T.Type) -> Bool { true } struct TrivialStruct {} struct NoncopyableStruct: ~Copyable {} class RegularClass {} struct NonescapableStruct: ~Escapable, BitwiseCopyable {} struct NoncopyableNonescapableStruct: ~Copyable, ~Escapable {} struct NonescapableNontrivialStruct: ~Escapable { let foo: RegularClass? = nil } suite.test("Copyability") { expectTrue(isCopyable(Optional.self)) expectFalse(isCopyable(Optional.self)) expectTrue(isCopyable(Optional.self)) expectTrue(isCopyable(Optional.self)) expectFalse(isCopyable(Optional.self)) expectTrue(isCopyable(Optional.self)) } suite.test("BitwiseCopyability") { expectTrue(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) expectTrue(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) } suite.test("Escapability") { expectTrue(isEscapable(Optional.self)) expectTrue(isEscapable(Optional.self)) expectTrue(isEscapable(Optional.self)) expectFalse(isEscapable(Optional.self)) expectFalse(isEscapable(Optional.self)) expectFalse(isEscapable(Optional.self)) } func apply( _ input: T, _ body: (T) -> U ) -> U { body(input) } func apply2( _ input: consuming T, _ body: (consuming T) -> U ) -> U { body(input) } suite.test("Initializer references") { do { let r = apply(TrivialStruct(), Optional.init) expectTrue(r != nil) } do { let r = apply2(NoncopyableStruct(), Optional.init) expectTrue(r != nil) } } suite.test("expectNotNil()") { func opt1(_ t: consuming T) -> T? { Optional.some(t) } _ = expectNotNil(opt1(TrivialStruct())) _ = expectNotNil(opt1(NoncopyableStruct())) _ = expectNotNil(opt1(RegularClass())) @_lifetime(copy t) func opt2(_ t: consuming T) -> T? { t } let ne = NonescapableStruct() _ = expectNotNil(opt2(ne)) let ncne = NoncopyableNonescapableStruct() _ = expectNotNil(opt2(ncne)) let nent = NonescapableNontrivialStruct() _ = expectNotNil(opt2(nent)) } suite.test("expectNil()") { func opt1(_ t: consuming T) -> T? { nil } expectNil(opt1(TrivialStruct())) expectNil(opt1(NoncopyableStruct())) expectNil(opt1(RegularClass())) @_lifetime(copy t) func opt2(_ t: consuming T) -> T? { nil } let ne = NonescapableStruct() expectNil(opt2(ne)) let ncne = NoncopyableNonescapableStruct() expectNil(opt2(ncne)) let nent = NonescapableNontrivialStruct() expectNil(opt2(nent)) }