Bug 1016 - [DR 166] friend class declarations not observing namespace rules.
Summary: [DR 166] friend class declarations not observing namespace rules.
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 2.95.2
: P3 normal
Target Milestone: 4.0.1
Assignee: Kriang Lerdsuwanakij
URL:
Keywords: accepts-invalid, monitored, patch, rejects-valid
: 13830 15453 20234 (view as bug list)
Depends on:
Blocks: c++-lookup, c++-name-lookup 4403 13830 16995 17652 19403 20234
  Show dependency treegraph
 
Reported: 2000-12-07 21:46 UTC by jaycox
Modified: 2005-05-20 17:42 UTC (History)
9 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2005-02-26 18:42:57


Attachments
Patch for 4.1 (6.53 KB, patch)
2004-12-28 15:44 UTC, Kriang Lerdsuwanakij
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description jaycox 2000-12-07 21:46:00 UTC
Friend class declarations inside of namespaces are not handled
properly.  They should not automaticaly cross namespace boundaries.

Example Code:
//---------------------------------------
class b {};

namespace foo
{
  class a
  {
    friend class b;
    b b_;
  };
}
//----------------------------------

This code compiles fine under g++ 2.95.2 but should give the
error:
test.cc:11: field `b_' has incomplete type

Relevant section from the spec:
(7.3.1.2 paragraph 3)
"If a friend declaration in a non local class first declares a class or function
the friend class or function is a member of the innermost enclosing namespace.
... When looking for a prior declaration of a class or a function declared as a
friend, scopes outside the innermost enclosing namespace scope are not
considered"

This bug may seem pretty pedantic, but really bad things
can happen if code like this is allowed through the compiler.

Thanks,
Jay Cox
jaycox@gimp.org

-----------------------------
Note by Giovanni Bajo: 

DR166 (already in TC1) modifies slightly that line of the standard, and it confirms that this is a bug and the code should be rejected. Comeau/EDG has the same bug though.

Release:
2.95 -> 3.4

Environment:
debian woody i386

How-To-Repeat:
compile code included in description
Comment 1 jaycox 2000-12-07 21:46:00 UTC
Fix:
add a class ...; statement just before the friend statement???
Comment 2 Kriang Lerdsuwanakij 2001-08-12 08:58:13 UTC
State-Changed-From-To: open->analyzed
State-Changed-Why: Confirm as a bug.
Comment 3 Wolfgang Bangerth 2002-11-14 14:35:02 UTC
From: Wolfgang Bangerth <bangerth@apex68.ticam.utexas.edu>
To: gcc-gnats@gcc.gnu.org
Cc:  
Subject: c++/1016: friend class declarations not observing namespace rules.
Date: Thu, 14 Nov 2002 14:35:02 -0600

 Re-confirmed with 3.3 CVS from 2002-11-10 and 3.2.1 pre from the same date.
Comment 4 Andrew Pinski 2003-06-15 18:13:13 UTC
still happens on the mainline (20030615).
Comment 5 Andrew Pinski 2004-08-23 18:35:01 UTC
*** Bug 17122 has been marked as a duplicate of this bug. ***
Comment 6 Kriang Lerdsuwanakij 2004-09-04 12:46:03 UTC
Looking at friend class injection bugs.
Comment 7 Kriang Lerdsuwanakij 2004-10-17 15:17:37 UTC
With patches:
  http://gcc.gnu.org/ml/gcc-patches/2004-10/msg01321.html
  http://gcc.gnu.org/ml/gcc-patches/2004-10/msg01372.html

GCC gives:

  pr1016.C:8: error: field 'b_' has incomplete type

which is still wrong because the injected name is still hidden.
Name lookup should find the global 'b'.
Comment 8 Volker Reichelt 2004-11-26 16:31:50 UTC
Kriang, according to your comment in #6 the original example should
compile, right?

And the following example should generate an error in line 12 since
the global class b is not a friend of foo::a, right?

=====================================
class b { void bar(); };

namespace foo
{
  class a
  {
    friend class b;
    b b_;
  };
}

void b::bar() { foo::a().b_; }
=====================================

In this case we have a rejects-valid on mainline for the example in
comment #1. And an accepts-invalid for the example in this comment
for gcc 2.95.3 - 3.4.3.
Comment 9 Kriang Lerdsuwanakij 2004-11-26 16:39:35 UTC
Right.  The code example in comment #1 should compile and
comment #8 should not.  Class foo::b, which is still
not declared yet, is the friend of class foo::a.  So this
bug is both accepts-invalid and rejects-valid.
Comment 10 Kriang Lerdsuwanakij 2004-12-28 15:29:52 UTC
*** Bug 13830 has been marked as a duplicate of this bug. ***
Comment 11 Kriang Lerdsuwanakij 2004-12-28 15:30:33 UTC
*** Bug 15453 has been marked as a duplicate of this bug. ***
Comment 12 Kriang Lerdsuwanakij 2004-12-28 15:44:06 UTC
Created attachment 7836 [details]
Patch for 4.1
Comment 13 Kriang Lerdsuwanakij 2005-03-12 15:13:23 UTC
*** Bug 20234 has been marked as a duplicate of this bug. ***
Comment 14 Kriang Lerdsuwanakij 2005-03-13 14:18:11 UTC
Patch submitted:
  http://gcc.gnu.org/ml/gcc-patches/2005-03/msg01283.html

It's the same as in attachment.  I retested it and add
the explanation.
Comment 15 GCC Commits 2005-03-14 14:34:15 UTC
Subject: Bug 1016

CVSROOT:	/cvs/gcc
Module name:	gcc
Changes by:	lerdsuwa@gcc.gnu.org	2005-03-14 14:33:55

Modified files:
	gcc/cp         : ChangeLog cp-tree.h decl.c name-lookup.c 
	                 name-lookup.h parser.c pt.c rtti.c semantics.c 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/lookup: hidden-class1.C hidden-class2.C 
	                             hidden-class3.C hidden-class4.C 
	                             hidden-class5.C hidden-class6.C 
	                             hidden-class7.C hidden-class8.C 
	                             hidden-class9.C 
	                             hidden-temp-class10.C 
	                             hidden-temp-class11.C 
	                             hidden-temp-class1.C 
	                             hidden-temp-class2.C 
	                             hidden-temp-class3.C 
	                             hidden-temp-class4.C 
	                             hidden-temp-class5.C 
	                             hidden-temp-class6.C 
	                             hidden-temp-class7.C 
	                             hidden-temp-class8.C 
	                             hidden-temp-class9.C 

Log message:
	Friend class name lookup 5/n
	PR c++/1016
	* cp-tree.h (pushtag): Adjust declaration.
	* decl.c (lookup_and_check_tag): Call lookup_type_scope if
	lookup_name fails.
	(xref_tag): Adjust call to pushtag.  Make hidden class visible.
	(start_enum): Adjust call to pushtag.
	* name-lookup.c (ambiguous_decl): Ignore hidden names.
	(qualify_lookup): Change return type to bool.
	(hidden_name_p): New function.
	(lookup_namespace_name, unqualified_namespace_lookup,
	lookup_name_real): Use it.
	(lookup_type_scope): Update comments.
	(maybe_process_template_type_declaration): Change parameter name
	from globalize to is_friend.
	(pushtag): Change globalize parameter of type int to tag_scope.
	Hide name if introduced by friend declaration.
	* name-lookup.h (hidden_name_p): Add declaration.
	* parser.c (cp_parser_lookup_name): Don't deal with hidden name
	here.
	* pt.c (push_template_decl_real): Make hidden class template
	visible.
	(lookup_template_class, instantiate_class_template): Adjust call
	to pushtag.
	* semantics.c (begin_class_definition): Likewise.
	* rtti.c (init_rtti_processing, build_dynamic_cast_1,
	tinfo_base_init, emit_support_tinfos): Use ts_current instead of
	ts_global.
	
	* g++.dg/lookup/hidden-class1.C: New test.
	* g++.dg/lookup/hidden-class2.C: Likewise.
	* g++.dg/lookup/hidden-class3.C: Likewise.
	* g++.dg/lookup/hidden-class4.C: Likewise.
	* g++.dg/lookup/hidden-class5.C: Likewise.
	* g++.dg/lookup/hidden-class6.C: Likewise.
	* g++.dg/lookup/hidden-class7.C: Likewise.
	* g++.dg/lookup/hidden-class8.C: Likewise.
	* g++.dg/lookup/hidden-class9.C: Likewise.
	* g++.dg/lookup/hidden-temp-class1.C: Likewise.
	* g++.dg/lookup/hidden-temp-class2.C: Likewise.
	* g++.dg/lookup/hidden-temp-class3.C: Likewise.
	* g++.dg/lookup/hidden-temp-class4.C: Likewise.
	* g++.dg/lookup/hidden-temp-class5.C: Likewise.
	* g++.dg/lookup/hidden-temp-class6.C: Likewise.
	* g++.dg/lookup/hidden-temp-class7.C: Likewise.
	* g++.dg/lookup/hidden-temp-class8.C: Likewise.
	* g++.dg/lookup/hidden-temp-class9.C: Likewise.
	* g++.dg/lookup/hidden-temp-class10.C: Likewise.
	* g++.dg/lookup/hidden-temp-class11.C: Likewise.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.4661&r2=1.4662
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-tree.h.diff?cvsroot=gcc&r1=1.1109&r2=1.1110
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl.c.diff?cvsroot=gcc&r1=1.1377&r2=1.1378
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.c.diff?cvsroot=gcc&r1=1.111&r2=1.112
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.h.diff?cvsroot=gcc&r1=1.37&r2=1.38
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/parser.c.diff?cvsroot=gcc&r1=1.320&r2=1.321
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&r1=1.982&r2=1.983
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/rtti.c.diff?cvsroot=gcc&r1=1.210&r2=1.211
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/semantics.c.diff?cvsroot=gcc&r1=1.463&r2=1.464
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.5160&r2=1.5161
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class2.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class3.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class4.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class5.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class6.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class7.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class8.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class9.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C.diff?cvsroot=gcc&r1=NONE&r2=1.1

Comment 16 Kriang Lerdsuwanakij 2005-03-14 14:40:00 UTC
Fixed in the mainline.
Comment 17 GCC Commits 2005-05-20 17:29:46 UTC
Subject: Bug 1016

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	gcc-4_0-branch
Changes by:	lerdsuwa@gcc.gnu.org	2005-05-20 17:28:56

Modified files:
	gcc/cp         : cp-tree.h decl.c name-lookup.c name-lookup.h 
	                 parser.c pt.c rtti.c semantics.c ChangeLog 
	gcc/testsuite  : ChangeLog 
Added files:
	gcc/testsuite/g++.dg/lookup: hidden-class1.C hidden-class2.C 
	                             hidden-class3.C hidden-class4.C 
	                             hidden-class5.C hidden-class6.C 
	                             hidden-class7.C hidden-class8.C 
	                             hidden-class9.C 
	                             hidden-temp-class10.C 
	                             hidden-temp-class11.C 
	                             hidden-temp-class1.C 
	                             hidden-temp-class2.C 
	                             hidden-temp-class3.C 
	                             hidden-temp-class4.C 
	                             hidden-temp-class5.C 
	                             hidden-temp-class6.C 
	                             hidden-temp-class7.C 
	                             hidden-temp-class8.C 
	                             hidden-temp-class9.C 

Log message:
	Friend class name lookup 5/n
	PR c++/1016
	* cp-tree.h (pushtag): Adjust declaration.
	* decl.c (lookup_and_check_tag): Call lookup_type_scope if
	lookup_name fails.
	(xref_tag): Adjust call to pushtag.  Make hidden class visible.
	(start_enum): Adjust call to pushtag.
	* name-lookup.c (ambiguous_decl): Ignore hidden names.
	(qualify_lookup): Change return type to bool.
	(hidden_name_p): New function.
	(lookup_namespace_name, unqualified_namespace_lookup,
	lookup_name_real): Use it.
	(lookup_type_scope): Update comments.
	(maybe_process_template_type_declaration): Change parameter name
	from globalize to is_friend.
	(pushtag): Change globalize parameter of type int to tag_scope.
	Hide name if introduced by friend declaration.
	* name-lookup.h (hidden_name_p): Add declaration.
	* parser.c (cp_parser_lookup_name): Don't deal with hidden name
	here.
	* pt.c (push_template_decl_real): Make hidden class template
	visible.
	(lookup_template_class, instantiate_class_template): Adjust call
	to pushtag.
	* semantics.c (begin_class_definition): Likewise.
	* rtti.c (init_rtti_processing, build_dynamic_cast_1,
	tinfo_base_init, emit_support_tinfos): Use ts_current instead of
	ts_global.
	
	* g++.dg/lookup/hidden-class1.C: New test.
	* g++.dg/lookup/hidden-class2.C: Likewise.
	* g++.dg/lookup/hidden-class3.C: Likewise.
	* g++.dg/lookup/hidden-class4.C: Likewise.
	* g++.dg/lookup/hidden-class5.C: Likewise.
	* g++.dg/lookup/hidden-class6.C: Likewise.
	* g++.dg/lookup/hidden-class7.C: Likewise.
	* g++.dg/lookup/hidden-class8.C: Likewise.
	* g++.dg/lookup/hidden-class9.C: Likewise.
	* g++.dg/lookup/hidden-temp-class1.C: Likewise.
	* g++.dg/lookup/hidden-temp-class2.C: Likewise.
	* g++.dg/lookup/hidden-temp-class3.C: Likewise.
	* g++.dg/lookup/hidden-temp-class4.C: Likewise.
	* g++.dg/lookup/hidden-temp-class5.C: Likewise.
	* g++.dg/lookup/hidden-temp-class6.C: Likewise.
	* g++.dg/lookup/hidden-temp-class7.C: Likewise.
	* g++.dg/lookup/hidden-temp-class8.C: Likewise.
	* g++.dg/lookup/hidden-temp-class9.C: Likewise.
	* g++.dg/lookup/hidden-temp-class10.C: Likewise.
	* g++.dg/lookup/hidden-temp-class11.C: Likewise.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-tree.h.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.1106.2.5&r2=1.1106.2.6
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.1371.2.10&r2=1.1371.2.11
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.109.4.2&r2=1.109.4.3
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.h.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.37&r2=1.37.8.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/parser.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.319.2.6&r2=1.319.2.7
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.978.2.9&r2=1.978.2.10
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/rtti.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.210&r2=1.210.6.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/semantics.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.463.2.2&r2=1.463.2.3
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.4648.2.41&r2=1.4648.2.42
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class1.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class2.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class3.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class4.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class5.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class6.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class7.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class8.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-class9.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class10.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class11.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class1.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class2.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class3.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class4.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class5.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class6.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class7.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class8.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/lookup/hidden-temp-class9.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.14.1
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.5084.2.189&r2=1.5084.2.190

Comment 18 Kriang Lerdsuwanakij 2005-05-20 17:42:48 UTC
Also fixed in 4.0.1.
Comment 19 GCC Commits 2005-07-26 22:10:27 UTC
Subject: Bug 1016

CVSROOT:	/cvs/gcc
Module name:	gcc
Branch: 	apple-local-200502-branch
Changes by:	dpatel@gcc.gnu.org	2005-07-26 22:10:16

Modified files:
	gcc/cp         : ChangeLog.apple-ppc cp-tree.h decl.c 
	                 name-lookup.c name-lookup.h parser.c pt.c 
	                 rtti.c semantics.c 

Log message:
	Radar 4184203
	Undo PR c++/1016 patch.
	2005-03-13  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
	
	* cp-tree.h (pushtag): Adjust declaration.
	* decl.c (lookup_and_check_tag): Call lookup_type_scope if
	lookup_name fails.
	(xref_tag): Adjust call to pushtag.  Make hidden class visible.
	(start_enum): Adjust call to pushtag.
	* name-lookup.c (ambiguous_decl): Ignore hidden names.
	(qualify_lookup): Change return type to bool.
	(hidden_name_p): New function.
	(lookup_namespace_name, unqualified_namespace_lookup,
	lookup_name_real): Use it.
	(lookup_type_scope): Update comments.
	(maybe_process_template_type_declaration): Change parameter name
	from globalize to is_friend.
	(pushtag): Change globalize parameter of type int to tag_scope.
	Hide name if introduced by friend declaration.
	* name-lookup.h (hidden_name_p): Add declaration.
	* parser.c (cp_parser_lookup_name): Don't deal with hidden name
	here.
	* pt.c (push_template_decl_real): Make hidden class template
	visible.
	(lookup_template_class, instantiate_class_template): Adjust call
	to pushtag.
	* semantics.c (begin_class_definition): Likewise.
	* rtti.c (init_rtti_processing, build_dynamic_cast_1,
	tinfo_base_init, emit_support_tinfos): Use ts_current instead of
	ts_global.

Patches:
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.apple-ppc.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.1.4.15&r2=1.1.4.16
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-tree.h.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.1104.2.7&r2=1.1104.2.8
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl.c.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.1364.2.7&r2=1.1364.2.8
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.c.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.109.2.3&r2=1.109.2.4
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/name-lookup.h.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.37.6.1&r2=1.37.6.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/parser.c.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.316.2.12&r2=1.316.2.13
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.977.2.7&r2=1.977.2.8
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/rtti.c.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.210.4.1&r2=1.210.4.2
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/semantics.c.diff?cvsroot=gcc&only_with_tag=apple-local-200502-branch&r1=1.460.4.9&r2=1.460.4.10