public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Nathaniel Shead <nshead@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-8408] c++: Handle partial specialisations in GMF [PR113405] Date: Thu, 25 Jan 2024 03:20:07 +0000 (GMT) [thread overview] Message-ID: <20240125032007.3D34F385840C@sourceware.org> (raw) https://gcc.gnu.org/g:6ff54cc0be8dfa9d9bd5922ec65e86c9eb644711 commit r14-8408-g6ff54cc0be8dfa9d9bd5922ec65e86c9eb644711 Author: Nathaniel Shead <nathanieloshead@gmail.com> Date: Fri Jan 19 22:24:18 2024 +1100 c++: Handle partial specialisations in GMF [PR113405] 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> Diff: --- 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(-) diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index 70785493561..f26b2265bce 100644 --- a/gcc/cp/module.cc +++ b/gcc/cp/module.cc @@ -18865,8 +18865,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>;
reply other threads:[~2024-01-25 3:20 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20240125032007.3D34F385840C@sourceware.org \ --to=nshead@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).