Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? -- >8 --
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 <nathanielosh...@gmail.com> --- gcc/cp/module.cc | 5 ++++- gcc/testsuite/g++.dg/modules/concept-10_a.H | 25 +++++++++++++++++++++ gcc/testsuite/g++.dg/modules/concept-10_b.C | 8 +++++++ gcc/testsuite/g++.dg/modules/concept-9.h | 18 +++++++++++++++ gcc/testsuite/g++.dg/modules/concept-9_a.C | 13 +++++++++++ gcc/testsuite/g++.dg/modules/concept-9_b.C | 8 +++++++ 6 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/modules/concept-10_a.H create mode 100644 gcc/testsuite/g++.dg/modules/concept-10_b.C create mode 100644 gcc/testsuite/g++.dg/modules/concept-9.h create mode 100644 gcc/testsuite/g++.dg/modules/concept-9_a.C create mode 100644 gcc/testsuite/g++.dg/modules/concept-9_b.C diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 8db662c0267..249d0816169 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -18860,8 +18860,11 @@ set_defining_module (tree decl) 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) diff --git a/gcc/testsuite/g++.dg/modules/concept-10_a.H b/gcc/testsuite/g++.dg/modules/concept-10_a.H new file mode 100644 index 00000000000..c3a5fa727a7 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-10_a.H @@ -0,0 +1,25 @@ +// 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; diff --git a/gcc/testsuite/g++.dg/modules/concept-10_b.C b/gcc/testsuite/g++.dg/modules/concept-10_b.C new file mode 100644 index 00000000000..67be13d5995 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-10_b.C @@ -0,0 +1,8 @@ +// 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>; diff --git a/gcc/testsuite/g++.dg/modules/concept-9.h b/gcc/testsuite/g++.dg/modules/concept-9.h new file mode 100644 index 00000000000..1c7f003228c --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-9.h @@ -0,0 +1,18 @@ +// 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; +}; diff --git a/gcc/testsuite/g++.dg/modules/concept-9_a.C b/gcc/testsuite/g++.dg/modules/concept-9_a.C new file mode 100644 index 00000000000..9a055b6dcc9 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-9_a.C @@ -0,0 +1,13 @@ +// 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; diff --git a/gcc/testsuite/g++.dg/modules/concept-9_b.C b/gcc/testsuite/g++.dg/modules/concept-9_b.C new file mode 100644 index 00000000000..55a64a9a413 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-9_b.C @@ -0,0 +1,8 @@ +// PR c++/113405 +// { dg-additional-options "-fmodules-ts" } +// { dg-require-effective-target c++20 } + +import M; + +struct test {}; +using quux = corge_alias<test>; -- 2.43.0