OSDN Git Service

gcc/cp/
authoraaw <aaw@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 10 Aug 2007 18:12:12 +0000 (18:12 +0000)
committeraaw <aaw@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 10 Aug 2007 18:12:12 +0000 (18:12 +0000)
* name-lookup.c (do_nonmember_using_decl): Print an error for ambiguous
type lookups.
(ambiguous_decl): Construct tree of ambiguous types.  Remove extaneous
function parameter.
(unqualified_namespace_lookup): Fix ambiguous_decl call.
(lookup_using_namespace): Fix ambiguous_decl call.
(qualified_lookup_using_namespace): Fix ambiguous_decl call.

gcc/testsuite/
* g++.dg/lookup/using18.C: New test.

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

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

index 38f489c..1855f5a 100644 (file)
@@ -1,3 +1,13 @@
+2007-08-10  Ollie Wild  <aaw@google.com>
+
+       * name-lookup.c (do_nonmember_using_decl): Print an error for ambiguous
+       type lookups.
+       (ambiguous_decl): Construct tree of ambiguous types.  Remove extaneous
+       function parameter.
+       (unqualified_namespace_lookup): Fix ambiguous_decl call.
+       (lookup_using_namespace): Fix ambiguous_decl call.
+       (qualified_lookup_using_namespace): Fix ambiguous_decl call.
+
 2007-08-10  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * call.c (name_as_c_string): Use CONST_CAST.
index 81145b0..48b387a 100644 (file)
@@ -2190,12 +2190,20 @@ do_nonmember_using_decl (tree scope, tree name, tree oldval, tree oldtype,
        error ("%qD is already declared in this scope", name);
     }
 
-  *newtype = decls.type;
-  if (oldtype && *newtype && !same_type_p (oldtype, *newtype))
+  if (decls.type && TREE_CODE (decls.type) == TREE_LIST)
     {
-      error ("using declaration %qD introduced ambiguous type %qT",
-            name, oldtype);
-      return;
+      error ("reference to %qD is ambiguous", name);
+      print_candidates (decls.type);
+    }
+  else
+    {
+      *newtype = decls.type;
+      if (oldtype && *newtype && !same_type_p (oldtype, *newtype))
+       {
+         error ("using declaration %qD introduced ambiguous type %qT",
+                name, oldtype);
+         return;
+       }
     }
 }
 
@@ -3491,8 +3499,7 @@ merge_functions (tree s1, tree s2)
    XXX I don't want to repeat the entire duplicate_decls here */
 
 static void
-ambiguous_decl (tree name, struct scope_binding *old, cxx_binding *new,
-               int flags)
+ambiguous_decl (struct scope_binding *old, cxx_binding *new, int flags)
 {
   tree val, type;
   gcc_assert (old != NULL);
@@ -3564,12 +3571,9 @@ ambiguous_decl (tree name, struct scope_binding *old, cxx_binding *new,
     old->type = type;
   else if (type && old->type != type)
     {
-      if (flags & LOOKUP_COMPLAIN)
-       {
-         error ("%qD denotes an ambiguous type",name);
-         error ("%J  first type here", TYPE_MAIN_DECL (old->type));
-         error ("%J  other type here", TYPE_MAIN_DECL (type));
-       }
+      old->type = tree_cons (NULL_TREE, old->type,
+                            build_tree_list (NULL_TREE, type));
+      TREE_TYPE (old->type) = error_mark_node;
     }
 }
 
@@ -3680,7 +3684,7 @@ unqualified_namespace_lookup (tree name, int flags)
         cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (scope), name);
 
       if (b)
-       ambiguous_decl (name, &binding, b, flags);
+       ambiguous_decl (&binding, b, flags);
 
       /* Add all _DECLs seen through local using-directives.  */
       for (level = current_binding_level;
@@ -3768,7 +3772,7 @@ lookup_using_namespace (tree name, struct scope_binding *val,
          cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (used), name);
        /* Resolve ambiguities.  */
        if (val1)
-         ambiguous_decl (name, val, val1, flags);
+         ambiguous_decl (val, val1, flags);
       }
   POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, val->value != error_mark_node);
 }
@@ -3797,7 +3801,7 @@ qualified_lookup_using_namespace (tree name, tree scope,
        cxx_scope_find_binding_for_name (NAMESPACE_LEVEL (scope), name);
       seen = tree_cons (scope, NULL_TREE, seen);
       if (binding)
-       ambiguous_decl (name, result, binding, flags);
+       ambiguous_decl (result, binding, flags);
 
       /* Consider strong using directives always, and non-strong ones
         if we haven't found a binding yet.  ??? Shouldn't we consider
index e380348..0712f70 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-10  Ollie Wild  <aaw@google.com>
+
+       * g++.dg/lookup/using18.C: New test.
+
 2007-08-10  Paolo Carlini  <pcarlini@suse.de>
 
        PR c++/17763
diff --git a/gcc/testsuite/g++.dg/lookup/using18.C b/gcc/testsuite/g++.dg/lookup/using18.C
new file mode 100644 (file)
index 0000000..3755714
--- /dev/null
@@ -0,0 +1,20 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+namespace N1 {
+  void f ();
+  struct f; // { dg-error "" "candidate" }
+}
+
+namespace N2 {
+  void f (int);
+  struct f; // { dg-error "" "candidate" }
+}
+
+namespace M {
+  using namespace N1;
+  using namespace N2;
+}
+
+using M::f; // { dg-error "ambiguous" }