https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118920
--- Comment #7 from Nathaniel Shead <nshead at gcc dot gnu.org> ---
There might be more to it as well; the following sample (reduced from a
different error) complains about conflicting declarations:
// shared_ptr.hpp
template <typename> struct unique_ptr {
template <typename> friend class out_ptr_t;
};
template <typename> struct shared_ptr {
template <typename> friend class out_ptr_t;
};
// a.cpp
module;
#include "shared_ptr.hpp"
export module M;
unique_ptr<int> s;
export template <typename> void foo() { shared_ptr<int> u; }
// b.cpp
#include "shared_ptr.hpp"
import M;
int main() { foo<int>(); }
$ g++ -std=c++23 -fmodules -S [ab].cpp
In file included from b.cpp:1:
shared_ptr.hpp: In instantiation of ‘struct shared_ptr<int>’:
a.cpp:5:57: required from ‘void foo@M() [with <template-parameter-1-1> =
int]’
5 | export template <typename> void foo() { shared_ptr<int> u; }
| ^
b.cpp:3:22: required from here
3 | int main() { foo<int>(); }
| ~~~~~~~~^~
shared_ptr.hpp:6:36: error: conflicting declaration of template
‘template<class> class out_ptr_t’
6 | template <typename> friend class out_ptr_t;
| ^~~~~~~~~
In file included from a.cpp:2,
of module M, imported at b.cpp:2:
shared_ptr.hpp:2:36: note: previous declaration ‘template<class> class
out_ptr_t@M’
2 | template <typename> friend class out_ptr_t;
| ^~~~~~~~~