]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Move std::iostream_category() definition to new file
authorJonathan Wakely <jwakely@redhat.com>
Thu, 26 May 2022 14:42:50 +0000 (15:42 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 26 May 2022 21:28:57 +0000 (22:28 +0100)
This fixes a missing symbol when the dual ABI is disabled, e.g. for the
versioned namespace build.

libstdc++-v3/ChangeLog:

* src/c++11/Makefile.am: Add new source file.
* src/c++11/Makefile.in: Regenerate.
* src/c++11/cxx11-ios_failure.cc (iostream_category):
Move to ...
* src/c++11/ios_errcat.cc: New file.
* testsuite/27_io/ios_base/failure/error_code.cc: Check that
std::iostream_category() is defined and used for std::io_errc.

libstdc++-v3/src/c++11/Makefile.am
libstdc++-v3/src/c++11/Makefile.in
libstdc++-v3/src/c++11/cxx11-ios_failure.cc
libstdc++-v3/src/c++11/ios_errcat.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/ios_base/failure/error_code.cc

index 222e2a8c618d693268025cd7b968a31c17ed95b9..ecd46aafc019fb025eec34bf093ec819a45e5947 100644 (file)
@@ -65,6 +65,7 @@ sources = \
        hash_c++0x.cc \
        hashtable_c++0x.cc \
        ios.cc \
+       ios_errcat.cc \
        limits.cc \
        mutex.cc \
        placeholders.cc \
index 892c505eddc6c235a3efd611fb7e81e8888875b9..4db28bd85153dbcf3f2d2cf504030cc8da1e2dee 100644 (file)
@@ -130,9 +130,10 @@ am__objects_2 = ctype_configure_char.lo ctype_members.lo
 am__objects_3 = chrono.lo codecvt.lo condition_variable.lo \
        cow-stdexcept.lo ctype.lo debug.lo functexcept.lo \
        functional.lo futex.lo future.lo hash_c++0x.lo \
-       hashtable_c++0x.lo ios.lo limits.lo mutex.lo placeholders.lo \
-       random.lo regex.lo shared_ptr.lo snprintf_lite.lo \
-       system_error.lo thread.lo $(am__objects_1) $(am__objects_2)
+       hashtable_c++0x.lo ios.lo ios_errcat.lo limits.lo mutex.lo \
+       placeholders.lo random.lo regex.lo shared_ptr.lo \
+       snprintf_lite.lo system_error.lo thread.lo $(am__objects_1) \
+       $(am__objects_2)
 @ENABLE_DUAL_ABI_TRUE@am__objects_4 = cow-fstream-inst.lo \
 @ENABLE_DUAL_ABI_TRUE@ cow-sstream-inst.lo cow-string-inst.lo \
 @ENABLE_DUAL_ABI_TRUE@ cow-string-io-inst.lo \
@@ -479,6 +480,7 @@ sources = \
        hash_c++0x.cc \
        hashtable_c++0x.cc \
        ios.cc \
+       ios_errcat.cc \
        limits.cc \
        mutex.cc \
        placeholders.cc \
index 14a7f9cfcb1cbf9824179266f0f06705a596f776..0a81e15e4c0d502735aecb1c5145edb3d11f613e 100644 (file)
 # error This file should not be compiled for this configuration.
 #endif
 
-#if __has_cpp_attribute(clang::require_constant_initialization)
-#  define __constinit [[clang::require_constant_initialization]]
-#endif
-
-namespace
-{
-  struct io_error_category final : std::error_category
-  {
-    const char*
-    name() const noexcept final
-    { return "iostream"; }
-
-    _GLIBCXX_DEFAULT_ABI_TAG
-    std::string
-    message(int __ec) const final
-    {
-      std::string __msg;
-      switch (std::io_errc(__ec))
-      {
-      case std::io_errc::stream:
-          __msg = "iostream error";
-          break;
-      default:
-          __msg = "Unknown error";
-          break;
-      }
-      return __msg;
-    }
-  };
-
-  struct constant_init
-  {
-    union {
-      unsigned char unused;
-      io_error_category cat;
-    };
-    constexpr constant_init() : cat() { }
-    ~constant_init() { /* do nothing, union member is not destroyed */ }
-  };
-
-  __constinit constant_init io_category_instance{};
-} // namespace
-
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-  const error_category&
-  iostream_category() noexcept
-  { return io_category_instance.cat; }
-
   ios_base::failure::failure(const string& __str)
   : system_error(io_errc::stream, __str) { }
 
diff --git a/libstdc++-v3/src/c++11/ios_errcat.cc b/libstdc++-v3/src/c++11/ios_errcat.cc
new file mode 100644 (file)
index 0000000..1219244
--- /dev/null
@@ -0,0 +1,84 @@
+// std::iostream_category() definition -*- C++ -*-
+
+// Copyright (C) 2014-2022 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+//
+// ISO C++ 14882:2011: 27.5.6.5  Error reporting [error.reporting]
+//
+
+#define _GLIBCXX_USE_CXX11_ABI 1
+#include <ios>
+
+#if __has_cpp_attribute(clang::require_constant_initialization)
+#  define __constinit [[clang::require_constant_initialization]]
+#endif
+
+namespace
+{
+  struct io_error_category final : std::error_category
+  {
+    const char*
+    name() const noexcept final
+    { return "iostream"; }
+
+    _GLIBCXX_DEFAULT_ABI_TAG
+    std::string
+    message(int __ec) const final
+    {
+      std::string __msg;
+      switch (std::io_errc(__ec))
+      {
+      case std::io_errc::stream:
+          __msg = "iostream error";
+          break;
+      default:
+          __msg = "Unknown error";
+          break;
+      }
+      return __msg;
+    }
+  };
+
+  struct constant_init
+  {
+    union {
+      unsigned char unused;
+      io_error_category cat;
+    };
+    constexpr constant_init() : cat() { }
+    ~constant_init() { /* do nothing, union member is not destroyed */ }
+  };
+
+  __constinit constant_init io_category_instance{};
+} // namespace
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+  const error_category&
+  iostream_category() noexcept
+  { return io_category_instance.cat; }
+
+_GLIBCXX_END_NAMESPACE_VERSION
+} // namespace
index 169647a0b3305c2645bbcbcc90e018abe2ae0e75..696976573947c0f865380b7c64f1ce1af6ebe762 100644 (file)
@@ -41,8 +41,21 @@ test01()
   VERIFY( e4.code() == ec );
 }
 
+[[gnu::noinline,gnu::noipa]]
+const std::error_category&
+get_iostream_category()
+{ return std::iostream_category(); }
+
+void
+test02()
+{
+  auto ec = std::make_error_code(std::io_errc::stream);
+  VERIFY( ec.category() == get_iostream_category() );
+}
+
 int
 main()
 {
   test01();
+  test02();
 }