Currently, when exporting names from the GMF, or within header modules,
for a set of constrained partial specialisations we only emit the first
one. This is because the 'type_specialization' list only includes a
single specialization per template+argument list; constraints are not
considered here.
The existing code uses a separate 'partial_specializations' list to
track this instead, but currently it's only used for declarations in the
module purview. This patch makes use of this list for all declarations.
PR c++/113405
gcc/cp/ChangeLog:
* module.cc (set_defining_module): Track partial specialisations
for all declarations.
gcc/testsuite/ChangeLog:
* g++.dg/modules/concept-9.h: New test.
* g++.dg/modules/concept-9_a.C: New test.
* g++.dg/modules/concept-9_b.C: New test.
* g++.dg/modules/concept-10_a.H: New test.
* g++.dg/modules/concept-10_b.C: New test.
Signed-off-by: Nathaniel Shead <nathanieloshead@gmail.com>
gcc_checking_assert (!DECL_LANG_SPECIFIC (decl)
|| !DECL_MODULE_IMPORT_P (decl));
- if (module_has_cmi_p ())
+ if (module_p ())
{
+ /* We need to track all declarations within a module, not just those
+ in the module purview, because we don't necessarily know yet if
+ this module will require a CMI while in the global fragment. */
tree ctx = DECL_CONTEXT (decl);
if (ctx
&& (TREE_CODE (ctx) == RECORD_TYPE || TREE_CODE (ctx) == UNION_TYPE)
--- /dev/null
+// Also test header modules
+// PR c++/113405
+// { dg-additional-options "-fmodule-header" }
+// { dg-require-effective-target c++20 }
+// { dg-module-cmi {} }
+
+template <typename>
+concept foo = false;
+
+template <typename>
+concept bar = true;
+
+template <typename T>
+struct corge {};
+
+template <foo F>
+struct corge<F> {};
+
+template <bar B>
+struct corge<B> {
+ using alias = int;
+};
+
+template <typename T>
+using corge_alias = corge<T>::alias;
--- /dev/null
+// PR c++/113405
+// { dg-additional-options "-fmodules-ts" }
+// { dg-require-effective-target c++20 }
+
+import "concept-10_a.H";
+
+struct test {};
+using quux = corge_alias<test>;
--- /dev/null
+// PR c++/113405
+
+template <typename>
+concept foo = false;
+
+template <typename>
+concept bar = true;
+
+template <typename T>
+struct corge {};
+
+template <foo F>
+struct corge<F> {};
+
+template <bar B>
+struct corge<B> {
+ using alias = int;
+};
--- /dev/null
+// PR c++/113405
+// { dg-additional-options "-fmodules-ts" }
+// { dg-require-effective-target c++20 }
+// { dg-module-cmi M }
+
+module;
+
+#include "concept-9.h"
+
+export module M;
+
+export template<class T>
+using corge_alias = corge<T>::alias;
--- /dev/null
+// PR c++/113405
+// { dg-additional-options "-fmodules-ts" }
+// { dg-require-effective-target c++20 }
+
+import M;
+
+struct test {};
+using quux = corge_alias<test>;