[C++ PATCH] Fix process_template_parm error-recovery (PR c++/90138)

Jakub Jelinek jakub@redhat.com
Fri Apr 19 08:52:00 GMT 2019


Hi!

On the following testcase, there is a type template argument, for which
we create a decl (decl == parm in that case) and pushdecl it.  But, if
the pushdecl detects a redeclaration in that scope, duplicate_decls will
ggc_free the decl passed to it and we then add that ggc_freed tree into the
template parameter TREE_LIST.

The following patch fixes that by using the result value from pushdecl.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-04-19  Jakub Jelinek  <jakub@redhat.com>

	PR c++/90138
	* pt.c (process_template_parm): Set decl to pushdecl result.  If
	!is_non_type, also set parm to that.

	* g++.dg/template/pr90138.C: New test.

--- gcc/cp/pt.c.jj	2019-04-18 12:16:47.000000000 +0200
+++ gcc/cp/pt.c	2019-04-18 14:12:36.765494173 +0200
@@ -4433,7 +4433,9 @@ process_template_parm (tree list, locati
      process_template_parm could fail. */
   tree reqs = finish_shorthand_constraint (parm, constr);
 
-  pushdecl (decl);
+  decl = pushdecl (decl);
+  if (!is_non_type)
+    parm = decl;
 
   /* Build the parameter node linking the parameter declaration,
      its default argument (if any), and its constraints (if any). */
--- gcc/testsuite/g++.dg/template/pr90138.C.jj	2019-04-18 14:58:06.035564846 +0200
+++ gcc/testsuite/g++.dg/template/pr90138.C	2019-04-18 14:57:27.056206214 +0200
@@ -0,0 +1,5 @@
+// PR c++/90138
+
+template <, typename T, typename typename, typename T>	// { dg-error "expected" }
+struct S;	// { dg-error "no default" }
+// { dg-error "two or more" "" { target *-*-* } .-2 }

	Jakub



More information about the Gcc-patches mailing list