summaryrefslogtreecommitdiff
path: root/tests/projects/c++/modules
diff options
context:
space:
mode:
authorruki <[email protected]>2026-04-08 16:46:28 +0800
committerGitHub <[email protected]>2026-04-08 16:46:28 +0800
commit3a91a8b27ebc9d40656750615a3606e5fe971fc9 (patch)
tree9d76ca97662897854f57b38d09861c6e8449ab73 /tests/projects/c++/modules
parentad2ec59e16d975d0fae054649ad360fe85031012 (diff)
parent9d962c7502d997218a99ea00491475ca8d568066 (diff)
Merge pull request #7449 from Akaps316/codex/fix-modules-private-dep-bmis
fix(c++/modules): avoid leaking private dep flags to rebuilt BMIs
Diffstat (limited to 'tests/projects/c++/modules')
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h3
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp5
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp9
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp3
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/test.lua47
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua16
6 files changed, 83 insertions, 0 deletions
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h b/tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h
new file mode 100644
index 000000000..3ceb5dcd5
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/include/public_config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#define PUBLIC_CONFIG_VALUE 0
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp b/tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp
new file mode 100644
index 000000000..5b477f2d6
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/main.cpp
@@ -0,0 +1,5 @@
+import mod;
+
+int main() {
+ return foo();
+}
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp
new file mode 100644
index 000000000..aaf40d855
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp
@@ -0,0 +1,9 @@
+module;
+
+#include <public_config.h>
+
+module mod;
+
+int foo() {
+ return PUBLIC_CONFIG_VALUE;
+}
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp
new file mode 100644
index 000000000..b55b834a7
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.mpp
@@ -0,0 +1,3 @@
+export module mod;
+
+export int foo();
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/test.lua b/tests/projects/c++/modules/reuse_strict_private_defines/test.lua
new file mode 100644
index 000000000..6e3304b68
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/test.lua
@@ -0,0 +1,47 @@
+inherit(".test_base")
+import("utils.ci.is_running", {alias = "ci_is_running"})
+
+local CLANG_MIN_VER = is_subhost("windows") and "19" or "17"
+local GCC_MIN_VER = "11"
+local MSVC_MIN_VER = "14.29"
+
+local PRIVATE_DEFINE = "PRIVATE_DEP_DEFINE_DO_NOT_PROPAGATE"
+local PUBLIC_SYSINCLUDEDIR = path.translate("src/include")
+
+function _build()
+ local flags = ""
+ if ci_is_running() then
+ flags = "-vD"
+ end
+ local leaked = false
+ local missing_sysincludedir = true
+ local outdata = try { function () return os.iorun("xmake -rv") end }
+ if outdata then
+ for line in outdata:gmatch("[^\r\n]+") do
+ if line:find("Consumer", 1, true) then
+ if line:find(PRIVATE_DEFINE, 1, true) then
+ leaked = true
+ end
+ if line:find(PUBLIC_SYSINCLUDEDIR, 1, true) then
+ missing_sysincludedir = false
+ end
+ end
+ end
+ if leaked then
+ raise("Private dependency defines leaked into Consumer module rebuilds under reuse.strict\n%s", outdata)
+ end
+ if missing_sysincludedir then
+ raise("Missing public sysincludedir in Consumer module rebuilds under reuse.strict\n%s", outdata)
+ end
+ else
+ -- maybe build failed, we need to see verbose errors
+ os.run("xmake " .. flags)
+ end
+end
+
+function main(_)
+ local clang_options = {compiler = "clang", version = CLANG_MIN_VER, build = _build}
+ local gcc_options = {compiler = "gcc", version = GCC_MIN_VER, build = _build}
+ local msvc_options = {version = MSVC_MIN_VER, build = _build}
+ run_tests(clang_options, gcc_options, msvc_options)
+end
diff --git a/tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua b/tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua
new file mode 100644
index 000000000..77314cf47
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua
@@ -0,0 +1,16 @@
+add_rules("mode.debug", "mode.release")
+
+set_languages("c++20")
+
+target("Producer")
+ set_kind("static")
+ add_defines("PRIVATE_DEP_DEFINE_DO_NOT_PROPAGATE")
+ add_sysincludedirs("src/include", {public = true})
+ add_files("src/mod.mpp", {public = true})
+ add_files("src/mod.cpp")
+
+target("Consumer")
+ set_kind("binary")
+ set_policy("build.c++.modules.reuse.strict", true)
+ add_deps("Producer")
+ add_files("src/main.cpp")