+2010-06-25  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * cp-support.c (reset_directive_searched): New function.
+       (make_symbol_overload_list_using): Prevent recursive calls.
+
 2010-06-25  Phil Muldoon  <pmuldoon@redhat.com>
 
        * printcmd.c (print_variable_and_value): Print error message on
 
   return sym_return_val;
 }
 
+/* Used for cleanups to reset the "searched" flag in case of an error.  */
+
+static void
+reset_directive_searched (void *data)
+{
+  struct using_direct *direct = data;
+  direct->searched = 0;
+}
+
 /* This applies the using directives to add namespaces to search in,
    and then searches for overloads in all of those namespaces.  It
    adds the symbols found to sym_return_val.  Arguments are as in
 make_symbol_overload_list_using (const char *func_name,
                                 const char *namespace)
 {
-  const struct using_direct *current;
+  struct using_direct *current;
   const struct block *block;
 
   /* First, go through the using directives.  If any of them apply,
        current != NULL;
        current = current->next)
       {
+       /* Prevent recursive calls.  */
+       if (current->searched)
+         continue;
+
         /* If this is a namespace alias or imported declaration ignore it.  */
         if (current->alias != NULL || current->declaration != NULL)
           continue;
 
         if (strcmp (namespace, current->import_dest) == 0)
-          make_symbol_overload_list_using (func_name, current->import_src);
+         {
+           /* Mark this import as searched so that the recursive call does
+              not search it again.  */
+           struct cleanup *old_chain;
+           current->searched = 1;
+           old_chain = make_cleanup (reset_directive_searched, current);
+
+           make_symbol_overload_list_using (func_name, current->import_src);
+
+           current->searched = 0;
+           discard_cleanups (old_chain);
+         }
       }
 
   /* Now, add names for this namespace.  */