https://gcc.gnu.org/g:0003e469d4664397b65080a66ad7d6557bd7ffce

commit r15-495-g0003e469d4664397b65080a66ad7d6557bd7ffce
Author: Simon Martin <simon-l.mar...@laposte.net>
Date:   Mon May 6 15:20:10 2024 +0200

    c++: ICE in build_deduction_guide for invalid template [PR105760]
    
    We currently ICE upon the following invalid snippet because we fail to
    properly handle tsubst_arg_types returning error_mark_node in
    build_deduction_guide.
    
    == cut ==
    template<class... Ts, class>
    struct A { A(Ts...); };
    A a;
    == cut ==
    
    This patch fixes this, and has been successfully tested on 
x86_64-pc-linux-gnu.
    
            PR c++/105760
    
    gcc/cp/ChangeLog:
    
            * pt.cc (build_deduction_guide): Check for error_mark_node
            result from tsubst_arg_types.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/parse/error66.C: New test.

Diff:
---
 gcc/cp/pt.cc                         | 2 ++
 gcc/testsuite/g++.dg/parse/error66.C | 6 ++++++
 2 files changed, 8 insertions(+)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 4b71e199d27f..32640f8e946d 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -30031,6 +30031,8 @@ build_deduction_guide (tree type, tree ctor, tree 
outer_args, tsubst_flags_t com
             references to members of an unknown specialization.  */
          cp_evaluated ev;
          fparms = tsubst_arg_types (fparms, targs, NULL_TREE, complain, ctor);
+        if (fparms == error_mark_node)
+          ok = false;
          fargs = tsubst (fargs, targs, complain, ctor);
          if (ci)
            {
diff --git a/gcc/testsuite/g++.dg/parse/error66.C 
b/gcc/testsuite/g++.dg/parse/error66.C
new file mode 100644
index 000000000000..82f4b8b8a530
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/error66.C
@@ -0,0 +1,6 @@
+// PR c++/105760
+// { dg-do compile { target c++17 } }
+
+template<class... Ts, class> // { dg-error "must be at the end of the template 
parameter list" }
+struct A { A(Ts...); };
+A a;

Reply via email to