// RUN: %target-run-simple-swift(-enable-experimental-feature NonescapableTypes -enable-experimental-feature LifetimeDependence) // REQUIRES: executable_test // REQUIRES: reflection // REQUIRES: swift_feature_NonescapableTypes // REQUIRES: swift_feature_LifetimeDependence 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 } #if $NonescapableTypes func isEscapable(_: T.Type) -> Bool { false } func isEscapable(_: T.Type) -> Bool { true } #endif struct TrivialStruct {} struct NoncopyableStruct: ~Copyable {} class RegularClass {} #if $NonescapableTypes struct NonescapableStruct: ~Escapable, BitwiseCopyable {} struct NoncopyableNonescapableStruct: ~Copyable, ~Escapable {} struct NonescapableNontrivialStruct: ~Escapable { let foo: RegularClass? = nil } #endif suite.test("Copyability") { expectTrue(isCopyable(Optional.self)) expectFalse(isCopyable(Optional.self)) expectTrue(isCopyable(Optional.self)) #if $NonescapableTypes expectTrue(isCopyable(Optional.self)) expectFalse(isCopyable(Optional.self)) expectTrue(isCopyable(Optional.self)) #endif } suite.test("BitwiseCopyability") { expectTrue(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) #if $NonescapableTypes expectTrue(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) expectFalse(isBitwiseCopyable(Optional.self)) #endif } #if $NonescapableTypes 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)) } #endif 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) } }