summaryrefslogtreecommitdiff
path: root/tests/projects/c++/modules
diff options
context:
space:
mode:
authorAkaps316 <[email protected]>2026-04-03 18:47:28 +0530
committerAkaps316 <[email protected]>2026-04-03 20:56:23 +0530
commit5271c90286fa0fc80fda695bb399516bb8c6b4b4 (patch)
tree6b0e17c2c7df0a7c87f8d52524619f1f2a7d4f74 /tests/projects/c++/modules
parent39fd35ea9d5d14079e4669b85423d488c9097cd4 (diff)
fix(c++/modules): avoid leaking private dep flags to rebuilt BMIs
Only inherit interface-visible defines/undefines/includedirs when collecting module fileconfigs from dependency targets. This fixes consumer-side BMI rebuilds under build.c++.modules.reuse.strict picking up private producer flags. Add a regression test for strict module reuse with a shared dependency.
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.cpp7
-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.lua34
-rw-r--r--tests/projects/c++/modules/reuse_strict_private_defines/xmake.lua16
6 files changed, 68 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..478993dfb
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/src/mod.cpp
@@ -0,0 +1,7 @@
+#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..bd9b241cd
--- /dev/null
+++ b/tests/projects/c++/modules/reuse_strict_private_defines/test.lua
@@ -0,0 +1,34 @@
+inherit(".test_base")
+
+local PRIVATE_DEFINE = "PRIVATE_DEP_DEFINE_DO_NOT_PROPAGATE"
+local PUBLIC_SYSINCLUDEDIR = path.translate(path.absolute("src/include"))
+
+function _build()
+ local outdata = os.iorun("xmake -r -vD")
+ local leaked = false
+ local missing_sysincludedir = true
+ 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
+ os.run("xmake -vD")
+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..aba5cc895
--- /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("cxx20")
+
+target("Producer")
+ set_kind("shared")
+ 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")