public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
From: Jonathan Wakely <redi@gcc.gnu.org>
To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org
Subject: [gcc r12-152] libstdc++: Define net::socket_base::message_flags operators as friends [PR 100285]
Date: Tue, 27 Apr 2021 13:09:52 +0000 (GMT)	[thread overview]
Message-ID: <20210427130952.75F5039888BC@sourceware.org> (raw)

https://gcc.gnu.org/g:8aadb4fedb17e7a44583a7a5a4e96b1874e1ce98

commit r12-152-g8aadb4fedb17e7a44583a7a5a4e96b1874e1ce98
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Apr 27 11:07:47 2021 +0100

    libstdc++: Define net::socket_base::message_flags operators as friends [PR 100285]
    
    The overloaded operators for socket_base::message_flags should only be
    defined when the message_flags type itself is defined. Rather than
    duplicate the preprocessor conditional, this moves the operators into
    the same scope as the type, defining them as hidden friends.
    
    As well as fixing the bug, this has all the usual advantages of hidden
    friends (they are not visible to normal name lookup for unrelated
    types).
    
    For consistency, do the same for the resolver_base::flags bitmask
    operators too.
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/100285
            * include/experimental/internet (resolver_base::flags):
            Define overloaded operators as hidden friends.
            * include/experimental/socket (socket_base::message_flags):
            Likewise.

Diff:
---
 libstdc++-v3/include/experimental/internet | 50 ++++++++++----------
 libstdc++-v3/include/experimental/socket   | 74 ++++++++++++++----------------
 2 files changed, 59 insertions(+), 65 deletions(-)

diff --git a/libstdc++-v3/include/experimental/internet b/libstdc++-v3/include/experimental/internet
index 2e3fd06ead2..11961762880 100644
--- a/libstdc++-v3/include/experimental/internet
+++ b/libstdc++-v3/include/experimental/internet
@@ -1660,38 +1660,38 @@ namespace ip
     static constexpr flags all_matching		= (flags)AI_ALL;
     static constexpr flags address_configured	= (flags)AI_ADDRCONFIG;
 
-  protected:
-    resolver_base() = default;
-    ~resolver_base() = default;
-  };
+    friend constexpr flags
+    operator&(flags __f1, flags __f2) noexcept
+    { return flags( int(__f1) & int(__f2) ); }
 
-  constexpr resolver_base::flags
-  operator&(resolver_base::flags __f1, resolver_base::flags __f2) noexcept
-  { return resolver_base::flags( int(__f1) & int(__f2) ); }
+    friend constexpr flags
+    operator|(flags __f1, flags __f2) noexcept
+    { return flags( int(__f1) | int(__f2) ); }
 
-  constexpr resolver_base::flags
-  operator|(resolver_base::flags __f1, resolver_base::flags __f2) noexcept
-  { return resolver_base::flags( int(__f1) | int(__f2) ); }
+    friend constexpr flags
+    operator^(flags __f1, flags __f2) noexcept
+    { return flags( int(__f1) ^ int(__f2) ); }
 
-  constexpr resolver_base::flags
-  operator^(resolver_base::flags __f1, resolver_base::flags __f2) noexcept
-  { return resolver_base::flags( int(__f1) ^ int(__f2) ); }
+    friend constexpr flags
+    operator~(flags __f) noexcept
+    { return flags( ~int(__f) ); }
 
-  constexpr resolver_base::flags
-  operator~(resolver_base::flags __f) noexcept
-  { return resolver_base::flags( ~int(__f) ); }
+    friend constexpr flags&
+    operator&=(flags& __f1, flags __f2) noexcept
+    { return __f1 = (__f1 & __f2); }
 
-  constexpr resolver_base::flags&
-  operator&=(resolver_base::flags& __f1, resolver_base::flags __f2) noexcept
-  { return __f1 = (__f1 & __f2); }
+    friend constexpr flags&
+    operator|=(flags& __f1, flags __f2) noexcept
+    { return __f1 = (__f1 | __f2); }
 
-  constexpr resolver_base::flags&
-  operator|=(resolver_base::flags& __f1, resolver_base::flags __f2) noexcept
-  { return __f1 = (__f1 | __f2); }
+    friend constexpr flags&
+    operator^=(flags& __f1, flags __f2) noexcept
+    { return __f1 = (__f1 ^ __f2); }
 
