summaryrefslogtreecommitdiffstats
path: root/gcc/cp/friend.c
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2003-06-24 15:40:06 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2003-06-24 15:40:06 +0000
commite4f430b5f97fabfc71b51faa4d28914bf1292edb (patch)
treed50a764e01dcd1dc880e14a21c3e985f121b8667 /gcc/cp/friend.c
parentcafefe79cb417067ae3cb21995053657c435eec2 (diff)
downloadppe42-gcc-e4f430b5f97fabfc71b51faa4d28914bf1292edb.tar.gz
ppe42-gcc-e4f430b5f97fabfc71b51faa4d28914bf1292edb.zip
* call.c (enforce_access): Assert we get a binfo.
(build_op_delete_call): Pass a binfo to perform_or_defer_access_check. * class.c (alter_access): Likewise. * decl.c (make_typename_type): Likewise. (make_unbound_class_template): Likewise. * lex.c (do_identifier): Likewise. * method.c (hack_identifier): Likewise. * parser.c (cp_parser_lookup_name): Likewise. * search.c (lookup_member): Likewise. Move IDENTIFIER_CLASS_VALUE test. * semantics.c (finish_non_static_data_member): Likewise. (perform_or_defer_access_check): Expect a binfo. * typeck.c (comptypes): Expect types. * mangle.c (find_substitution): Don't pass a non-type to same_type_p * friend.c (make_friend_class): Likewise. * pt.c (check_default_tmpl_args): Likewise. (lookup_template_class): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@68424 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/friend.c')
-rw-r--r--gcc/cp/friend.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c
index 3ecd3177195..0a0e82c7fcd 100644
--- a/gcc/cp/friend.c
+++ b/gcc/cp/friend.c
@@ -264,17 +264,34 @@ make_friend_class (type, friend_type)
if (is_template_friend)
friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
- classes = CLASSTYPE_FRIEND_CLASSES (type);
- while (classes
- /* Stop if we find the same type on the list. */
- && !(TREE_CODE (TREE_VALUE (classes)) == TEMPLATE_DECL ?
- friend_type == TREE_VALUE (classes) :
- same_type_p (TREE_VALUE (classes), friend_type)))
- classes = TREE_CHAIN (classes);
- if (classes)
- warning ("`%T' is already a friend of `%T'",
- TREE_VALUE (classes), type);
- else
+ /* See if it is already a friend. */
+ for (classes = CLASSTYPE_FRIEND_CLASSES (type);
+ classes;
+ classes = TREE_CHAIN (classes))
+ {
+ tree probe = TREE_VALUE (classes);
+
+ if (TREE_CODE (friend_type) == TEMPLATE_DECL)
+ {
+ if (friend_type == probe)
+ {
+ warning ("`%D' is already a friend of `%T'",
+ probe, type);
+ break;
+ }
+ }
+ else if (TREE_CODE (probe) != TEMPLATE_DECL)
+ {
+ if (same_type_p (probe, friend_type))
+ {
+ warning ("`%T' is already a friend of `%T'",
+ probe, type);
+ break;
+ }
+ }
+ }
+
+ if (!classes)
{
maybe_add_class_template_decl_list (type, friend_type, /*friend_p=*/1);
OpenPOWER on IntegriCloud