clang++ --version:
clang version 17.0.4
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: D:\LLVM-17.0.4\bin
mod1.cpp:
export module mod1;
export template<class T>
T mod1_f(T x) {
return x;
}
mod2.cpp:
export module mod2;
import mod1;
export template<class U>
U mod2_g(U y) {
return mod1_f(y);
}
mod3.cpp:
export module mod3;
import mod2;
export int mod3_h(int p) {
return mod2_g(p);
}
clang++ -std=c++20 -x c++-module -c -fprebuilt-module-path=. mod1.cpp -fmodule-output=mod1.pcm
clang++ -std=c++20 -x c++-module -c -fprebuilt-module-path=. mod2.cpp -fmodule-output=mod2.pcm
clang++ -std=c++20 -x c++-module -c -fprebuilt-module-path=. mod3.cpp -fmodule-output=mod3.pcm:
In file included from mod3.cpp:2:
D:\test\test-module\mod2.cpp:6:12: error: call to function 'mod1_f' that is neither visible in the template definition nor found by argument-dependent lookup
6 | return mod1_f(y);
| ^
mod3.cpp:5:12: note: in instantiation of function template specialization 'mod2_g<int>' requested here
5 | return mod2_g(p);
| ^
D:\test\test-module\mod1.cpp:4:3: note: 'mod1_f' should be declared prior to the call site
4 | T mod1_f(T x) {
| ^
1 error generated.
I think the name mod1_f should be visible within mod2, because mod1 is imported there.
Adding import mod1; to mod3 makes the error disappear, but IMO it shouldn't matter whether mod3 imports mod1, since mod1_f is not directly referenced within mod3.
clang++ --version:mod1.cpp:
mod2.cpp:
mod3.cpp:
clang++ -std=c++20 -x c++-module -c -fprebuilt-module-path=. mod1.cpp -fmodule-output=mod1.pcmclang++ -std=c++20 -x c++-module -c -fprebuilt-module-path=. mod2.cpp -fmodule-output=mod2.pcmclang++ -std=c++20 -x c++-module -c -fprebuilt-module-path=. mod3.cpp -fmodule-output=mod3.pcm:I think the name
mod1_fshould be visible withinmod2, becausemod1is imported there.Adding
import mod1;tomod3makes the error disappear, but IMO it shouldn't matter whethermod3importsmod1, sincemod1_fis not directly referenced withinmod3.