diff options
author | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2007-03-15 22:45:17 +0000 |
---|---|---|
committer | Manuel López-Ibáñez <manu@gcc.gnu.org> | 2007-03-15 22:45:17 +0000 |
commit | 2ce88bea6d9c7d451c9f2f5eda2f91de7884da65 (patch) | |
tree | 9ad6ddd1ac48e6d49a9f4b8b3b4912f4dbe71d00 /gcc/cp/parser.c | |
parent | 9b439fe168ff6dacb3aa606f43a2103b68b89ded (diff) | |
download | gcc-2ce88bea6d9c7d451c9f2f5eda2f91de7884da65.tar.gz |
re PR c++/30891 (poor diagnostic with namespace in the function scope)
2007-03-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/30891
cp/
* parser.c (cp_parser_statement): If 'namespace' is found, this
only can be a namespace alias definition, so parse it now.
(cp_parser_namespace_alias_definition): if we find an open brace
instead of '=', then this is actually a misplaced namespace
definition.
testsuite/
* g++.dg/parse/namespace-definition.C: New.
From-SVN: r122962
Diffstat (limited to 'gcc/cp/parser.c')
-rw-r--r-- | gcc/cp/parser.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 54c7668a50d..e1230471a62 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6373,6 +6373,11 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr, statement = cp_parser_try_block (parser); break; + case RID_NAMESPACE: + /* This must be a namespace alias definition. */ + cp_parser_declaration_statement (parser); + return; + default: /* It might be a keyword like `int' that can start a declaration-statement. */ @@ -11040,6 +11045,16 @@ cp_parser_namespace_alias_definition (cp_parser* parser) if (identifier == error_mark_node) return; /* Look for the `=' token. */ + if (!cp_parser_uncommitted_to_tentative_parse_p (parser) + && cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) + { + error ("%<namespace%> definition is not allowed here"); + /* Skip the definition. */ + cp_lexer_consume_token (parser->lexer); + cp_parser_skip_to_closing_brace (parser); + cp_lexer_consume_token (parser->lexer); + return; + } cp_parser_require (parser, CPP_EQ, "`='"); /* Look for the qualified-namespace-specifier. */ namespace_specifier |