aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2022-10-28 11:26:05 -0400
committerJason Merrill <jason@redhat.com>2022-10-28 16:36:01 -0400
commit51c5fc25b37ae493787bcecba64c449896a066cd (patch)
tree7ad4d3f3fa050f4b1e5769276de898c6f3a0c741
parent6f047a4540277fe70d0fe73b2e2db24659093ec5 (diff)
downloadgcc-51c5fc25b37ae493787bcecba64c449896a066cd.zip
gcc-51c5fc25b37ae493787bcecba64c449896a066cd.tar.gz
gcc-51c5fc25b37ae493787bcecba64c449896a066cd.tar.bz2
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.
-rw-r--r--gcc/cp/decl.cc53
1 files changed, 9 insertions, 44 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index b5e132c..9740129 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;