OSDN Git Service

2007-03-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Mar 2007 22:45:17 +0000 (22:45 +0000)
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 15 Mar 2007 22:45:17 +0000 (22:45 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122962 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/namespace-definition.C [new file with mode: 0644]

index f48aa6b..730c59e 100644 (file)
@@ -1,5 +1,14 @@
 2007-03-15  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
 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.
        PR c++/24924
        * decl.c (cxx_init_decl_processing): Move command-line options
        processing to c-opts.c.
index 54c7668..e123047 100644 (file)
@@ -6373,6 +6373,11 @@ cp_parser_statement (cp_parser* parser, tree in_statement_expr,
          statement = cp_parser_try_block (parser);
          break;
 
          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.  */
        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 (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
   cp_parser_require (parser, CPP_EQ, "`='");
   /* Look for the qualified-namespace-specifier.  */
   namespace_specifier
index 3a043c1..b56294f 100644 (file)
@@ -1,5 +1,10 @@
 2007-03-15  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>
 
 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.
        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 (file)
index 0000000..b7d4034
--- /dev/null
@@ -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;
+}