From: Jason Merrill Date: Fri, 29 May 2020 20:55:52 +0000 (-0400) Subject: c++: Template template parameter in constraint [PR95371] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2fb595f8348e164d2f06536ba98322616eeaeeb6;p=gcc.git 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. --- diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 90dafff3aa7..df647af7b46 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 00000000000..3f6eb35cf61 --- /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 +struct configuration { + template