https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116403
Bug ID: 116403 Summary: [modules] Deduction guides not reachable across transitive non-exported imports Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: nshead at gcc dot gnu.org Blocks: 103524 Target Milestone: --- Consider: // a.cpp export module A; export template <typename T> struct S { S(int); }; S(int) -> S<double>; // b.cpp export module B; import A; export using ::S; // c.cpp import B; int main() { S s(123); // should be S<double> } This should compile successfully, as deduction guides are always visible if reachable, and reachability doesn't care that we didn't 'export import A' from module B. Instead we get: $ g++ -fmodules-ts -S [abc].cpp c.cpp: In function ‘int main()’: c.cpp:4:10: error: class template argument deduction failed: 4 | S s(123); | ^ c.cpp:4:10: error: no matching function for call to ‘S@A(int)’ In module A, imported at b.cpp:2, of module B, imported at c.cpp:1: a.cpp:2:41: note: candidate: ‘template<class T> S@A(int) -> S@A<T>’ 2 | export template <typename T> struct S { S(int); }; | ^ a.cpp:2:41: note: template argument deduction/substitution failed: c.cpp:4:10: note: couldn’t deduce template parameter ‘T’ 4 | S s(123); | ^ In module A, imported at b.cpp:2, of module B, imported at c.cpp:1: a.cpp:2:37: note: candidate: ‘template<class T> S@A(S@A<T>) -> S@A<T>’ 2 | export template <typename T> struct S { S(int); }; | ^ a.cpp:2:37: note: template argument deduction/substitution failed: c.cpp:4:10: note: mismatched types ‘S@A<T>’ and ‘int’ 4 | S s(123); | ^ It looks like my original 'hack' solution to just always consider deduction guides exported is insufficient, and we'll need a more general name lookup solution. Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103524 [Bug 103524] [meta-bug] modules issue