From 62d024ca4f6541aa3e3b38839b2dbddc5a253afe Mon Sep 17 00:00:00 2001 From: Egor Zhdan Date: Mon, 28 Jul 2025 16:31:46 +0100 Subject: [PATCH] [cxx-interop] Test trivial usage of `std::variant` from Swift For now, Swift doesn't provide a way to extract an element out of `std::variant`. This adds a test to check that we still import instantiations of `std::variant` into Swift. rdar://155050719 --- .../Cxx/stdlib/Inputs/module.modulemap | 6 +++++ test/Interop/Cxx/stdlib/Inputs/std-variant.h | 16 ++++++++++++++ test/Interop/Cxx/stdlib/use-std-variant.swift | 22 +++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 test/Interop/Cxx/stdlib/Inputs/std-variant.h create mode 100644 test/Interop/Cxx/stdlib/use-std-variant.swift diff --git a/test/Interop/Cxx/stdlib/Inputs/module.modulemap b/test/Interop/Cxx/stdlib/Inputs/module.modulemap index 57f7eae3bb670..3db778f6690f4 100644 --- a/test/Interop/Cxx/stdlib/Inputs/module.modulemap +++ b/test/Interop/Cxx/stdlib/Inputs/module.modulemap @@ -76,6 +76,12 @@ module StdFunction { export * } +module StdVariant { + header "std-variant.h" + requires cplusplus + export * +} + module NoCXXStdlib { header "no-cxx-stdlib.h" requires cplusplus diff --git a/test/Interop/Cxx/stdlib/Inputs/std-variant.h b/test/Interop/Cxx/stdlib/Inputs/std-variant.h new file mode 100644 index 0000000000000..8c8f122d126a7 --- /dev/null +++ b/test/Interop/Cxx/stdlib/Inputs/std-variant.h @@ -0,0 +1,16 @@ +#include +#include + +using StdVariantIntOrString = std::variant; +inline StdVariantIntOrString getStdVariantInt() { return {123}; } +inline StdVariantIntOrString getStdVariantString() { return {"abc"}; } + +struct HasDeletedCopyCtor { + int value; + HasDeletedCopyCtor(int value) : value(value) {} + HasDeletedCopyCtor(const HasDeletedCopyCtor &other) = delete; + HasDeletedCopyCtor(HasDeletedCopyCtor &&other) = default; +}; + +using StdVariantIntOrNonCopyable = std::variant; +inline StdVariantIntOrNonCopyable getStdVariantNonCopyable() { return HasDeletedCopyCtor(123); } diff --git a/test/Interop/Cxx/stdlib/use-std-variant.swift b/test/Interop/Cxx/stdlib/use-std-variant.swift new file mode 100644 index 0000000000000..91ffbd905ed06 --- /dev/null +++ b/test/Interop/Cxx/stdlib/use-std-variant.swift @@ -0,0 +1,22 @@ +// RUN: %target-run-simple-swift(-I %S/Inputs -cxx-interoperability-mode=upcoming-swift -Xcc -std=c++17) + +// REQUIRES: executable_test + +import StdlibUnittest +import StdVariant +import CxxStdlib + +var StdVariantTestSuite = TestSuite("StdVariant") + +StdVariantTestSuite.test("index()") { + let variantInt = getStdVariantInt() + expectEqual(variantInt.index(), 0) + + let variantString = getStdVariantString() + expectEqual(variantString.index(), 1) + + let variantNonCopyable = getStdVariantNonCopyable() + expectEqual(variantNonCopyable.index(), 0) +} + +runAllTests()