From: H.J. Lu Date: Fri, 10 Apr 2009 19:36:19 +0000 (+0000) Subject: backport: re PR c++/28301 (ICE with broken specialization) X-Git-Tag: releases/gcc-4.3.4~230 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe162d6909b304490cd0bcf59852def63c523d7c;p=thirdparty%2Fgcc.git backport: re PR c++/28301 (ICE with broken specialization) gcc/cp/ 2009-04-10 H.J. Lu Backport from mainline: 2009-04-10 Jason Merrill PR c++/28301 * parser.c (cp_parser_skip_to_end_of_block_or_statement): Return if we see a close brace without an open brace. gcc/testsuite/ 2009-04-10 H.J. Lu Backport from mainline: 2009-04-10 H.J. Lu PR c++/28301 * g++.dg/debug/pr22514.C: Updated. * g++.dg/parse/enum2.C: Likewise. * g++.dg/parse/enum3.C: Likewise. * g++.dg/template/pr28301.C: New. From-SVN: r145939 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 64c0d09e796f..0d2dbc63c91f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2009-04-10 H.J. Lu + + Backport from mainline: + 2009-04-10 Jason Merrill + + PR c++/28301 + * parser.c (cp_parser_skip_to_end_of_block_or_statement): Return + if we see a close brace without an open brace. + 2009-04-08 Dodji Seketeli PR c++/39637 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index d22cee6f12b6..ec3130ab9c12 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -2589,6 +2589,8 @@ cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser) /* Stop if this is an unnested '}', or closes the outermost nesting level. */ nesting_depth--; + if (nesting_depth < 0) + return; if (!nesting_depth) nesting_depth = -1; break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e4737e5fc805..58fea4b5e179 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,15 @@ +2009-04-10 H.J. Lu + + Backport from mainline: + 2009-04-10 H.J. Lu + + PR c++/28301 + * g++.dg/debug/pr22514.C: Updated. + * g++.dg/parse/enum2.C: Likewise. + * g++.dg/parse/enum3.C: Likewise. + + * g++.dg/template/pr28301.C: New. + 2009-04-08 Dodji Seketeli PR c++/39637 diff --git a/gcc/testsuite/g++.dg/debug/pr22514.C b/gcc/testsuite/g++.dg/debug/pr22514.C index 23dc9b2b061a..3df9e230ecb2 100644 --- a/gcc/testsuite/g++.dg/debug/pr22514.C +++ b/gcc/testsuite/g++.dg/debug/pr22514.C @@ -10,4 +10,4 @@ namespace s using _List_base::_M_impl; } } /* { dg-error "expected unqualified-id before '\}'" } */ -s::list<1> OutputModuleListType; /* { dg-error "expected" } */ +s::list<1> OutputModuleListType; diff --git a/gcc/testsuite/g++.dg/parse/enum2.C b/gcc/testsuite/g++.dg/parse/enum2.C index f29d3b569d5f..f77f91701d93 100644 --- a/gcc/testsuite/g++.dg/parse/enum2.C +++ b/gcc/testsuite/g++.dg/parse/enum2.C @@ -4,4 +4,4 @@ // PR c++/18123: ICE pushing tag from invalid template. -template enum E { e }; // { dg-error "template declaration" } +template enum E { e }; // { dg-error "declaration|expected" } diff --git a/gcc/testsuite/g++.dg/parse/enum3.C b/gcc/testsuite/g++.dg/parse/enum3.C index 11c532c6e912..508e4b94de79 100644 --- a/gcc/testsuite/g++.dg/parse/enum3.C +++ b/gcc/testsuite/g++.dg/parse/enum3.C @@ -1,5 +1,5 @@ // PR c++/28261 -struct A {}; // { dg-error "A" } +struct A {}; -A::A (enum { e }) {} // { dg-error "defined|match" } +A::A (enum { e }) {} // { dg-error "defined|token" } diff --git a/gcc/testsuite/g++.dg/template/pr28301.C b/gcc/testsuite/g++.dg/template/pr28301.C new file mode 100644 index 000000000000..a7a00847880d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/pr28301.C @@ -0,0 +1,18 @@ +// PR c++/28301 +// { dg-do compile } + +template struct A +{ + template void foo() +}; // { dg-error "initializer" } + +template<> struct A +{ + template void foo(); +}; + +void bar() +{ + A a; + a.foo<0>(); +}