re PR c++/31745 (ICE on invalid use of namespace)
2007-05-25 Simon Martin <simartin@users.sourceforge.net> Manuel Lopez-Ibanez <manu@gcc.gnu.org> PR c++/31745 * parser.c (cp_parser_skip_to_closing_brace): Return true if the next token is a closing brace, false if there are no tokens left. (cp_parser_namespace_alias_definition): Only consume the next token if it is a closing brace. * parser.c (cp_parser_class_specifier): Likewise. Co-Authored-By: Lee Millward <lee.millward@gmail.com> Co-Authored-By: Manuel López-Ibáñez <manu@gcc.gnu.org> From-SVN: r125070
This commit is contained in:
parent
eb89f88cb8
commit
1094da913b
|
@ -1,3 +1,14 @@
|
|||
2007-05-25 Simon Martin <simartin@users.sourceforge.net>
|
||||
Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
PR c++/31745
|
||||
* parser.c (cp_parser_skip_to_closing_brace): Return true if the next
|
||||
token is a closing brace, false if there are no tokens left.
|
||||
(cp_parser_namespace_alias_definition): Only consume the next token if
|
||||
it is a closing brace.
|
||||
|
||||
* parser.c (cp_parser_class_specifier): Likewise.
|
||||
|
||||
2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* semantics.c (finish_member_declaration): Fix a typo in the
|
||||
|
|
|
@ -1999,7 +1999,7 @@ static void cp_parser_consume_semicolon_at_end_of_statement
|
|||
(cp_parser *);
|
||||
static void cp_parser_skip_to_end_of_block_or_statement
|
||||
(cp_parser *);
|
||||
static void cp_parser_skip_to_closing_brace
|
||||
static bool cp_parser_skip_to_closing_brace
|
||||
(cp_parser *);
|
||||
static void cp_parser_skip_to_end_of_template_parameter_list
|
||||
(cp_parser *);
|
||||
|
@ -2599,9 +2599,10 @@ cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser)
|
|||
}
|
||||
|
||||
/* Skip tokens until a non-nested closing curly brace is the next
|
||||
token. */
|
||||
token, or there are no more tokens. Return true in the first case,
|
||||
false otherwise. */
|
||||
|
||||
static void
|
||||
static bool
|
||||
cp_parser_skip_to_closing_brace (cp_parser *parser)
|
||||
{
|
||||
unsigned nesting_depth = 0;
|
||||
|
@ -2615,13 +2616,13 @@ cp_parser_skip_to_closing_brace (cp_parser *parser)
|
|||
case CPP_EOF:
|
||||
case CPP_PRAGMA_EOL:
|
||||
/* If we've run out of tokens, stop. */
|
||||
return;
|
||||
return false;
|
||||
|
||||
case CPP_CLOSE_BRACE:
|
||||
/* If the next token is a non-nested `}', then we have reached
|
||||
the end of the current block. */
|
||||
if (nesting_depth-- == 0)
|
||||
return;
|
||||
return true;
|
||||
break;
|
||||
|
||||
case CPP_OPEN_BRACE:
|
||||
|
@ -11295,7 +11296,7 @@ cp_parser_namespace_alias_definition (cp_parser* parser)
|
|||
error ("%<namespace%> definition is not allowed here");
|
||||
/* Skip the definition. */
|
||||
cp_lexer_consume_token (parser->lexer);
|
||||
cp_parser_skip_to_closing_brace (parser);
|
||||
if (cp_parser_skip_to_closing_brace (parser))
|
||||
cp_lexer_consume_token (parser->lexer);
|
||||
return;
|
||||
}
|
||||
|
@ -13818,10 +13819,9 @@ cp_parser_class_specifier (cp_parser* parser)
|
|||
entire class body. */
|
||||
if (!xref_basetypes (type, bases))
|
||||
{
|
||||
cp_parser_skip_to_closing_brace (parser);
|
||||
|
||||
/* Consuming the closing brace yields better error messages
|
||||
later on. */
|
||||
if (cp_parser_skip_to_closing_brace (parser))
|
||||
cp_lexer_consume_token (parser->lexer);
|
||||
pop_deferring_access_checks ();
|
||||
return error_mark_node;
|
||||
|
|
|
@ -1,3 +1,11 @@
|
|||
2007-05-25 Simon Martin <simartin@users.sourceforge.net>
|
||||
Lee Millward <lee.millward@gmail.com>
|
||||
|
||||
PR c++/31745
|
||||
* g++.dg/parse/crash34.C: New test.
|
||||
|
||||
* g++.dg/parse/crash35.C: New test.
|
||||
|
||||
2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* gcc.target/i386/sse2-check.h: New.
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
/* PR c++/31745 */
|
||||
/* { dg-do "compile" } */
|
||||
|
||||
void foo()
|
||||
{
|
||||
namespace N { /* { dg-error "is not allowed|at end of input" } */
|
|
@ -0,0 +1,7 @@
|
|||
/* This used to ICE. */
|
||||
/* { dg-do "compile" } */
|
||||
|
||||
struct a {};
|
||||
|
||||
class foo : public a, a
|
||||
{ /* { dg-error "duplicate base type|at end of input" } */
|
Loading…
Reference in New Issue