diff --git a/libstdc++-v3/src/c++11/Makefile.am b/libstdc++-v3/src/c++11/Makefile.am
index 222e2a8c618..ecd46aafc01 100644
--- a/libstdc++-v3/src/c++11/Makefile.am
+++ b/libstdc++-v3/src/c++11/Makefile.am
@@ -65,6 +65,7 @@ sources = \
 	hash_c++0x.cc \
 	hashtable_c++0x.cc \
 	ios.cc \
+	ios_errcat.cc \
 	limits.cc \
 	mutex.cc \
 	placeholders.cc \
diff --git a/libstdc++-v3/src/c++11/Makefile.in b/libstdc++-v3/src/c++11/Makefile.in
index 892c505eddc..4db28bd8515 100644
--- a/libstdc++-v3/src/c++11/Makefile.in
+++ b/libstdc++-v3/src/c++11/Makefile.in
@@ -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 \
diff --git a/libstdc++-v3/src/c++11/cxx11-ios_failure.cc b/libstdc++-v3/src/c++11/cxx11-ios_failure.cc
index 14a7f9cfcb1..0a81e15e4c0 100644
--- a/libstdc++-v3/src/c++11/cxx11-ios_failure.cc
+++ b/libstdc++-v3/src/c++11/cxx11-ios_failure.cc
@@ -42,57 +42,10 @@
 # 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
index 00000000000..12192447b8b
--- /dev/null
+++ b/libstdc++-v3/src/c++11/ios_errcat.cc
@@ -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
diff --git a/libstdc++-v3/testsuite/27_io/ios_base/failure/error_code.cc b/libstdc++-v3/testsuite/27_io/ios_base/failure/error_code.cc
index 169647a0b33..69697657394 100644
--- a/libstdc++-v3/testsuite/27_io/ios_base/failure/error_code.cc
+++ b/libstdc++-v3/testsuite/27_io/ios_base/failure/error_code.cc
@@ -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();
 }
