Message ID | 20231124180922.1302655-1-ppalka@redhat.com |
---|---|
State | New |
Headers | show |
Series | c++/modules: alias CTAD and specializations table | expand |
On 11/24/23 13:09, Patrick Palka wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for > trunk? OK. > -- >8 -- > > A rewritten guide for alias CTAD isn't really a specialization of the > original guide, so we shouldn't register it as such. This avoids an ICE > in the below modules testcase which otherwise tries to inspect the > rewritten guide's empty DECL_CONTEXT. It also preemptively avoids an > ICE in modules/concept-6 in C++23 mode with the inherited CTAD patch. > > * pt.cc (alias_ctad_tweaks): Pass use_spec_table=false to > tsubst_decl. > > gcc/testsuite/ChangeLog: > > * g++.dg/modules/concept-8.h: New test. > * g++.dg/modules/concept-8_a.H: New test. > * g++.dg/modules/concept-8_b.C: New test. > --- > gcc/cp/pt.cc | 3 ++- > gcc/testsuite/g++.dg/modules/concept-8.h | 14 ++++++++++++++ > gcc/testsuite/g++.dg/modules/concept-8_a.H | 5 +++++ > gcc/testsuite/g++.dg/modules/concept-8_b.C | 8 ++++++++ > 4 files changed, 29 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/modules/concept-8.h > create mode 100644 gcc/testsuite/g++.dg/modules/concept-8_a.H > create mode 100644 gcc/testsuite/g++.dg/modules/concept-8_b.C > > diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc > index 4f93150c5d7..2cfe1da5e07 100644 > --- a/gcc/cp/pt.cc > +++ b/gcc/cp/pt.cc > @@ -30015,7 +30015,8 @@ alias_ctad_tweaks (tree tmpl, tree uguides) > /* Parms are to have DECL_CHAIN tsubsted, which would be skipped > if cp_unevaluated_operand. */ > cp_evaluated ev; > - g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain); > + g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain, > + /*use_spec_table=*/false); > } > if (g == error_mark_node) > continue; > diff --git a/gcc/testsuite/g++.dg/modules/concept-8.h b/gcc/testsuite/g++.dg/modules/concept-8.h > new file mode 100644 > index 00000000000..a25f9b752fd > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/concept-8.h > @@ -0,0 +1,14 @@ > +// A version of concept-6.h using an alias template + alias CTAD > + > +template<typename _Callable> > +struct Base > +{ > + Base (const _Callable &) > + requires true > + {} > +}; > + > +template<typename _Callable> requires true > +using Derived = Base<_Callable>; > + > +inline Derived all = [] (auto&& __r) {}; > diff --git a/gcc/testsuite/g++.dg/modules/concept-8_a.H b/gcc/testsuite/g++.dg/modules/concept-8_a.H > new file mode 100644 > index 00000000000..da0467781c1 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/concept-8_a.H > @@ -0,0 +1,5 @@ > +// { dg-require-effective-target c++20 } > +// { dg-additional-options "-fmodule-header -fconcepts" } > +// { dg-module-cmi {} } > + > +#include "concept-8.h" > diff --git a/gcc/testsuite/g++.dg/modules/concept-8_b.C b/gcc/testsuite/g++.dg/modules/concept-8_b.C > new file mode 100644 > index 00000000000..9a9f014ee09 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/concept-8_b.C > @@ -0,0 +1,8 @@ > +// { dg-require-effective-target c++20 } > +// { dg-additional-options "-fmodules-ts -fconcepts -fdump-lang-module-alias -fno-module-lazy" } > + > +#include "concept-8.h" > +import "concept-8_a.H"; > + > +// { dg-final { scan-lang-dump-times {named merge key \(matched\) function_decl:'::Base<::._anon_0>::__ct '} 2 module } } > +// { dg-final { scan-lang-dump-not {merge key \(new\)} module } }
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 4f93150c5d7..2cfe1da5e07 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -30015,7 +30015,8 @@ alias_ctad_tweaks (tree tmpl, tree uguides) /* Parms are to have DECL_CHAIN tsubsted, which would be skipped if cp_unevaluated_operand. */ cp_evaluated ev; - g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain); + g = tsubst_decl (DECL_TEMPLATE_RESULT (f), targs, complain, + /*use_spec_table=*/false); } if (g == error_mark_node) continue; diff --git a/gcc/testsuite/g++.dg/modules/concept-8.h b/gcc/testsuite/g++.dg/modules/concept-8.h new file mode 100644 index 00000000000..a25f9b752fd --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-8.h @@ -0,0 +1,14 @@ +// A version of concept-6.h using an alias template + alias CTAD + +template<typename _Callable> +struct Base +{ + Base (const _Callable &) + requires true + {} +}; + +template<typename _Callable> requires true +using Derived = Base<_Callable>; + +inline Derived all = [] (auto&& __r) {}; diff --git a/gcc/testsuite/g++.dg/modules/concept-8_a.H b/gcc/testsuite/g++.dg/modules/concept-8_a.H new file mode 100644 index 00000000000..da0467781c1 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-8_a.H @@ -0,0 +1,5 @@ +// { dg-require-effective-target c++20 } +// { dg-additional-options "-fmodule-header -fconcepts" } +// { dg-module-cmi {} } + +#include "concept-8.h" diff --git a/gcc/testsuite/g++.dg/modules/concept-8_b.C b/gcc/testsuite/g++.dg/modules/concept-8_b.C new file mode 100644 index 00000000000..9a9f014ee09 --- /dev/null +++ b/gcc/testsuite/g++.dg/modules/concept-8_b.C @@ -0,0 +1,8 @@ +// { dg-require-effective-target c++20 } +// { dg-additional-options "-fmodules-ts -fconcepts -fdump-lang-module-alias -fno-module-lazy" } + +#include "concept-8.h" +import "concept-8_a.H"; + +// { dg-final { scan-lang-dump-times {named merge key \(matched\) function_decl:'::Base<::._anon_0>::__ct '} 2 module } } +// { dg-final { scan-lang-dump-not {merge key \(new\)} module } }