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

* Re: PATCH: fixes c++ friend class declaration lookup bugs
  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
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Mitchell @ 2007-05-21 21:15 UTC (permalink / raw)
  To: Ollie Wild; +Cc: GCC Patches

Ollie Wild wrote:

> :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.

:REVIEWMAIL: OK

-- 
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713

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

* Re: PATCH: fixes c++ friend class declaration lookup bugs
  2007-05-21 21:15 ` Mark Mitchell
@ 2007-05-22 18:13   ` Ollie Wild
  2007-05-22 18:21     ` Mark Mitchell
  0 siblings, 1 reply; 4+ messages in thread
From: Ollie Wild @ 2007-05-22 18:13 UTC (permalink / raw)
  To: Mark Mitchell; +Cc: GCC Patches

> > :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.
>
> :REVIEWMAIL: OK

I've noticed this hasn't been checked in, yet.  Do I need to anything
else to make that happen?

Note that I don't have write access to the repository.

Ollie

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

* Re: PATCH: fixes c++ friend class declaration lookup bugs
  2007-05-22 18:13   ` Ollie Wild
@ 2007-05-22 18:21     ` Mark Mitchell
  0 siblings, 0 replies; 4+ messages in thread
From: Mark Mitchell @ 2007-05-22 18:21 UTC (permalink / raw)
  To: Ollie Wild; +Cc: GCC Patches

Ollie Wild wrote:
>> > :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.
>>
>> :REVIEWMAIL: OK
> 
> I've noticed this hasn't been checked in, yet.  Do I need to anything
> else to make that happen?

Yes, you need to either explicitly ask someone to check it in for you,
or request write access, and check it in yourself.  For now, you might
just ask Ian to check it in for you, but if you're going to be
contributing a lot of patches, you should submit a request for
write-after-approval access.  You can name me as the approver of that
request, if you like.  Look on the GCC web page for information about
how to file the request.

-- 
Mark Mitchell
CodeSourcery
mark@codesourcery.com
(650) 331-3385 x713

^ 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).