OSDN Git Service

* name-lookup.c (ambiguous_decl): Adds check for hidden types.
authoraaw <aaw@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 May 2007 21:05:01 +0000 (21:05 +0000)
committeraaw <aaw@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 May 2007 21:05:01 +0000 (21:05 +0000)
(unqualified_namespace_lookup): Adds check for hidden types.

* g++.dg/lookup/hidden-class10.C: New test.
* g++.dg/lookup/hidden-class11.C: New test.

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

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

index 7fc9a07..df07249 100644 (file)
@@ -1,5 +1,10 @@
 2007-05-22  Ollie Wild  <aaw@google.com>
 
+       * name-lookup.c (ambiguous_decl): Adds check for hidden types.
+       (unqualified_namespace_lookup): Adds check for hidden types.
+
+2007-05-22  Ollie Wild  <aaw@google.com>
+
        * decl.c (duplicate_decls): Verify namespace names are unique.
 
 2007-05-21  Mark Mitchell  <mark@codesourcery.com>
index a7a12cd..befc2d3 100644 (file)
@@ -3543,7 +3543,7 @@ ambiguous_decl (tree name, struct scope_binding *old, cxx_binding *new,
     }
   /* ... and copy the type.  */
   type = new->type;
-  if (LOOKUP_NAMESPACES_ONLY (flags))
+  if (LOOKUP_NAMESPACES_ONLY (flags) || (type && hidden_name_p (type)))
     type = NULL_TREE;
   if (!old->type)
     old->type = type;
@@ -3699,7 +3699,9 @@ unqualified_namespace_lookup (tree name, int flags)
          if (b->value
              && ((flags & LOOKUP_HIDDEN) || !hidden_name_p (b->value)))
            binding.value = b->value;
-         binding.type = b->type;
+         if (b->type
+             && ((flags & LOOKUP_HIDDEN) || !hidden_name_p (b->type)))
+           binding.type = b->type;
        }
 
       /* Add all _DECLs seen through local using-directives.  */
index 77b6a7f..189d5ff 100644 (file)
@@ -1,5 +1,10 @@
 2007-05-22  Ollie Wild  <aaw@google.com>
 
+       * g++.dg/lookup/hidden-class10.C: New test.
+       * g++.dg/lookup/hidden-class11.C: New test.
+
+2007-05-22  Ollie Wild  <aaw@google.com>
+
        * g++.dg/lookup/name-clash5.C: New test.
        * g++.dg/lookup/name-clash6.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class10.C b/gcc/testsuite/g++.dg/lookup/hidden-class10.C
new file mode 100644 (file)
index 0000000..f68196f
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Verify that a friend class is hidden even if it overrides a builtin
+// function name.
+
+class A {
+  friend class abort;
+  abort *b;    // { dg-error "no type|expected" }
+};
diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class11.C b/gcc/testsuite/g++.dg/lookup/hidden-class11.C
new file mode 100644 (file)
index 0000000..8432e32
--- /dev/null
@@ -0,0 +1,23 @@
+// Copyright (C) 2007 Free Software Foundation
+// Contributed by Ollie Wild <aaw@google.com>
+// { dg-do compile }
+
+// Verify that a friend class is hidden even if it is hidden by a non-builtin
+// function name.
+
+namespace M {
+  void F (void);
+  class F;
+}
+
+namespace N {
+  void F(void);
+  class A {
+    friend class F;
+  };
+}
+
+using namespace M;
+using namespace N;
+
+class F *b;