https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118049
Nathaniel Shead <nshead at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Assignee|unassigned at gcc dot gnu.org |nshead at gcc dot
gnu.org
CC| |nshead at gcc dot gnu.org
Ever confirmed|0 |1
Last reconfirmed| |2025-01-17
--- Comment #2 from Nathaniel Shead <nshead at gcc dot gnu.org> ---
Confirmed. Here's a reduced testcase which doesn't rely on us not completely
discarding the GMF:
// a.cpp
module;
template <typename T> struct S {
auto foo() {}
};
export module A;
template struct S<char>;
// b.cpp
module;
template <typename T> struct S {
auto foo() {}
};
template struct S<char>;
export module B;
import A;
template <typename> void x() {
S<char>{}.foo();
}
// c.cpp
import B;
Compiling with 'g++ -fmodules -fno-module-lazy -Wno-global-module -S [abc].cpp'
gives:
In module B, imported at c.cpp:1:
b.cpp:3:8: error: conflicting global module declaration ‘auto S@A<T>::foo()
[with T = char]’
3 | auto foo() {}
| ^~~
In module A, imported at b.cpp:7,
of module B, imported at c.cpp:1:
a.cpp:3:8: note: existing declaration ‘auto S@A<T>::foo() [with T = char]’
3 | auto foo() {}
| ^~~
I think I have a fix.