[gcc r11-7218] libstdc++: Fix errors in <experimental/internet>

Jonathan Wakely redi@gcc.gnu.org
Fri Feb 12 14:44:26 GMT 2021


https://gcc.gnu.org/g:970ba719250ec06767e0617658bb92a64fde0f3f

commit r11-7218-g970ba719250ec06767e0617658bb92a64fde0f3f
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Fri Feb 12 13:01:20 2021 +0000

    libstdc++: Fix errors in <experimental/internet>
    
    libstdc++-v3/ChangeLog:
    
            * include/experimental/internet (address_v6::any): Avoid using
            memcpy in constexpr function.
            (address_v6::loopback): Likewise.
            (make_address_v6): Fix missing return statements on error paths.
            * include/experimental/io_context: Avoid -Wdangling-else
            warning.
            * testsuite/experimental/net/internet/address/v4/members.cc:
            Remove unused variables.
            * testsuite/experimental/net/internet/address/v6/members.cc:
            New test.

Diff:
---
 libstdc++-v3/include/experimental/internet         |  22 +++--
 libstdc++-v3/include/experimental/io_context       |  10 +-
 .../net/internet/address/v4/members.cc             |  30 +++---
 .../net/internet/address/v6/members.cc             | 108 +++++++++++++++++++++
 4 files changed, 145 insertions(+), 25 deletions(-)

diff --git a/libstdc++-v3/include/experimental/internet b/libstdc++-v3/include/experimental/internet
index 2fc253395f5..57831676a29 100644
--- a/libstdc++-v3/include/experimental/internet
+++ b/libstdc++-v3/include/experimental/internet
@@ -354,19 +354,18 @@ namespace ip
 #endif
 
     // static members:
+
     static constexpr address_v6
     any() noexcept
     {
-      address_v6 __addr;
-      __builtin_memcpy(&__addr._M_bytes, in6addr_any.s6_addr, 16);
-      return __addr;
+      return {};
     }
 
     static constexpr address_v6
     loopback() noexcept
     {
       address_v6 __addr;
-      __builtin_memcpy(&__addr._M_bytes, in6addr_loopback.s6_addr, 16);
+      __addr._M_bytes[15] = 1;
       return __addr;
     }
 
@@ -755,7 +754,10 @@ namespace ip
 	__str++;
       }
     if (__out == std::end(__buf))
-      __ec = std::make_error_code(std::errc::invalid_argument);
+      {
+	__ec = std::make_error_code(std::errc::invalid_argument);
+	return {};
+      }
     else
       {
 	*__out = '\0';
@@ -790,7 +792,10 @@ namespace ip
 	__n++;
       }
     if (__out == std::end(__buf))
-      __ec = std::make_error_code(std::errc::invalid_argument);
+      {
+	__ec = std::make_error_code(std::errc::invalid_argument);
+	return {};
+      }
     else
       {
 	*__out = '\0';
@@ -835,7 +840,10 @@ namespace ip
 	__n++;
       }
     if (__out == std::end(__buf))
