[pushed] c++: Template template parameter in constraint [PR95371]

Message ID 20200529221852.4892-1-jason@redhat.com
State New
Headers show
Series
  • [pushed] c++: Template template parameter in constraint [PR95371]
Related show

Commit Message

Kewen.Lin via Gcc-patches May 29, 2020, 10:18 p.m.
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.

Tested x86_64-pc-linux-gnu, applying to trunk and 10.

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.
---
 gcc/cp/pt.c                                | 11 ++++++++++-
 gcc/testsuite/g++.dg/cpp2a/concepts-ttp1.C | 16 ++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-ttp1.C


base-commit: 33e23881aae0549572cc23a2520c5094a2ffede9
-- 
2.18.1

Patch

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 <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>();
+}