summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2007-03-15 22:45:17 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2007-03-15 22:45:17 +0000
commit2ce88bea6d9c7d451c9f2f5eda2f91de7884da65 (patch)
tree9ad6ddd1ac48e6d49a9f4b8b3b4912f4dbe71d00
parent9b439fe168ff6dacb3aa606f43a2103b68b89ded (diff)
downloadgcc-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
-rw-r--r--gcc/cp/ChangeLog9
-rw-r--r--gcc/cp/parser.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/parse/namespace-definition.C10
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f48aa6bd091..730c59e9af9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,14 @@
2007-03-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+ PR c++/30891
+ * 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.
+
+2007-03-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+
PR c++/24924
* decl.c (cxx_init_decl_processing): Move command-line options
processing to c-opts.c.
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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3a043c1c21a..b56294f0df6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2007-03-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+ PR c++/30891
+ * g++.dg/parse/namespace-definition.C: New.
+
+2007-03-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+
PR c++/24924
* g++.dg/cpp/pedantic-errors.C: New.
* g++.dg/cpp/permissive.C: New.
diff --git a/gcc/testsuite/g++.dg/parse/namespace-definition.C b/gcc/testsuite/g++.dg/parse/namespace-definition.C
new file mode 100644
index 00000000000..b7d4034cd7b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/namespace-definition.C
@@ -0,0 +1,10 @@
+// PR 30891
+// { dg-do compile }
+
+int main() {
+ int i = 0;
+ namespace foo { // { dg-error "'namespace' definition is not allowed here" }
+ int j = 0;
+ }
+ return 0;
+}