aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl@gcc.gnu.org>2009-04-10 11:56:07 -0700
committerH.J. Lu <hjl@gcc.gnu.org>2009-04-10 11:56:07 -0700
commit72b75d0333b5b00c02a1b3f87641269e6cd629d7 (patch)
tree41a2c06b2e7bcda06f34cd914a410620bbd48f89
parent6e990b5462369a9f29662c13ca4537710900de07 (diff)
downloadgcc-72b75d0333b5b00c02a1b3f87641269e6cd629d7.zip
gcc-72b75d0333b5b00c02a1b3f87641269e6cd629d7.tar.gz
gcc-72b75d0333b5b00c02a1b3f87641269e6cd629d7.tar.bz2
re PR c++/28301 (ICE with broken specialization)
gcc/cp/ 2009-04-10 Jason Merrill <jason@redhat.com> 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 <hongjiu.lu@intel.com> PR c++/28301 * g++.dg/cpp0x/enum2.C: Updated. * g++.dg/debug/pr22514.C: Likewise. * g++.dg/parse/enum2.C: Likewise. * g++.dg/parse/enum3.C: Likewise. * g++.dg/template/crash79.C: Likewise. * g++.old-deja/g++.jason/cond.C: Likewise. * g++.dg/template/pr28301.C: New. From-SVN: r145936
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c2
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/enum2.C2
-rw-r--r--gcc/testsuite/g++.dg/debug/pr22514.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/enum2.C2
-rw-r--r--gcc/testsuite/g++.dg/parse/enum3.C4
-rw-r--r--gcc/testsuite/g++.dg/template/crash79.C6
-rw-r--r--gcc/testsuite/g++.dg/template/pr28301.C18
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/cond.C2
10 files changed, 45 insertions, 9 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index c70eed6..0a3af2a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2009-04-10 Jason Merrill <jason@redhat.com>
+
+ 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.
+
2008-04-10 H.J. Lu <hongjiu.lu@intel.com>
* parser.c (cp_parser_class_specifier): Remove the unused
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index e942635..4dec792 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -2623,6 +2623,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 c7ddb9f..da40b35 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2009-04-10 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR c++/28301
+ * g++.dg/cpp0x/enum2.C: Updated.
+ * g++.dg/debug/pr22514.C: Likewise.
+ * g++.dg/parse/enum2.C: Likewise.
+ * g++.dg/parse/enum3.C: Likewise.
+ * g++.dg/template/crash79.C: Likewise.
+ * g++.old-deja/g++.jason/cond.C: Likewise.
+
2009-04-10 Chao-ying Fu <fu@mips.com>
* gcc.target/mips/interrupt_handler.c: Change from compile to
diff --git a/gcc/testsuite/g++.dg/cpp0x/enum2.C b/gcc/testsuite/g++.dg/cpp0x/enum2.C
index 2353f1d..21c265a 100644
--- a/gcc/testsuite/g++.dg/cpp0x/enum2.C
+++ b/gcc/testsuite/g++.dg/cpp0x/enum2.C
@@ -2,4 +2,4 @@
// { dg-do compile }
// { dg-options "-std=c++0x" }
-template<int> enum E : int { e }; // { dg-error "template declaration of" }
+template<int> enum E : int { e }; // { dg-error "declaration|expected" }
diff --git a/gcc/testsuite/g++.dg/debug/pr22514.C b/gcc/testsuite/g++.dg/debug/pr22514.C
index 23dc9b2..3df9e23 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<i>::_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 f29d3b5..f77f917 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<int> enum E { e }; // { dg-error "template declaration" }
+template<int> 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 11c532c..508e4b9 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/crash79.C b/gcc/testsuite/g++.dg/template/crash79.C
index be71848..700fd29 100644
--- a/gcc/testsuite/g++.dg/template/crash79.C
+++ b/gcc/testsuite/g++.dg/template/crash79.C
@@ -3,7 +3,7 @@
struct A
{
A(int);
- template<int> enum { e }; // { dg-error "template" }
-};
+ template<int> enum { e }; // { dg-error "template|expected" }
+}; // { dg-error "expected" }
-A a(A::e); // { dg-error "not a member" }
+A a(A::e);
diff --git a/gcc/testsuite/g++.dg/template/pr28301.C b/gcc/testsuite/g++.dg/template/pr28301.C
new file mode 100644
index 0000000..a7a0084
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr28301.C
@@ -0,0 +1,18 @@
+// PR c++/28301
+// { dg-do compile }
+
+template<typename> struct A
+{
+ template<int> void foo()
+}; // { dg-error "initializer" }
+
+template<> struct A<void>
+{
+ template<int> void foo();
+};
+
+void bar()
+{
+ A<void> a;
+ a.foo<0>();
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.jason/cond.C b/gcc/testsuite/g++.old-deja/g++.jason/cond.C
index eaddcd6..1c9e806 100644
--- a/gcc/testsuite/g++.old-deja/g++.jason/cond.C
+++ b/gcc/testsuite/g++.old-deja/g++.jason/cond.C
@@ -40,7 +40,7 @@ int main()
// { dg-error "expected" "exp" { target *-*-* } 39 }
if (enum A { one, two, three } foo = one) // { dg-error "defined" "def" }
- // { dg-error "declared" "decl" { target *-*-* } 42 }
+ // { dg-error "expected" "expected" { target *-*-* } 42 }
;
struct B { operator int () { return 2; } };