From 00ed3bd40f6b9e2858f0d034f56db2bab9a3dd56 Mon Sep 17 00:00:00 2001 From: Egor Zhdan Date: Fri, 4 Jul 2025 19:49:33 +0100 Subject: [PATCH] [cxx-interop] Test `std::optional` with AddressableParameters Enabling AddressableParameters feature resolves a miscompile with `var pointee` properties of `std::optional`. rdar://154945438 / https://github.com/swiftlang/swift/issues/82765 --- test/Interop/Cxx/stdlib/use-std-optional.swift | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/test/Interop/Cxx/stdlib/use-std-optional.swift b/test/Interop/Cxx/stdlib/use-std-optional.swift index b2acb01eb035d..edb4b1b07726d 100644 --- a/test/Interop/Cxx/stdlib/use-std-optional.swift +++ b/test/Interop/Cxx/stdlib/use-std-optional.swift @@ -1,9 +1,11 @@ // RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -cxx-interoperability-mode=swift-5.9) // RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -cxx-interoperability-mode=swift-6) // RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -cxx-interoperability-mode=upcoming-swift) +// RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -cxx-interoperability-mode=upcoming-swift -enable-experimental-feature AddressableParameters) // RUN: %target-run-simple-swift(-I %S/Inputs -Xfrontend -cxx-interoperability-mode=upcoming-swift -Xcc -std=c++20) // // REQUIRES: executable_test +// REQUIRES: swift_feature_AddressableParameters // Undefined hidden symbol to C++ voidify in libcxx // rdar://121551667 @@ -62,10 +64,18 @@ StdOptionalTestSuite.test("std::optional init(_:Wrapped)") { // FIXME: making these variables immutable triggers a miscompile on Linux // (https://github.com/swiftlang/swift/issues/82765) - var optBoolT = StdOptionalBool(true) - var optBoolF = StdOptionalBool(false) + var optBoolTMutable = StdOptionalBool(true) + var optBoolFMutable = StdOptionalBool(false) + expectTrue(optBoolTMutable.pointee) + expectFalse(optBoolFMutable.pointee) + + // If AddressableParameters are enabled, this issue does not happen. +#if hasFeature(AddressableParameters) + let optBoolT = StdOptionalBool(true) + let optBoolF = StdOptionalBool(false) expectTrue(optBoolT.pointee) expectFalse(optBoolF.pointee) +#endif let optString = StdOptionalString(std.string("abc")) expectEqual(std.string("abc"), optString.pointee)