-      __ec = std::make_error_code(std::errc::invalid_argument);
+      {
+	__ec = std::make_error_code(std::errc::invalid_argument);
+	return {};
+      }
     else
       {
 	*__out = '\0';
diff --git a/libstdc++-v3/include/experimental/io_context b/libstdc++-v3/include/experimental/io_context
index 12c269b4af2..c82f30cd119 100644
--- a/libstdc++-v3/include/experimental/io_context
+++ b/libstdc++-v3/include/experimental/io_context
@@ -680,10 +680,12 @@ inline namespace v1
 	    continue;
 
 	  if (__res == __reactor::_S_timeout)
-	    if (__timerq == nullptr)
-	      return false;
-	    else
-	      continue;  // timed out, so restart loop and process the timer
+	    {
+	      if (__timerq == nullptr)
+		return false;
+	      else
+		continue;  // timed out, so restart loop and process the timer
+	    }
 
 	  __timerq = nullptr;
 
diff --git a/libstdc++-v3/testsuite/experimental/net/internet/address/v4/members.cc b/libstdc++-v3/testsuite/experimental/net/internet/address/v4/members.cc
index f0eff14f202..f644c0847ab 100644
--- a/libstdc++-v3/testsuite/experimental/net/internet/address/v4/members.cc
+++ b/libstdc++-v3/testsuite/experimental/net/internet/address/v4/members.cc
@@ -19,15 +19,14 @@
 // { dg-add-options net_ts }
 
 #include <experimental/internet>
+#include <sstream>
 #include <testsuite_hooks.h>
 
 using std::experimental::net::ip::address_v4;
 
-void
+constexpr bool
 test01()
 {
-  bool test __attribute__((unused)) = false;
-
   address_v4 a;
   VERIFY( a.is_unspecified() );
 
@@ -39,13 +38,15 @@ test01()
 
   a = address_v4::broadcast();
   VERIFY( !a.is_unspecified() );
+
+  return true;
 }
 
-void
+static_assert(test01(), "");
+
+constexpr bool
 test02()
 {
-  bool test __attribute__((unused)) = false;
-
   auto a = address_v4::loopback();
   VERIFY( a.is_loopback() );
 
@@ -63,13 +64,15 @@ test02()
 
   a = address_v4::broadcast();
   VERIFY( !a.is_loopback() );
+
+  return true;
 }
 
-void
+static_assert(test02(), "");
+
+constexpr bool
 test03()
 {
-  bool test __attribute__((unused)) = false;
-
   auto a = address_v4{0xE0000001};
   VERIFY( a.is_multicast() );
 
@@ -84,13 +87,15 @@ test03()
 
   a = address_v4{0xDFFFFFFF};
   VERIFY( !a.is_multicast() );
+
+  return true;
 }
 
+static_assert(test03(), "");
+
 void
 test04()
 {
-  bool test __attribute__((unused)) = false;
-
   VERIFY( address_v4::any().to_string() == "0.0.0.0" );
   VERIFY( address_v4::loopback().to_string() == "127.0.0.1" );
   VERIFY( address_v4::broadcast().to_string() == "255.255.255.255" );
@@ -99,15 +104,12 @@ test04()
 void
 test05()
 {
-  bool test __attribute__((unused)) = false;
-
   std::ostringstream ss;
   ss << address_v4::any() << ' ' << address_v4::loopback() << ' '
     << address_v4::broadcast();
   VERIFY( ss.str() == "0.0.0.0 127.0.0.1 255.255.255.255" );
 }
 
-
 int
 main()
 {
diff --git a/libstdc++-v3/testsuite/experimental/net/internet/address/v6/members.cc b/libstdc++-v3/testsuite/experimental/net/internet/address/v6/members.cc
new file mode 100644
index 00000000000..506345dc990
--- /dev/null
+++ b/libstdc++-v3/testsuite/experimental/net/internet/address/v6/members.cc
@@ -0,0 +1,108 @@
+// Copyright (C) 2021 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do run { target c++14 } }
+// { dg-add-options net_ts }
+
+#include <experimental/internet>
+#include <sstream>
+#include <testsuite_hooks.h>
+
+using std::experimental::net::ip::address_v6;
+
+constexpr bool
+test01()
+{
+  address_v6 a;
+  VERIFY( a.is_unspecified() );
+  VERIFY( !a.is_loopback() );
+  VERIFY( !a.is_multicast() );
+  VERIFY( !a.is_link_local() );
+  VERIFY( !a.is_site_local() );
+
+  a = address_v6::any();
+  VERIFY( a.is_unspecified() );
+  VERIFY( !a.is_loopback() );
+  VERIFY( !a.is_multicast() );
+  VERIFY( !a.is_link_local() );
+  VERIFY( !a.is_site_local() );
+
+  a = address_v6::loopback();
+  VERIFY( !a.is_unspecified() );
+  VERIFY( a.is_loopback() );
+  VERIFY( !a.is_multicast() );
+  VERIFY( !a.is_link_local() );
+  VERIFY( !a.is_site_local() );
+
+  a = address_v6{address_v6::loopback().to_bytes(), 1};
+  VERIFY( !a.is_unspecified() );
+  VERIFY( !a.is_loopback() );
+  VERIFY( !a.is_multicast() );
+  VERIFY( !a.is_link_local() );
+  VERIFY( !a.is_site_local() );
+
+  return true;
+}
+
+static_assert(test01(), "");
+
+constexpr bool
+test02()
+{
+  auto a = address_v6{address_v6::bytes_type{0xFF}};
+  VERIFY( a.is_multicast() );
+
+  a = address_v6{address_v6::bytes_type{0xFF, 0x01}};
+  VERIFY( a.is_multicast() );
+
+  a = address_v6{address_v6::bytes_type{0xFF, 0x00, 0x01}};
+  VERIFY( a.is_multicast() );
+
+  a = address_v6{address_v6::bytes_type{0xFE, 0x80}};
+  VERIFY( !a.is_multicast() );
+
+  a = address_v6{address_v6::bytes_type{0xFE, 0xC0}};
+  VERIFY( !a.is_multicast() );
+
+  return true;
+}
+
+static_assert(test02(), "");
+
+void
+test03()
+{
+  VERIFY( address_v6::any().to_string() == "::" );
+  VERIFY( address_v6::loopback().to_string() == "::1" );
+}
+
+void
+test04()
+{
+  std::ostringstream ss;
+  ss << address_v6::any() << ' ' << address_v6::loopback();
+  VERIFY( ss.str() == ":: ::1" );
+}
+
+int
+main()
+{
+  test01();
+  test02();
+  test03();
+  test04();
+}


More information about the Libstdc++-cvs mailing list