summaryrefslogtreecommitdiff
path: root/tests/projects/c++/modules
diff options
context:
space:
mode:
authorruki <[email protected]>2025-09-26 22:14:46 +0800
committerGitHub <[email protected]>2025-09-26 22:14:46 +0800
commit7c9fbf87ba1d4b48fb111bf3cc4090b5ebcf90b3 (patch)
tree94e3d5a47e819b573ada0c418846f70fe1224ae6 /tests/projects/c++/modules
parentf6e00b1cc570b023c618f3753f9e0c91b82df652 (diff)
parentbcc3c5617baad62989a45a44aa2890fda5eba0f3 (diff)
Merge pull request #6809 from Arthapz/fix-stdmodule-priority
fix(C++ modules) fix stdmodule priority
Diffstat (limited to 'tests/projects/c++/modules')
-rw-r--r--tests/projects/c++/modules/add_move_remove_module/test.lua4
-rw-r--r--tests/projects/c++/modules/multiple_runtimes/src/main.cpp6
-rw-r--r--tests/projects/c++/modules/multiple_runtimes/test.lua71
-rw-r--r--tests/projects/c++/modules/multiple_runtimes/xmake.lua40
-rw-r--r--tests/projects/c++/modules/test_base.lua4
-rw-r--r--tests/projects/c++/modules/test_culling.lua4
-rw-r--r--tests/projects/c++/modules/test_stdmodules.lua1
7 files changed, 124 insertions, 6 deletions
diff --git a/tests/projects/c++/modules/add_move_remove_module/test.lua b/tests/projects/c++/modules/add_move_remove_module/test.lua
index 627688f6c..ad8c4833b 100644
--- a/tests/projects/c++/modules/add_move_remove_module/test.lua
+++ b/tests/projects/c++/modules/add_move_remove_module/test.lua
@@ -5,10 +5,10 @@ CLANG_MIN_VER = is_subhost("windows") and "19" or "17"
GCC_MIN_VER = "11"
MSVC_MIN_VER = "14.29"
-function _build(check_outdata)
+function _build(_)
local flags = ""
if ci_is_running() then
- flags = "-vD"
+ flags = "-vD"
end
os.run("xmake -r " .. flags)
io.writefile("src/bar.mpp", "export module bar;\n export {\n inline int bar() { return 0; }\n}")
diff --git a/tests/projects/c++/modules/multiple_runtimes/src/main.cpp b/tests/projects/c++/modules/multiple_runtimes/src/main.cpp
new file mode 100644
index 000000000..b25b474a6
--- /dev/null
+++ b/tests/projects/c++/modules/multiple_runtimes/src/main.cpp
@@ -0,0 +1,6 @@
+import std;
+
+int main() {
+ std::println("Hello world");
+ return 0;
+}
diff --git a/tests/projects/c++/modules/multiple_runtimes/test.lua b/tests/projects/c++/modules/multiple_runtimes/test.lua
new file mode 100644
index 000000000..ad2585efa
--- /dev/null
+++ b/tests/projects/c++/modules/multiple_runtimes/test.lua
@@ -0,0 +1,71 @@
+import("lib.detect.find_tool")
+import("core.base.semver")
+import("core.tool.toolchain")
+import("utils.ci.is_running", {alias = "ci_is_running"})
+
+CLANG_MIN_VER = "19"
+GCC_MIN_VER = "15"
+MSVC_MIN_VER = "14.35"
+
+function _check_tool_version(name, min_ver)
+ local tool = find_tool(name, {version = true})
+ if not (tool and tool.version and semver.compare(tool.version, min_ver) >= 0) then
+ return false
+ end
+ return true
+end
+
+
+function _check_msvc_version(min_ver)
+ local msvc = toolchain.load("msvc")
+ if not msvc or not msvc:check() then
+ return false
+ end
+ local vcvars = msvc:config("vcvars")
+ if not vcvars or not vcvars.VCInstallDir or not vcvars.VCToolsVersion then
+ return false
+ end
+ local version = vcvars.VCToolsVersion
+ if not version or not (semver.compare(version, min_ver) >= 0) then
+ return false
+ end
+ return true
+end
+
+function main(_)
+ if is_subhost("windows") then
+ if not _check_msvc_version(MSVC_MIN_VER) then
+ return
+ end
+ -- on windows, llvm libc++ std module is currently not supported, uncommend when supported
+ -- if not check_tool_version("clang", CLANG_MIN_VER) then
+ -- return
+ -- end
+ elseif is_host("linux") then
+ if not _check_tool_version("gcc", GCC_MIN_VER) or not _check_tool_version("clang", CLANG_MIN_VER) then
+ return
+ end
+ else
+ return
+ end
+
+ local cl_str = "modules\\std.ixx"
+ local clang_str = is_host("windows") and "v1\\std.cppm" or "v1/std.cppm"
+ local gcc_str = "v1/std.cppm"
+
+ local flags = true and "-vD" or ""
+ local outdata
+ outdata = os.iorun("xmake b " .. flags)
+ if outdata then
+ local success = false
+ -- on windows, llvm libc++ std module is currently not supported, uncommend when supported
+ if is_subhost("windows") then
+ success = outdata:find(cl_str, 1, true) -- and outdata:find(clang_str, 1, true)
+ else
+ success = outdata:find(gcc_str, 1, true) and outdata:find(clang_str, 1, true)
+ end
+ if not success then
+ raise("Multiple runtimes doesn't work\n%s", outdata)
+ end
+ end
+end
diff --git a/tests/projects/c++/modules/multiple_runtimes/xmake.lua b/tests/projects/c++/modules/multiple_runtimes/xmake.lua
new file mode 100644
index 000000000..f67ab211b
--- /dev/null
+++ b/tests/projects/c++/modules/multiple_runtimes/xmake.lua
@@ -0,0 +1,40 @@
+add_rules("mode.debug", "mode.release")
+set_languages("c++23")
+set_encodings("utf-8")
+
+if is_plat("windows") then
+ -- on windows, llvm libc++ std module is currently not supported, uncommend when supported
+ -- target("llvm")
+ -- set_kind("binary")
+ -- set_toolchains("clang")
+ -- set_runtimes("c++_shared")
+ -- set_policy("build.c++.modules", true)
+ -- add_files("src/main.cpp")
+
+ target("llvm-msvc")
+ set_kind("binary")
+ set_toolchains("clang")
+ set_policy("build.c++.modules", true)
+ add_files("src/main.cpp")
+
+ target("msvc")
+ set_kind("binary")
+ set_toolchains("msvc")
+ set_policy("build.c++.modules", true)
+ add_files("src/main.cpp")
+else
+ target("llvm")
+ set_kind("binary")
+ set_toolchains("clang")
+ set_runtimes("c++_shared")
+ set_policy("build.c++.modules", true)
+ add_files("src/main.cpp")
+
+ target("gnu")
+ set_kind("binary")
+ set_toolchains("gcc")
+ set_runtimes("stdc++_shared")
+ set_policy("build.c++.modules", true)
+ set_policy("build.c++.modules.gcc.cxx11abi", true)
+ add_files("src/main.cpp")
+end
diff --git a/tests/projects/c++/modules/test_base.lua b/tests/projects/c++/modules/test_base.lua
index 25181fe70..0a0d07dae 100644
--- a/tests/projects/c++/modules/test_base.lua
+++ b/tests/projects/c++/modules/test_base.lua
@@ -18,7 +18,7 @@ function _build(check_outdata)
outdata = os.iorun("xmake -r " .. flags)
if outdata then
if outdata:find(check_outdata.str, 1, true) then
- raise(check_outdata.format_string, outdata)
+ raise(check_outdata.format_string .. "\n%s", outdata)
end
end
else
@@ -107,7 +107,7 @@ function build_tests(toolchain_name, opt)
if opt.build then
opt.build()
else
- _build(opt.find_in_outdata)
+ _build(opt.check_outdata)
end
if opt.after_build then
opt.after_build(platform, toolchain_name, runtimes, policies, flags)
diff --git a/tests/projects/c++/modules/test_culling.lua b/tests/projects/c++/modules/test_culling.lua
index 9accf9a12..a2b046e74 100644
--- a/tests/projects/c++/modules/test_culling.lua
+++ b/tests/projects/c++/modules/test_culling.lua
@@ -7,7 +7,7 @@ MSVC_MIN_VER = "14.29"
function main(_)
local check_outdata = {str = "culled", format_string = "Modules culling does not work"}
local clang_options = {compiler = "clang", version = CLANG_MIN_VER, check_outdata = check_outdata}
- local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, check_outdata}
- local msvc_options = {version = MSVC_MIN_VER, check_outdata}
+ local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, check_outdata = check_outdata}
+ local msvc_options = {version = MSVC_MIN_VER, check_outdata = check_outdata}
run_tests(clang_options, gcc_options, msvc_options)
end
diff --git a/tests/projects/c++/modules/test_stdmodules.lua b/tests/projects/c++/modules/test_stdmodules.lua
index c9062eb96..291494b38 100644
--- a/tests/projects/c++/modules/test_stdmodules.lua
+++ b/tests/projects/c++/modules/test_stdmodules.lua
@@ -6,6 +6,7 @@ MSVC_MIN_VER = "14.35"
function main(_)
local clang_options = {stdmodule = true, compiler = "clang", version = CLANG_MIN_VER}
+ local gcc_options = {stdmodule = true, compiler = "gcc", version = GCC_MIN_VER}
-- latest mingw gcc 15.1 is broken
-- error: F:/msys64/mingw64/include/c++/15.1.0/shared_mutex:105:3: error: 'int std::__glibcxx_rwlock_timedrdlock(pthread_rwlock_t*, const timespec*)' exposes TU-local entity 'int pthread_rwlock_timedrdlock(pthread_rwlock_t*, const timespec*)'
-- 105 | __glibcxx_rwlock_timedrdlock (pthread_rwlock_t *__rwlock,