Message ID | 65aaf98a.a70a0220.d7023.9f0b@mx.google.com |
---|---|
State | New |
Headers | show |
Series | c++/modules: Handle partial specialisations in GMF [PR113405] | expand |
On 1/19/24 17:36, Nathaniel Shead wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk? OK. > -- >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 <nathanieloshead@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>;
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>;
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 <nathanieloshead@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