public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* PATCH: fixes c++ friend class declaration lookup bugs
@ 2007-05-18 17:34 Ollie Wild
  2007-05-21 21:15 ` Mark Mitchell
  0 siblings, 1 reply; 4+ messages in thread
From: Ollie Wild @ 2007-05-18 17:34 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 881 bytes --]

If a friend class declaration has no prior declarations, the class
name is hidden from name lookup until it is subsequently declared.  In
some cases, the hidden name is stored in the type member of its
cxx_binding structure.  However, the name lookup code was not always
checking this.  This resulted in types being found prior to their
declaration and, in one case, an internal compiler error.  This patch
adds missing checks via the hidden_name_p macro.

Tested with a C/C++/Java bootstrap and testsuite run on i686-pc-linux-gnu.

Ollie

:ADDPATCH c++:

2007-05-18  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-18  Ollie Wild  <aaw@google.com>

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

[-- Attachment #2: hidden-class.patch --]
[-- Type: text/x-patch, Size: 2036 bytes --]

diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index a7a12cd..befc2d3 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -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.  */
diff --git a/gcc/testsuite/g++.dg/lookup/hidden-class10.C b/gcc/testsuite/g++.dg/lookup/hidden-class10.C
new file mode 100644
index 0000000..f68196f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/hidden-class10.C
@@ -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
index 0000000..8432e32
--- /dev/null
+++ b/gcc/testsuite/g++.dg/lookup/hidden-class11.C
@@ -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;

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-05-22 18:21 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-05-18 17:34 PATCH: fixes c++ friend class declaration lookup bugs Ollie Wild
2007-05-21 21:15 ` Mark Mitchell
2007-05-22 18:13   ` Ollie Wild
2007-05-22 18:21     ` Mark Mitchell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).