re PR c++/9798 (Infinite recursion (segfault) in cp/decl.c:push_using_directive with...
authorJason Merrill <jason@redhat.com>
Mon, 10 Mar 2003 22:04:09 +0000 (17:04 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 10 Mar 2003 22:04:09 +0000 (17:04 -0500)
        PR c++/9798
        * decl.c (push_using_directive): Push before recursing.

From-SVN: r64133

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/g++.dg/lookup/using3.C [new file with mode: 0644]

index 403747113f40fb49a743302c10a8bfac1990cfcb..9f70757d19d8777a5448a28bb13f47e3a3090b3c 100644 (file)
@@ -1,6 +1,9 @@
 2003-03-10  Jason Merrill  <jason@redhat.com>
 
-       PR c++/9868
+       PR c++/9798
+       * decl.c (push_using_directive): Push before recursing.
+
+       PR c++/9868, c++/9524
        * call.c (resolve_scoped_fn_name): Handle the case of a function
        pointer member.
 
index b3e617f88f45636e9d861033d49023850abc77d0..eeae35ad0df220ee49c6b13fed054ab33e828759 100644 (file)
@@ -4442,14 +4442,15 @@ push_using_directive (tree used)
   if (purpose_member (used, ud) != NULL_TREE)
     POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, NULL_TREE);
 
-  /* Recursively add all namespaces used.  */
-  for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter))
-    push_using_directive (TREE_PURPOSE (iter));
-
   ancestor = namespace_ancestor (current_decl_namespace (), used);
   ud = current_binding_level->using_directives;
   ud = tree_cons (used, ancestor, ud);
   current_binding_level->using_directives = ud;
+
+  /* Recursively add all namespaces used.  */
+  for (iter = DECL_NAMESPACE_USING (used); iter; iter = TREE_CHAIN (iter))
+    push_using_directive (TREE_PURPOSE (iter));
+
   POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, ud);
 }
 
diff --git a/gcc/testsuite/g++.dg/lookup/using3.C b/gcc/testsuite/g++.dg/lookup/using3.C
new file mode 100644 (file)
index 0000000..f364275
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/9798
+
+namespace std { }
+namespace STL { using namespace std; }
+namespace std {
+  using namespace STL;
+}
+namespace STL {
+  struct A {
+    void B() { using namespace std; }
+  };
+}