re PR c++/46868 (ICE: SIGSEGV splay_tree_splay (splay-tree.c:149) on invalid code)
authorNathan Froyd <froydnj@codesourcery.com>
Wed, 23 Feb 2011 16:44:18 +0000 (16:44 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Wed, 23 Feb 2011 16:44:18 +0000 (16:44 +0000)
fix PR c++/46868
gcc/cp/
PR c++/46868
* parser.c (cp_parser_class_specifier): Require a closing brace
to attempt error recovery.

gcc/testsuite/
PR c++/46868
* g++.dg/pr46868.C: New test.
* g++.dg/parse/parameter-declaration-1.C: Adjust.
* g++.dg/parse/error14.C: Adjust.

From-SVN: r170440

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/error14.C
gcc/testsuite/g++.dg/parse/parameter-declaration-1.C
gcc/testsuite/g++.dg/pr46868.C [new file with mode: 0644]

index 0e647f82a67c903d175822c8f520ca1cb588d9ff..195b3192bf93dc393fae90b440de48008b00a434 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-23  Nathan Froyd  <froydnj@codesourcery.com>
+
+       PR c++/46868
+       * parser.c (cp_parser_class_specifier): Require a closing brace
+       to attempt error recovery.
+
 2011-02-23  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/47833
index 8f4a1219a736677e38582a5ddee3e5679959f978..5b08389f4e79909f22b53d418e1f4d0aedd84d6b 100644 (file)
@@ -16874,6 +16874,7 @@ cp_parser_class_specifier (cp_parser* parser)
   tree old_scope = NULL_TREE;
   tree scope = NULL_TREE;
   tree bases;
+  cp_token *closing_brace;
 
   push_deferring_access_checks (dk_no_deferred);
 
@@ -16943,7 +16944,7 @@ cp_parser_class_specifier (cp_parser* parser)
     cp_parser_member_specification_opt (parser);
 
   /* Look for the trailing `}'.  */
-  cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
+  closing_brace = cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
   /* Look for trailing attributes to apply to this class.  */
   if (cp_parser_allow_gnu_extensions_p (parser))
     attributes = cp_parser_attributes_opt (parser);
@@ -17018,8 +17019,9 @@ cp_parser_class_specifier (cp_parser* parser)
       }
 
     /* If we don't have a type, then something is very wrong and we
-       shouldn't try to do anything clever.  */
-    if (TYPE_P (type) && want_semicolon)
+       shouldn't try to do anything clever.  Likewise for not seeing the
+       closing brace.  */
+    if (closing_brace && TYPE_P (type) && want_semicolon)
       {
        cp_token_position prev
          = cp_lexer_previous_token_position (parser->lexer);
index f92d25e12cdf9447385f2ea099a57494d312fb49..20e9eed34ada1d1866acc000ec9c1b3f84d698b9 100644 (file)
@@ -1,3 +1,10 @@
+2011-02-23  Nathan Froyd  <froydnj@codesourcery.com>
+
+       PR c++/46868
+       * g++.dg/pr46868.C: New test.
+       * g++.dg/parse/parameter-declaration-1.C: Adjust.
+       * g++.dg/parse/error14.C: Adjust.
+
 2011-02-23  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/47838
index 37abe37562a276fa927c10f9b8c5a3d23c6dcd9d..04f2f56b6dc6d611fb377fa70a17a20623dac3c3 100644 (file)
@@ -21,6 +21,6 @@ struct X
 
 }; // { dg-error "2:expected '.' at end of input" "at end of input" }
    // { dg-error "1:expected primary-expression before '.' token" "primary" { target *-*-* } 22 }
-   // { dg-error "2:expected ';' after struct definition" "semicolon" { target *-*-* } 22 }
+   // { dg-error "1:expected unqualified-id" "unqualified-id" { target *-*-* } 22 }
    // { dg-error "1:expected ';' before '.' token" "function" { target *-*-* } 22 }
 
index 58f679944e21cf80049396eb5a9080ca2a103380..22d6f214d7df03c0a5c51757dee0c067ced7cad3 100644 (file)
@@ -2,5 +2,5 @@
 // Origin: Robert Schiele; PR C++/8799
 // { dg-do compile }
 
-struct {                       // { dg-error "" }
+struct {
    a(void = 0; a(0), a(0)      // { dg-error "" "" { target *-*-* } }
diff --git a/gcc/testsuite/g++.dg/pr46868.C b/gcc/testsuite/g++.dg/pr46868.C
new file mode 100644 (file)
index 0000000..544c7b2
--- /dev/null
@@ -0,0 +1,4 @@
+// PR c++/46868
+// { dg-do compile }
+
+template < int > struct S { S < // { dg-error "" }