]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/28301 (ICE with broken specialization)
authorH.J. Lu <hjl@gcc.gnu.org>
Fri, 10 Apr 2009 18:56:07 +0000 (11:56 -0700)
committerH.J. Lu <hjl@gcc.gnu.org>
Fri, 10 Apr 2009 18:56:07 +0000 (11:56 -0700)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/enum2.C
gcc/testsuite/g++.dg/debug/pr22514.C
gcc/testsuite/g++.dg/parse/enum2.C
gcc/testsuite/g++.dg/parse/enum3.C
gcc/testsuite/g++.dg/template/crash79.C
gcc/testsuite/g++.dg/template/pr28301.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.jason/cond.C

index c70eed6f69105e73a1f93ccf608afe46be82c30f..0a3af2ac508ed15aa748123f59d4d5faceef56a4 100644 (file)
@@ -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
index e942635680d75f4ebe8435f4f4e9d3231a3263b1..4dec792e577afe73ff62cade6cc30ad2af2c005f 100644 (file)
@@ -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;
index c7ddb9f3cea93f5055e835d9a4be4ee644a8d7cb..da40b35470f16e8065912877731c0bd0d194b1ac 100644 (file)
@@ -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
index 2353f1d47e6ac9b61a6893c1d17859bd9761ea24..21c265a923cfd01b3493224f562c99b693c89cc3 100644 (file)
@@ -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" }
index 23dc9b2b061a4bad853096a64b5782e39afcf2e0..3df9e230ecb27ab2ffb940b29adf24f599f0576a 100644 (file)
@@ -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;
index f29d3b569d5f71fc4349fbf7bed6a7baf023c514..f77f91701d93bddc56feebf0e79508cec47e336f 100644 (file)
@@ -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" }
index 11c532c6e912c4b7c2008502e1ae5c3a985bff31..508e4b94de79f079d8a30d809c17476e07744251 100644 (file)
@@ -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" }
index be71848fe8354e85b639c65d4d55b1366e984422..700fd293d73aab21afdfd11ee381a799a162e404 100644 (file)
@@ -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 (file)
index 0000000..a7a0084
--- /dev/null
@@ -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>();
+}
index eaddcd68a0a0f735727c7aa29cf4452ace505413..1c9e8068f58e6c38e15c0d06c25efd1690a068fe 100644 (file)
@@ -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; } };