diff options
author | Jason Merrill <jason@redhat.com> | 2020-05-29 16:55:52 -0400 |
---|---|---|
committer | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-17 13:09:23 -0300 |
commit | f305283bbf9a1da4f620b5cffeec8cb74d69234a (patch) | |
tree | 44cf553893d5130a13081d99917f2735bf2c7cce /gcc | |
parent | 8ff4ba3c6f8254de1b85dae79dd4e71d9eb3c8f7 (diff) | |
download | gcc-f305283bbf9a1da4f620b5cffeec8cb74d69234a.zip gcc-f305283bbf9a1da4f620b5cffeec8cb74d69234a.tar.gz gcc-f305283bbf9a1da4f620b5cffeec8cb74d69234a.tar.bz2 |
c++: Template template parameter in constraint [PR95371]
any_template_parm_r was assuming that the DECL_TEMPLATE_RESULT of a template
will have a suitable TEMPLATE_INFO from which we can look at the generic
arguments for that template. But that wasn't true for a template template
parameter; this patch makes it so.
gcc/cp/ChangeLog:
PR c++/95371
* pt.c (process_template_parm): Set DECL_TEMPLATE_INFO
on the DECL_TEMPLATE_RESULT.
gcc/testsuite/ChangeLog:
PR c++/95371
* g++.dg/cpp2a/concepts-ttp1.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/pt.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-ttp1.C | 16 |
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 90dafff..df647af 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -4575,7 +4575,16 @@ process_template_parm (tree list, location_t parm_loc, tree parm, /* This is for distinguishing between real templates and template template parameters */ TREE_TYPE (parm) = t; - TREE_TYPE (DECL_TEMPLATE_RESULT (parm)) = t; + + /* any_template_parm_r expects to be able to get the targs of a + DECL_TEMPLATE_RESULT. */ + tree result = DECL_TEMPLATE_RESULT (parm); + TREE_TYPE (result) = t; + tree args = template_parms_to_args (DECL_TEMPLATE_PARMS (parm)); + tree tinfo = build_template_info (parm, args); + retrofit_lang_decl (result); + DECL_TEMPLATE_INFO (result) = tinfo; + decl = parm; } else diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-ttp1.C b/gcc/testsuite/g++.dg/cpp2a/concepts-ttp1.C new file mode 100644 index 0000000..3f6eb35 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-ttp1.C @@ -0,0 +1,16 @@ +// PR c++/95371 +// { dg-do compile { target c++20 } } + +template <typename...> +struct configuration { + template <template <typename...> typename query_t> + static constexpr bool exists() { return true; } + + template <template <typename...> typename query_t> + void remove() requires(exists<query_t>()); +}; + +int main() { + configuration<> cfg{}; + cfg.remove<configuration>(); +} |