Skip to content

[C++20][Modules] Name is not visible in instantiation of an imported function template #71484

@cpplearner

Description

@cpplearner

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.

Metadata

Metadata

Assignees

Labels

clang:modulesC++20 modules and Clang Header Modules

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions