diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-24 15:40:06 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-06-24 15:40:06 +0000 |
commit | e4f430b5f97fabfc71b51faa4d28914bf1292edb (patch) | |
tree | d50a764e01dcd1dc880e14a21c3e985f121b8667 /gcc/cp/friend.c | |
parent | cafefe79cb417067ae3cb21995053657c435eec2 (diff) | |
download | gcc-e4f430b5f97fabfc71b51faa4d28914bf1292edb.tar.gz |
* 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.c | 39 |
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); |