public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/c++-contracts] c++: remove friend_attributes
@ 2022-11-01 11:43 Jason Merrill
  0 siblings, 0 replies; only message in thread
From: Jason Merrill @ 2022-11-01 11:43 UTC (permalink / raw)
  To: gcc-cvs

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;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-11-01 11:43 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-01 11:43 [gcc/devel/c++-contracts] c++: remove friend_attributes Jason Merrill

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).