diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-08 12:49:02 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-06-08 12:49:02 +0000 |
commit | a81a4baae497e0a6fd13fee7609810bc5fbd6362 (patch) | |
tree | ab5762d3ebc19185880f76a0eb320ec43e23d764 /gcc/cp/friend.c | |
parent | 1b2c7cbd9c155ca6aad748effd506f3fbea43b39 (diff) | |
download | gcc-a81a4baae497e0a6fd13fee7609810bc5fbd6362.tar.gz |
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.c | 35 |
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) { |