Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[libc++] Add a few basic tests for C++ / Swift interoperation #104863

Closed
wants to merge 1 commit into from

Conversation

ldionne
Copy link
Member

@ldionne ldionne commented Aug 19, 2024

These tests are only enabled on Apple platforms. The purpose of these tests is to ensure that we don't break existing functionality powered by Clang modules as we refactor the modulemap, since Swift interop greatly exercises libc++'s support for Clang modules.

In particular, adding these tests to libc++ is not an official statement of support from libc++ towards Swift interop (which would require a community consensus that I am not pursuing at this time), but rather a way for us to find out when we unexpectedly break things so we can decide how / whether we want to address such breakage.

Once the refactoring of the modulemap started in #98214 is mostly done, it would be reasonable to remove these tests unless libc++ wants to pursue support for Swift interop more officially.

These tests are only enabled on Apple platforms. The purpose of these
tests is to ensure that we don't break existing functionality powered
by Clang modules as we refactor the modulemap, since Swift interop
greatly exercises libc++'s support for Clang modules.

In particular, adding these tests to libc++ is not an official statement
of support from libc++ towards Swift interop (which would require a
community consensus that I am not pursuing at this time), but rather a
way for us to find out when we unexpectedly break things so we can decide
how / whether we want to address such breakage.

Once the refactoring of the modulemap started in llvm#98214 is mostly done,
it would be reasonable to remove these tests unless libc++ wants to
pursue support for Swift interop more officially.
@ldionne ldionne requested a review from a team as a code owner August 19, 2024 21:27
@llvmbot llvmbot added the libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi. label Aug 19, 2024
@llvmbot
Copy link
Collaborator

llvmbot commented Aug 19, 2024

@llvm/pr-subscribers-libcxx

Author: Louis Dionne (ldionne)

Changes

These tests are only enabled on Apple platforms. The purpose of these tests is to ensure that we don't break existing functionality powered by Clang modules as we refactor the modulemap, since Swift interop greatly exercises libc++'s support for Clang modules.

In particular, adding these tests to libc++ is not an official statement of support from libc++ towards Swift interop (which would require a community consensus that I am not pursuing at this time), but rather a way for us to find out when we unexpectedly break things so we can decide how / whether we want to address such breakage.

Once the refactoring of the modulemap started in #98214 is mostly done, it would be reasonable to remove these tests unless libc++ wants to pursue support for Swift interop more officially.


Full diff: https://github.com/llvm/llvm-project/pull/104863.diff

5 Files Affected:

  • (added) libcxx/test/libcxx/vendor/apple/swift-interop.sh.cpp (+21)
  • (added) libcxx/test/libcxx/vendor/apple/swift-interop/string/main.swift (+13)
  • (added) libcxx/test/libcxx/vendor/apple/swift-interop/vector/header.h (+13)
  • (added) libcxx/test/libcxx/vendor/apple/swift-interop/vector/main.swift (+13)
  • (added) libcxx/test/libcxx/vendor/apple/swift-interop/vector/module.modulemap (+4)
diff --git a/libcxx/test/libcxx/vendor/apple/swift-interop.sh.cpp b/libcxx/test/libcxx/vendor/apple/swift-interop.sh.cpp
new file mode 100755
index 00000000000000..87c6c80f62a7eb
--- /dev/null
+++ b/libcxx/test/libcxx/vendor/apple/swift-interop.sh.cpp
@@ -0,0 +1,21 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// This test requires access to the Swift compiler, which we assume is only available on Apple
+// platforms for now.
+// REQUIRES: buildhost=darwin
+
+// std::string basic test
+// RUN: swiftc -cxx-interoperability-mode=default %S/swift-interop/string/main.swift -o %t.string.exe \
+// RUN:   -Xcc -nostdinc++ -Xcc -nostdlib++ -Xcc -isystem -Xcc "%{include-dir}"
+// RUN: %{exec} %t.string.exe
+
+// std::vector test with a modulemap
+// RUN: swiftc -cxx-interoperability-mode=default %S/swift-interop/vector/main.swift -o %t.vector.exe \
+// RUN:   -Xcc -nostdinc++ -Xcc -nostdlib++ -Xcc -isystem -Xcc "%{include-dir}" -Xcc -I -Xcc %S/swift-interop/vector
+// RUN: %{exec} %t.vector.exe
diff --git a/libcxx/test/libcxx/vendor/apple/swift-interop/string/main.swift b/libcxx/test/libcxx/vendor/apple/swift-interop/string/main.swift
new file mode 100755
index 00000000000000..1b2e12f839ba7d
--- /dev/null
+++ b/libcxx/test/libcxx/vendor/apple/swift-interop/string/main.swift
@@ -0,0 +1,13 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+import CxxStdlib
+
+let s: std.string = "abc123"
+
+for char in s { print(char) }
diff --git a/libcxx/test/libcxx/vendor/apple/swift-interop/vector/header.h b/libcxx/test/libcxx/vendor/apple/swift-interop/vector/header.h
new file mode 100644
index 00000000000000..de41747de05155
--- /dev/null
+++ b/libcxx/test/libcxx/vendor/apple/swift-interop/vector/header.h
@@ -0,0 +1,13 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <vector>
+
+using VectorOfInt = std::vector<int>;
+
+inline VectorOfInt getStdVector() { return {1, 2, 3}; }
diff --git a/libcxx/test/libcxx/vendor/apple/swift-interop/vector/main.swift b/libcxx/test/libcxx/vendor/apple/swift-interop/vector/main.swift
new file mode 100644
index 00000000000000..6ec3640881424d
--- /dev/null
+++ b/libcxx/test/libcxx/vendor/apple/swift-interop/vector/main.swift
@@ -0,0 +1,13 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+import MyCxxDep // no explicit import of CxxStdlib
+
+let vec = getStdVector()
+
+for it in vec { print(it) }
diff --git a/libcxx/test/libcxx/vendor/apple/swift-interop/vector/module.modulemap b/libcxx/test/libcxx/vendor/apple/swift-interop/vector/module.modulemap
new file mode 100644
index 00000000000000..8dabb571262613
--- /dev/null
+++ b/libcxx/test/libcxx/vendor/apple/swift-interop/vector/module.modulemap
@@ -0,0 +1,4 @@
+module MyCxxDep {
+    header "header.h"
+    export *
+}

@ldionne
Copy link
Member Author

ldionne commented Oct 9, 2024

Closing since the modulemap generation work has been done.

This was prevented from landing due to the macOS builders having a version of Xcode that was too old.

@ldionne ldionne closed this Oct 9, 2024
@ldionne ldionne deleted the review/apple-swift-interop-tests branch October 16, 2024 16:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
libc++ libc++ C++ Standard Library. Not GNU libstdc++. Not libc++abi.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants