re PR c++/60385 (confused by earlier errors, bailing out)
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 27 May 2016 19:19:23 +0000 (19:19 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 27 May 2016 19:19:23 +0000 (19:19 +0000)
/cp
2016-05-27  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60385
* name-lookup.c (push_namespace): Return bool, false when pushdecl
fails.
* name-lookup.h (push_namespace): Adjust declaration.
* parser.c (cp_parser_namespace_definition): Check push_namespace
return value.

/testsuite
2016-05-27  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/60385
* g++.dg/parse/namespace13.C: New.

From-SVN: r236835

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/cp/name-lookup.h
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/namespace13.C [new file with mode: 0644]

index 6c07df156bd2ee98f1cf31bff9426f0a587d9748..cdc2f5a46fd808239965da67dd8da734acdf85e6 100644 (file)
@@ -1,3 +1,12 @@
+2016-05-27  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60385
+       * name-lookup.c (push_namespace): Return bool, false when pushdecl
+       fails.
+       * name-lookup.h (push_namespace): Adjust declaration.
+       * parser.c (cp_parser_namespace_definition): Check push_namespace
+       return value.
+
 2016-05-27  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
        PR c++/69855
index 568c75e80e4390448802688dc73f3f7521b0e92a..11733700627575b1f4f812648df60de7f730204a 100644 (file)
@@ -3701,9 +3701,10 @@ handle_namespace_attrs (tree ns, tree attributes)
 }
   
 /* Push into the scope of the NAME namespace.  If NAME is NULL_TREE, then we
-   select a name that is unique to this compilation unit.  */
+   select a name that is unique to this compilation unit.  Returns FALSE if
+   pushdecl fails, TRUE otherwise.  */
 
-void
+bool
 push_namespace (tree name)
 {
   tree d = NULL_TREE;
@@ -3777,7 +3778,11 @@ push_namespace (tree name)
        TREE_PUBLIC (d) = 0;
       else
        TREE_PUBLIC (d) = 1;
-      pushdecl (d);
+      if (pushdecl (d) == error_mark_node)
+       {
+         timevar_cond_stop (TV_NAME_LOOKUP, subtime);
+         return false;
+       }
       if (anon)
        {
          /* Clear DECL_NAME for the benefit of debugging back ends.  */
@@ -3795,6 +3800,7 @@ push_namespace (tree name)
   current_namespace = d;
 
   timevar_cond_stop (TV_NAME_LOOKUP, subtime);
+  return true;
 }
 
 /* Pop from the scope of the current namespace.  */
index 2f8447a64c768b50d94d19d91ce4cf62b28329b8..2cb129caad9e92bc5cc9dac41a6e07622766b9f6 100644 (file)
@@ -312,7 +312,7 @@ extern tree push_inner_scope (tree);
 extern void pop_inner_scope (tree, tree);
 extern void push_binding_level (cp_binding_level *);
 \f
-extern void push_namespace (tree);
+extern bool push_namespace (tree);
 extern void pop_namespace (void);
 extern void push_nested_namespace (tree);
 extern void pop_nested_namespace (tree);
index 546aada5156a1e38207aa91e0fcb7e3af75be91f..2a46d6fbde7f3fcda5e2fe916f0dc036f3b49521 100644 (file)
@@ -17549,7 +17549,7 @@ cp_parser_namespace_definition (cp_parser* parser)
     }
 
   /* Start the namespace.  */
-  push_namespace (identifier);
+  bool ok = push_namespace (identifier);
 
   /* Parse any nested namespace definition. */
   if (cp_lexer_next_token_is (parser->lexer, CPP_SCOPE))
@@ -17582,7 +17582,7 @@ cp_parser_namespace_definition (cp_parser* parser)
 
   /* "inline namespace" is equivalent to a stub namespace definition
      followed by a strong using directive.  */
-  if (is_inline)
+  if (is_inline && ok)
     {
       tree name_space = current_namespace;
       /* Set up namespace association.  */
@@ -17610,7 +17610,8 @@ cp_parser_namespace_definition (cp_parser* parser)
     pop_namespace ();
 
   /* Finish the namespace.  */
-  pop_namespace ();
+  if (ok)
+    pop_namespace ();
   /* Look for the final `}'.  */
   cp_parser_require (parser, CPP_CLOSE_BRACE, RT_CLOSE_BRACE);
 }
index 5ded2d4187358989b1653acdb4df06a5f8e9f4c0..69206816dd7fbd253ee707532523ce5630ae90c2 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-27  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/60385
+       * g++.dg/parse/namespace13.C: New.
+
 2016-05-26  Jeff Law  <law@redhat.com>
 
        * gcc.dg/tree-ssa/pr21417.c: Update expected output.
diff --git a/gcc/testsuite/g++.dg/parse/namespace13.C b/gcc/testsuite/g++.dg/parse/namespace13.C
new file mode 100644 (file)
index 0000000..5a05384
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/60385
+
+float foo4();   // { dg-message "previous declaration" }
+
+namespace foo4  // { dg-error "redeclared" }
+{
+  struct bar6
+    {
+      friend wchar_t bar1();
+    };
+}