-  constexpr resolver_base::flags&
-  operator^=(resolver_base::flags& __f1, resolver_base::flags __f2) noexcept
-  { return __f1 = (__f1 ^ __f2); }
+  protected:
+    resolver_base() = default;
+    ~resolver_base() = default;
+  };
 
   // TODO define resolver_base::flags static constants in .so for C++14 mode
 
diff --git a/libstdc++-v3/include/experimental/socket b/libstdc++-v3/include/experimental/socket
index 18849f607f8..bf6a8c87e67 100644
--- a/libstdc++-v3/include/experimental/socket
+++ b/libstdc++-v3/include/experimental/socket
@@ -319,13 +319,38 @@ inline namespace v1
       = (message_flags)MSG_DONTROUTE;
 
     static const int max_listen_connections = SOMAXCONN;
-#endif
 
-  protected:
-    socket_base() = default;
-    ~socket_base() = default;
+    // message_flags bitmask operations are defined as hidden friends.
 
-#ifdef _GLIBCXX_HAVE_SYS_SOCKET_H
+    friend constexpr message_flags
+    operator&(message_flags __f1, message_flags __f2) noexcept
+    { return message_flags( int(__f1) & int(__f2) ); }
+
+    friend constexpr message_flags
+    operator|(message_flags __f1, message_flags __f2) noexcept
+    { return message_flags( int(__f1) | int(__f2) ); }
+
+    friend constexpr message_flags
+    operator^(message_flags __f1, message_flags __f2) noexcept
+    { return message_flags( int(__f1) ^ int(__f2) ); }
+
+    friend constexpr message_flags
+    operator~(message_flags __f) noexcept
+    { return message_flags( ~int(__f) ); }
+
+    friend constexpr message_flags&
+    operator&=(message_flags& __f1, message_flags __f2) noexcept
+    { return __f1 = (__f1 & __f2); }
+
+    friend constexpr message_flags&
+    operator|=(message_flags& __f1, message_flags __f2) noexcept
+    { return __f1 = (__f1 | __f2); }
+
+    friend constexpr message_flags&
+    operator^=(message_flags& __f1, message_flags __f2) noexcept
+    { return __f1 = (__f1 ^ __f2); }
+
+  protected:
     struct __msg_hdr : ::msghdr
     {
 #ifdef IOV_MAX
@@ -382,42 +407,11 @@ inline namespace v1
 	}
     };
 #endif
-  };
 
-  constexpr socket_base::message_flags
-  operator&(socket_base::message_flags __f1, socket_base::message_flags __f2)
-    noexcept
-  { return socket_base::message_flags( int(__f1) & int(__f2) ); }
-
-  constexpr socket_base::message_flags
-  operator|(socket_base::message_flags __f1, socket_base::message_flags __f2)
-    noexcept
-  { return socket_base::message_flags( int(__f1) | int(__f2) ); }
-
-  constexpr socket_base::message_flags
-  operator^(socket_base::message_flags __f1, socket_base::message_flags __f2)
-    noexcept
-  { return socket_base::message_flags( int(__f1) ^ int(__f2) ); }
-
-  constexpr socket_base::message_flags
-  operator~(socket_base::message_flags __f)
-    noexcept
-  { return socket_base::message_flags( ~int(__f) ); }
-
-  constexpr socket_base::message_flags&
-  operator&=(socket_base::message_flags& __f1, socket_base::message_flags __f2)
-    noexcept
-  { return __f1 = (__f1 & __f2); }
-
-  constexpr socket_base::message_flags&
-  operator|=(socket_base::message_flags& __f1, socket_base::message_flags __f2)
-    noexcept
-  { return __f1 = (__f1 | __f2); }
-
-  constexpr socket_base::message_flags&
-  operator^=(socket_base::message_flags& __f1, socket_base::message_flags __f2)
-    noexcept
-  { return __f1 = (__f1 ^ __f2); }
+  protected:
+    socket_base() = default;
+    ~socket_base() = default;
+  };
 
   // TODO define socket_base static constants in .so for C++14 mode


                 reply	other threads:[~2021-04-27 13:09 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=20210427130952.75F5039888BC@sourceware.org \
    --to=redi@gcc.gnu.org \
    --cc=gcc-cvs@gcc.gnu.org \
    --cc=libstdc++-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: link
Be 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).