summaryrefslogtreecommitdiffstats
path: root/gcc/cp/friend.c
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2001-06-08 12:49:02 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2001-06-08 12:49:02 +0000
commita81a4baae497e0a6fd13fee7609810bc5fbd6362 (patch)
treeab5762d3ebc19185880f76a0eb320ec43e23d764 /gcc/cp/friend.c
parent1b2c7cbd9c155ca6aad748effd506f3fbea43b39 (diff)
downloadppe42-gcc-a81a4baae497e0a6fd13fee7609810bc5fbd6362.tar.gz
ppe42-gcc-a81a4baae497e0a6fd13fee7609810bc5fbd6362.zip
cp:
PR c++/2929 * friend.c (do_friend): Use push_decl_namespace for classes at namespace scope. testsuite: * g++.old-deja/g++.pt/friend49.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@43013 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/friend.c')
-rw-r--r--gcc/cp/friend.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 913ed9ccd0b..8b2e8f8a4c7 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -388,18 +388,31 @@ do_friend (ctype, declarator, decl, parmdecls, attrlist,
&& current_template_parms
&& uses_template_parms (decl));
- /* We can call pushdecl here, because the TREE_CHAIN of this
- FUNCTION_DECL is not needed for other purposes. Don't do
- this for a template instantiation. However, we don't
- call pushdecl() for a friend function of a template
- class, since in general, such a declaration depends on
- template parameters. Instead, we call pushdecl when the
- class is instantiated. */
- if (!is_friend_template
- && template_class_depth (current_class_type) == 0)
- decl = pushdecl (decl);
- else
+ if (is_friend_template
+ || template_class_depth (current_class_type) != 0)
+ /* We can't call pushdecl for a template class, since in
+ general, such a declaration depends on template
+ parameters. Instead, we call pushdecl when the class
+ is instantiated. */
decl = push_template_decl_real (decl, /*is_friend=*/1);
+ else if (current_function_decl)
+ /* This must be a local class, so pushdecl will be ok, and
+ insert an unqualified friend into the local scope
+ (rather than the containing namespace scope, which the
+ next choice will do). */
+ decl = pushdecl (decl);
+ else
+ {
+ /* We can't use pushdecl, as we might be in a template
+ class specialization, and pushdecl will insert an
+ unqualified friend decl into the template parameter
+ scope, rather than the namespace containing it. */
+ tree ns = decl_namespace_context (decl);
+
+ push_nested_namespace (ns);
+ decl = pushdecl_namespace_level (decl);
+ pop_nested_namespace (ns);
+ }
if (warn)
{
OpenPOWER on IntegriCloud