]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
name-lookup.c (qualified_lookup_using_namespace): Consider strong using directives...
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 9 Jan 2004 21:30:31 +0000 (21:30 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 9 Jan 2004 21:30:31 +0000 (21:30 +0000)
* name-lookup.c (qualified_lookup_using_namespace): Consider
strong using directives even if we've already found a binding.

From-SVN: r75599

gcc/cp/ChangeLog
gcc/cp/name-lookup.c

index 0c4ab8cb2c2e03c32789fa2bebcdac78e83c3955..bdbdd36389b2ed69510bb7636a53fc46b72877df 100644 (file)
@@ -1,3 +1,8 @@
+2004-01-09  Alexandre Oliva  <aoliva@redhat.com>
+
+       * name-lookup.c (qualified_lookup_using_namespace): Consider
+       strong using directives even if we've already found a binding.
+
 2004-01-09  Mark Mitchell  <mark@codesourcery.com>
 
        * cp-tree.h (cxx_expand_expr): Change prototype.
index a7888161d1a14d9503a265372811cd1267043bb1..010bbe3989c632a3713ce9032a29b01c20c7e266 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions for C++ name lookup routines.
-   Copyright (C) 2003 Free Software Foundation, Inc.
+   Copyright (C) 2003, 2004 Free Software Foundation, Inc.
    Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>
 
 This file is part of GCC.
@@ -3789,14 +3789,19 @@ qualified_lookup_using_namespace (tree name, tree scope, cxx_binding *result,
       seen = tree_cons (scope, NULL_TREE, seen);
       if (binding)
         result = ambiguous_decl (name, result, binding, flags);
-      if (!result->value && !result->type)
-       /* Consider using directives.  */
-       for (usings = DECL_NAMESPACE_USING (scope); usings;
-            usings = TREE_CHAIN (usings))
-         /* If this was a real directive, and we have not seen it.  */
-         if (!TREE_INDIRECT_USING (usings)
-             && !purpose_member (TREE_PURPOSE (usings), seen))
-           todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo);
+
+      /* Consider strong using directives always, and non-strong ones
+        if we haven't found a binding yet.  ??? Shouldn't we consider
+        non-strong ones if the initial RESULT is non-NULL, but the
+        binding in the given namespace is?  */
+      for (usings = DECL_NAMESPACE_USING (scope); usings;
+          usings = TREE_CHAIN (usings))
+       /* If this was a real directive, and we have not seen it.  */
+       if (!TREE_INDIRECT_USING (usings)
+           && ((!result->value && !result->type)
+               || is_associated_namespace (scope, TREE_PURPOSE (usings)))
+           && !purpose_member (TREE_PURPOSE (usings), seen))
+         todo = tree_cons (TREE_PURPOSE (usings), NULL_TREE, todo);
       if (todo)
        {
          scope = TREE_PURPOSE (todo);