From caec1dc05935c3e9d9d275b86c83907c264786b9 Mon Sep 17 00:00:00 2001 From: Kriang Lerdsuwanakij Date: Tue, 15 Jul 2003 15:28:38 +0000 Subject: [PATCH] re PR c++/10108 (tree checking ICE: expected var_decl, have error_mark in tsubst_decl) PR c++/10108 * pt.c (tsubst_decl) : Add a check for error_mark_node. * g++.dg/template/crash7.C: New test. From-SVN: r69409 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/crash7.C | 13 +++++++++++++ 4 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/crash7.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 85e47ea543c..ff600753258 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-07-15 Kriang Lerdsuwanakij + + PR c++/10108 + * pt.c (tsubst_decl) : Add a check for + error_mark_node. + 2003-07-14 Mark Mitchell PR c++/11509 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index eb108e6338f..90b52afe3fd 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5837,6 +5837,8 @@ tsubst_decl (tree t, tree args, tree type, tsubst_flags_t complain) else { tree new_decl = tsubst (decl, args, complain, in_decl); + if (new_decl == error_mark_node) + return error_mark_node; DECL_TEMPLATE_RESULT (r) = new_decl; DECL_TI_TEMPLATE (new_decl) = r; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 85d684eb3fb..2f10515a51e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-07-15 Kriang Lerdsuwanakij + + PR c++/10108 + * g++.dg/template/crash7.C: New test. + 2003-07-15 Kazu Hirata PR target/10795 diff --git a/gcc/testsuite/g++.dg/template/crash7.C b/gcc/testsuite/g++.dg/template/crash7.C new file mode 100644 index 00000000000..5b17928f5bb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash7.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +// Origin: Volker Reichelt + +// PR c++/10108: ICE in tsubst_decl for error due to non-existence +// nested type. + +template struct A +{ // { dg-error "candidates" } + template A(typename A::X) {} // { dg-error "no type" } +}; + +A a; // { dg-error "instantiated|no match" }