From d2a8ac2cf23c32f56a8aa2a820859aa91b810f31 Mon Sep 17 00:00:00 2001 From: Lee Millward Date: Thu, 21 Sep 2006 18:22:11 +0000 Subject: [PATCH] re PR c++/28861 (ICE on invalid in-class specialization) PR c++/28861 * decl.c (shadow_tag): Return error_mark_node if maybe_process_partial_specialization failed. * g++.dg/template/spec32.C: New test. * g++.dg/parse/crash9.C: Adjust error markers. From-SVN: r117117 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/decl.c | 3 ++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/parse/crash9.C | 2 +- gcc/testsuite/g++.dg/template/spec32.C | 6 ++++++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/spec32.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fed109fe50e..fce58ed98e3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-09-21 Lee Millward + + PR c++/28861 + * decl.c (shadow_tag): Return error_mark_node + if maybe_process_partial_specialization failed. + 2006-09-20 Danny Smith PR target/27650 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 46c1d33874c..1d83aa32fd7 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3745,7 +3745,8 @@ shadow_tag (cp_decl_specifier_seq *declspecs) } - maybe_process_partial_specialization (t); + if (maybe_process_partial_specialization (t) == error_mark_node) + return NULL_TREE; /* This is where the variables in an anonymous union are declared. An anonymous union declaration looks like: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 788df3779a7..f1be2adaf8f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-09-21 Lee Millward + + PR c++/28861 + * g++.dg/template/spec32.C: New test. + * g++.dg/parse/crash9.C: Adjust error markers. + 2006-09-21 Janis Johnson * gcc.dg/dfp/decfloat-constants.c: Remove 'dg-do compile', fix typo. diff --git a/gcc/testsuite/g++.dg/parse/crash9.C b/gcc/testsuite/g++.dg/parse/crash9.C index 44ce57b1316..d121d5dd106 100644 --- a/gcc/testsuite/g++.dg/parse/crash9.C +++ b/gcc/testsuite/g++.dg/parse/crash9.C @@ -6,4 +6,4 @@ // contains error. template struct A {}; -template struct A : A { }; // { dg-error "not declared|invalid" } +template struct A : A { }; // { dg-error "not declared|invalid|token|extra" } diff --git a/gcc/testsuite/g++.dg/template/spec32.C b/gcc/testsuite/g++.dg/template/spec32.C new file mode 100644 index 00000000000..6ef172b505c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec32.C @@ -0,0 +1,6 @@ +//PR c++/28861 + +struct A +{ + template class B> struct B<0>; // { dg-error "name of class shadows" } +}; -- 2.30.2