public inbox for gcc-cvs@sourceware.org help / color / mirror / Atom feed
From: Jason Merrill <jason@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/c++-contracts] c++: remove friend_attributes Date: Tue, 1 Nov 2022 11:43:26 +0000 (GMT) [thread overview] Message-ID: <20221101114326.475743857833@sourceware.org> (raw) https://gcc.gnu.org/g:51c5fc25b37ae493787bcecba64c449896a066cd commit 51c5fc25b37ae493787bcecba64c449896a066cd Author: Jason Merrill <jason@redhat.com> Date: Fri Oct 28 11:26:05 2022 -0400 c++: remove friend_attributes Instead of the friend_attributes hack, we can apply friend attributes before calling do_friend. gcc/cp/ChangeLog: * decl.cc (friend_attributes): Remove. (duplicate_contracts): Adjust. (duplicate_decls): Adjust. (grokdeclarator): Call cplus_decl_attributes before do_friend. Diff: --- gcc/cp/decl.cc | 53 +++++++++-------------------------------------------- 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index b5e132c09d5..9740129456b 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -1475,14 +1475,6 @@ duplicate_function_template_decls (tree newdecl, tree olddecl) return false; } -/* This temporarily contains the attribute list for a friend declaration in - grokdecl. Friend declarations are merged together before attributes are - processed, which complicates the processing of contracts. In particular, we - need to compare and possibly remap contracts in duplicate_decls. */ -/* FIXME make this go away. */ - -static tree friend_attributes; - /* A subroutine of duplicate_decls. Diagnose issues in the redeclaration of guarded functions. Note that attributes on new friend declarations have not been processed yet, so we take those from the global above. */ @@ -1492,11 +1484,7 @@ duplicate_contracts (tree newdecl, tree olddecl) { /* Compare contracts to see if they match. */ tree old_contracts = DECL_CONTRACTS (olddecl); - tree new_contracts; - if (friend_attributes) - new_contracts = friend_attributes; - else - new_contracts = DECL_CONTRACTS (newdecl); + tree new_contracts = DECL_CONTRACTS (newdecl); if (!old_contracts && !new_contracts) return; @@ -2392,10 +2380,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden) /* Make sure the contracts are equivalent. */ tree old_contracts = DECL_CONTRACTS (old_result); - tree new_contracts = friend_attributes - ? find_contract (friend_attributes) - : DECL_CONTRACTS (new_result); - if (DECL_CONTRACTS (old_result) && new_contracts) + tree new_contracts = DECL_CONTRACTS (new_result); + if (old_contracts && new_contracts) { match_contract_conditions (DECL_SOURCE_LOCATION (old_result), old_contracts, @@ -2405,10 +2391,8 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden) } /* Remove contracts from old_result so they aren't appended to - old_result by the merge function. If we're duplicating because - NEWDECL is a friend, do not do this! */ - if (!friend_attributes) - remove_contract_attributes (old_result); + old_result by the merge function. */ + remove_contract_attributes (old_result); DECL_ATTRIBUTES (old_result) = (*targetm.merge_decl_attributes) (old_result, new_result); @@ -2485,27 +2469,6 @@ duplicate_decls (tree newdecl, tree olddecl, bool hiding, bool was_hidden) if (tree fc = DECL_FRIEND_CONTEXT (new_result)) SET_DECL_FRIEND_CONTEXT (old_result, fc); } - - /* In general, contracts are re-mapped to their parameters when - instantiated. However, for friends, we need to update the - previous declaration here. - - TODO: It would be nice if we could avoid doing this here. */ - if (friend_attributes) - { - remove_contract_attributes (old_result); - tree list = NULL_TREE; - for (tree p = new_contracts; p; p = TREE_CHAIN (p)) - { - if (cxx_contract_attribute_p (p)) - list = tree_cons (TREE_PURPOSE (p), - TREE_VALUE (p), - NULL_TREE); - } - nreverse (list); - DECL_ATTRIBUTES (old_result) - = chainon (DECL_ATTRIBUTES (old_result), list); - } } return olddecl; @@ -14448,14 +14411,16 @@ grokdeclarator (const cp_declarator *declarator, else if (decl && DECL_NAME (decl)) { set_originating_module (decl, true); - + if (initialized) /* Kludge: We need funcdef_flag to be true in do_friend for in-class defaulted functions, but that breaks grokfndecl. So set it here. */ funcdef_flag = true; - auto fao = make_temp_override(friend_attributes, *attrlist); + cplus_decl_attributes (&decl, *attrlist, 0); + *attrlist = NULL_TREE; + decl = do_friend (ctype, unqualified_id, decl, flags, funcdef_flag); return decl;
reply other threads:[~2022-11-01 11:43 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20221101114326.475743857833@sourceware.org \ --to=jason@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).