[libcxx-commits] [libcxx] c847b8e - [libc++] Make bsd_locale_fallbacks.h modular and move it into __locale/locale_base_api/

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Thu Apr 20 20:36:48 PDT 2023


Author: Nikolas Klauser
Date: 2023-04-21T05:36:41+02:00
New Revision: c847b8e24cfdc85316b17f173019f9de1b1050ea

URL: https://github.com/llvm/llvm-project/commit/c847b8e24cfdc85316b17f173019f9de1b1050ea
DIFF: https://github.com/llvm/llvm-project/commit/c847b8e24cfdc85316b17f173019f9de1b1050ea.diff

LOG: [libc++] Make bsd_locale_fallbacks.h modular and move it into __locale/locale_base_api/

This is a first step towards granularizing `<locale>`.

Reviewed By: ldionne, #libc

Spies: arichardson, libcxx-commits, mikhail.ramalho

Differential Revision: https://reviews.llvm.org/D146397

Added: 
    libcxx/include/__locale_dir/locale_base_api/bsd_locale_defaults.h
    libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h
    libcxx/include/__locale_dir/locale_base_api/locale_guard.h

Modified: 
    libcxx/include/CMakeLists.txt
    libcxx/include/__locale
    libcxx/include/libcxx.imp
    libcxx/include/locale
    libcxx/src/iostream.cpp
    libcxx/src/support/win32/locale_win32.cpp
    libcxx/test/libcxx/lint/lint_modulemap.sh.py
    libcxx/test/libcxx/private_headers.verify.cpp
    libcxx/test/libcxx/transitive_includes/cxx03.csv
    libcxx/test/libcxx/transitive_includes/cxx11.csv
    libcxx/test/libcxx/transitive_includes/cxx14.csv
    libcxx/test/libcxx/transitive_includes/cxx17.csv
    libcxx/test/libcxx/transitive_includes/cxx20.csv
    libcxx/test/libcxx/transitive_includes/cxx2b.csv
    libcxx/utils/data/ignore_format.txt
    libcxx/utils/generate_header_tests.py
    libcxx/utils/generate_iwyu_mapping.py

Removed: 
    libcxx/include/__bsd_locale_defaults.h
    libcxx/include/__bsd_locale_fallbacks.h


################################################################################
diff  --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index bd65ff3b57fad..a28f8c1e8a035 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -222,8 +222,6 @@ set(files
   __bit/popcount.h
   __bit/rotate.h
   __bit_reference
-  __bsd_locale_defaults.h
-  __bsd_locale_fallbacks.h
   __charconv/chars_format.h
   __charconv/from_chars_integral.h
   __charconv/from_chars_result.h
@@ -439,6 +437,9 @@ set(files
   __iterator/unreachable_sentinel.h
   __iterator/wrap_iter.h
   __locale
+  __locale_dir/locale_base_api/bsd_locale_defaults.h
+  __locale_dir/locale_base_api/bsd_locale_fallbacks.h
+  __locale_dir/locale_base_api/locale_guard.h
   __mbstate_t.h
   __memory/addressof.h
   __memory/align.h

diff  --git a/libcxx/include/__locale b/libcxx/include/__locale
index b322c6ba0a22d..994613083cdff 100644
--- a/libcxx/include/__locale
+++ b/libcxx/include/__locale
@@ -13,9 +13,9 @@
 #include <__availability>
 #include <__config>
 #include <cctype>
+#include <clocale>
 #include <cstdint>
 #include <cstdlib>
-#include <locale.h>
 #include <mutex>
 #include <string>
 
@@ -23,6 +23,10 @@
 #include <cstddef>
 #include <cstring>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#  include <cwchar>
+#endif
+
 #if defined(_LIBCPP_MSVCRT_LIKE)
 # include <__support/win32/locale_win32.h>
 #elif defined(_AIX) || defined(__MVS__)
@@ -53,63 +57,6 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-#if !defined(_LIBCPP_LOCALE__L_EXTENSIONS)
-struct __libcpp_locale_guard {
-  _LIBCPP_INLINE_VISIBILITY
-  __libcpp_locale_guard(locale_t& __loc) : __old_loc_(uselocale(__loc)) {}
-
-  _LIBCPP_INLINE_VISIBILITY
-  ~__libcpp_locale_guard() {
-    if (__old_loc_)
-      uselocale(__old_loc_);
-  }
-
-  locale_t __old_loc_;
-private:
-  __libcpp_locale_guard(__libcpp_locale_guard const&);
-  __libcpp_locale_guard& operator=(__libcpp_locale_guard const&);
-};
-#elif defined(_LIBCPP_MSVCRT_LIKE)
-struct __libcpp_locale_guard {
-    __libcpp_locale_guard(locale_t __l) :
-        __status(_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)) {
-      // Setting the locale can be expensive even when the locale given is
-      // already the current locale, so do an explicit check to see if the
-      // current locale is already the one we want.
-      const char* __lc = __setlocale(nullptr);
-      // If every category is the same, the locale string will simply be the
-      // locale name, otherwise it will be a semicolon-separated string listing
-      // each category.  In the second case, we know at least one category won't
-      // be what we want, so we only have to check the first case.
-      if (_VSTD::strcmp(__l.__get_locale(), __lc) != 0) {
-        __locale_all = _strdup(__lc);
-        if (__locale_all == nullptr)
-          __throw_bad_alloc();
-        __setlocale(__l.__get_locale());
-      }
-    }
-    ~__libcpp_locale_guard() {
-      // The CRT documentation doesn't explicitly say, but setlocale() does the
-      // right thing when given a semicolon-separated list of locale settings
-      // for the 
diff erent categories in the same format as returned by
-      // setlocale(LC_ALL, nullptr).
-      if (__locale_all != nullptr) {
-        __setlocale(__locale_all);
-        free(__locale_all);
-      }
-      _configthreadlocale(__status);
-    }
-    static const char* __setlocale(const char* __locale) {
-      const char* __new_locale = setlocale(LC_ALL, __locale);
-      if (__new_locale == nullptr)
-        __throw_bad_alloc();
-      return __new_locale;
-    }
-    int __status;
-    char* __locale_all = nullptr;
-};
-#endif
-
 class _LIBCPP_TYPE_VIS locale;
 
 template <class _Facet>

diff  --git a/libcxx/include/__bsd_locale_defaults.h b/libcxx/include/__locale_dir/locale_base_api/bsd_locale_defaults.h
similarity index 91%
rename from libcxx/include/__bsd_locale_defaults.h
rename to libcxx/include/__locale_dir/locale_base_api/bsd_locale_defaults.h
index 4d990482d4a3a..38d36f0aa8fc1 100644
--- a/libcxx/include/__bsd_locale_defaults.h
+++ b/libcxx/include/__locale_dir/locale_base_api/bsd_locale_defaults.h
@@ -11,8 +11,8 @@
 // we will define the mapping from an internal macro to the real BSD symbol.
 //===----------------------------------------------------------------------===//
 
-#ifndef _LIBCPP___BSD_LOCALE_DEFAULTS_H
-#define _LIBCPP___BSD_LOCALE_DEFAULTS_H
+#ifndef _LIBCPP___LOCALE_LOCALE_BASE_API_BSD_LOCALE_DEFAULTS_H
+#define _LIBCPP___LOCALE_LOCALE_BASE_API_BSD_LOCALE_DEFAULTS_H
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
@@ -33,4 +33,4 @@
 #define __libcpp_asprintf_l(...)                            asprintf_l(__VA_ARGS__)
 #define __libcpp_sscanf_l(...)                              sscanf_l(__VA_ARGS__)
 
-#endif // _LIBCPP___BSD_LOCALE_DEFAULTS_H
+#endif // _LIBCPP___LOCALE_LOCALE_BASE_API_BSD_LOCALE_DEFAULTS_H

diff  --git a/libcxx/include/__bsd_locale_fallbacks.h b/libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h
similarity index 92%
rename from libcxx/include/__bsd_locale_fallbacks.h
rename to libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h
index 9abd7e7e5ff47..7776a744d916c 100644
--- a/libcxx/include/__bsd_locale_fallbacks.h
+++ b/libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h
@@ -10,12 +10,18 @@
 // of those functions for non-BSD platforms.
 //===----------------------------------------------------------------------===//
 
-#ifndef _LIBCPP___BSD_LOCALE_FALLBACKS_H
-#define _LIBCPP___BSD_LOCALE_FALLBACKS_H
+#ifndef _LIBCPP___LOCALE_LOCALE_BASE_API_BSD_LOCALE_FALLBACKS_H
+#define _LIBCPP___LOCALE_LOCALE_BASE_API_BSD_LOCALE_FALLBACKS_H
 
+#include <__locale_dir/locale_base_api/locale_guard.h>
+#include <cstdio>
 #include <stdarg.h>
 #include <stdlib.h>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#  include <cwchar>
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #  pragma GCC system_header
 #endif
@@ -139,4 +145,4 @@ int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...)
 
 _LIBCPP_END_NAMESPACE_STD
 
-#endif // _LIBCPP___BSD_LOCALE_FALLBACKS_H
+#endif // _LIBCPP___LOCALE_LOCALE_BASE_API_BSD_LOCALE_FALLBACKS_H

diff  --git a/libcxx/include/__locale_dir/locale_base_api/locale_guard.h b/libcxx/include/__locale_dir/locale_base_api/locale_guard.h
new file mode 100644
index 0000000000000..0e2e91af7d190
--- /dev/null
+++ b/libcxx/include/__locale_dir/locale_base_api/locale_guard.h
@@ -0,0 +1,79 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef _LIBCPP___LOCALE_LOCALE_BASE_API_LOCALE_GUARD_H
+#define _LIBCPP___LOCALE_LOCALE_BASE_API_LOCALE_GUARD_H
+
+#include <__config>
+#include <clocale>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#  pragma GCC system_header
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+#if !defined(_LIBCPP_LOCALE__L_EXTENSIONS)
+struct __libcpp_locale_guard {
+  _LIBCPP_INLINE_VISIBILITY __libcpp_locale_guard(locale_t& __loc) : __old_loc_(uselocale(__loc)) {}
+
+  _LIBCPP_INLINE_VISIBILITY ~__libcpp_locale_guard() {
+    if (__old_loc_)
+      uselocale(__old_loc_);
+  }
+
+  locale_t __old_loc_;
+
+private:
+  __libcpp_locale_guard(__libcpp_locale_guard const&);
+  __libcpp_locale_guard& operator=(__libcpp_locale_guard const&);
+};
+#elif defined(_LIBCPP_MSVCRT_LIKE)
+struct __libcpp_locale_guard {
+    __libcpp_locale_guard(locale_t __l) :
+        __status(_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)) {
+      // Setting the locale can be expensive even when the locale given is
+      // already the current locale, so do an explicit check to see if the
+      // current locale is already the one we want.
+      const char* __lc = __setlocale(nullptr);
+      // If every category is the same, the locale string will simply be the
+      // locale name, otherwise it will be a semicolon-separated string listing
+      // each category.  In the second case, we know at least one category won't
+      // be what we want, so we only have to check the first case.
+      if (_VSTD::strcmp(__l.__get_locale(), __lc) != 0) {
+        __locale_all = _strdup(__lc);
+        if (__locale_all == nullptr)
+          __throw_bad_alloc();
+        __setlocale(__l.__get_locale());
+      }
+    }
+    ~__libcpp_locale_guard() {
+      // The CRT documentation doesn't explicitly say, but setlocale() does the
+      // right thing when given a semicolon-separated list of locale settings
+      // for the 
diff erent categories in the same format as returned by
+      // setlocale(LC_ALL, nullptr).
+      if (__locale_all != nullptr) {
+        __setlocale(__locale_all);
+        free(__locale_all);
+      }
+      _configthreadlocale(__status);
+    }
+    static const char* __setlocale(const char* __locale) {
+      const char* __new_locale = setlocale(LC_ALL, __locale);
+      if (__new_locale == nullptr)
+        __throw_bad_alloc();
+      return __new_locale;
+    }
+    int __status;
+    char* __locale_all = nullptr;
+};
+#endif
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___LOCALE_LOCALE_BASE_API_LOCALE_GUARD_H

diff  --git a/libcxx/include/libcxx.imp b/libcxx/include/libcxx.imp
index daa9188544cb5..d6e26d8844451 100644
--- a/libcxx/include/libcxx.imp
+++ b/libcxx/include/libcxx.imp
@@ -32,6 +32,7 @@
   { include: [ "@<__fwd/.*>", "private", "<fwd>", "public" ] },
   { include: [ "@<__ios/.*>", "private", "<ios>", "public" ] },
   { include: [ "@<__iterator/.*>", "private", "<iterator>", "public" ] },
+  { include: [ "@<__locale_dir/.*>", "private", "<locale>", "public" ] },
   { include: [ "@<__memory/.*>", "private", "<memory>", "public" ] },
   { include: [ "@<__memory_resource/.*>", "private", "<memory_resource>", "public" ] },
   { include: [ "@<__mutex/.*>", "private", "<mutex>", "public" ] },

diff  --git a/libcxx/include/locale b/libcxx/include/locale
index 122d4bb012392..cbd47139344fc 100644
--- a/libcxx/include/locale
+++ b/libcxx/include/locale
@@ -225,9 +225,9 @@ template <class charT> class messages_byname;
 #endif
 
 #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
-#include <__bsd_locale_defaults.h>
+#  include <__locale_dir/locale_base_api/bsd_locale_defaults.h>
 #else
-#include <__bsd_locale_fallbacks.h>
+#  include <__locale_dir/locale_base_api/bsd_locale_fallbacks.h>
 #endif
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)

diff  --git a/libcxx/src/iostream.cpp b/libcxx/src/iostream.cpp
index 36c6894a0df8e..9b1a1a41e84bb 100644
--- a/libcxx/src/iostream.cpp
+++ b/libcxx/src/iostream.cpp
@@ -11,6 +11,10 @@
 #include <new>
 #include <string>
 
+#ifdef _LIBCPP_MSVCRT_LIKE
+#  include <__locale_dir/locale_base_api/locale_guard.h>
+#endif
+
 #define _str(s) #s
 #define str(s) _str(s)
 #define _LIBCPP_ABI_NAMESPACE_STR str(_LIBCPP_ABI_NAMESPACE)

diff  --git a/libcxx/src/support/win32/locale_win32.cpp b/libcxx/src/support/win32/locale_win32.cpp
index 67f4d1341abd4..2543686c907d8 100644
--- a/libcxx/src/support/win32/locale_win32.cpp
+++ b/libcxx/src/support/win32/locale_win32.cpp
@@ -11,6 +11,8 @@
 #include <memory>
 #include <type_traits>
 
+#include <__locale_dir/locale_base_api/locale_guard.h>
+
 int __libcpp_vasprintf(char **sptr, const char *__restrict fmt, va_list ap);
 
 using std::__libcpp_locale_guard;

diff  --git a/libcxx/test/libcxx/lint/lint_modulemap.sh.py b/libcxx/test/libcxx/lint/lint_modulemap.sh.py
index bbb5885273b79..8bcd663eb8a04 100755
--- a/libcxx/test/libcxx/lint/lint_modulemap.sh.py
+++ b/libcxx/test/libcxx/lint/lint_modulemap.sh.py
@@ -23,7 +23,7 @@
                 if re.match(r'^\s*module (\w+)\s+[{] private header "\1(.h)?"\s+export [*] [}]', line):
                     # It's a top-level private header, such as <__bit_reference>.
                     pass
-                elif re.match(r'^\s*module (\w+)\s+[{] private header "__\w+/\1[.]h" [}]', line):
+                elif re.match(r'^\s*module (\w+)\s+[{] private (textual )?header "__(\w+/)*\1[.]h" [}]', line):
                     # It's a private submodule, such as <__utility/swap.h>.
                     pass
                 elif re.match(r'^\s*module (\w+)_fwd\s+[{] private header "__fwd/\1[.]h" [}]', line):

diff  --git a/libcxx/test/libcxx/private_headers.verify.cpp b/libcxx/test/libcxx/private_headers.verify.cpp
index 8031f101975ba..00283594e8474 100644
--- a/libcxx/test/libcxx/private_headers.verify.cpp
+++ b/libcxx/test/libcxx/private_headers.verify.cpp
@@ -23,6 +23,10 @@ for header in private_headers:
   if header.startswith('__support'):
     continue
 
+  # Skip the locale API headers, since they are platform-specific and thus inherently non-modular
+  if 'locale_base_api' in header:
+    continue
+
   print("{ifdef}#{indent}include <{header}> // {expected_error}@*:* {{{{use of private header from outside its module: '{header}'}}}}{endif}".format(
     ifdef='#if ' + header_restrictions[header] + '\n' if header in header_restrictions else '',
     indent='   ' if header in header_restrictions else '',

diff  --git a/libcxx/test/libcxx/transitive_includes/cxx03.csv b/libcxx/test/libcxx/transitive_includes/cxx03.csv
index 782e3f8135cd8..2ad5c5b363d2c 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx03.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx03.csv
@@ -127,11 +127,13 @@ cmath type_traits
 cmath version
 codecvt atomic
 codecvt cctype
+codecvt clocale
 codecvt concepts
 codecvt cstddef
 codecvt cstdint
 codecvt cstdlib
 codecvt cstring
+codecvt cwchar
 codecvt initializer_list
 codecvt iosfwd
 codecvt limits
@@ -354,12 +356,14 @@ forward_list typeinfo
 forward_list version
 fstream atomic
 fstream cctype
+fstream clocale
 fstream concepts
 fstream cstddef
 fstream cstdint
 fstream cstdio
 fstream cstdlib
 fstream cstring
+fstream cwchar
 fstream filesystem
 fstream initializer_list
 fstream iosfwd
@@ -420,11 +424,13 @@ iomanip istream
 iomanip version
 ios atomic
 ios cctype
+ios clocale
 ios concepts
 ios cstddef
 ios cstdint
 ios cstdlib
 ios cstring
+ios cwchar
 ios initializer_list
 ios iosfwd
 ios limits
@@ -496,6 +502,7 @@ list version
 locale atomic
 locale cctype
 locale cerrno
+locale clocale
 locale concepts
 locale cstdarg
 locale cstddef
@@ -504,6 +511,7 @@ locale cstdio
 locale cstdlib
 locale cstring
 locale ctime
+locale cwchar
 locale initializer_list
 locale ios
 locale iosfwd
@@ -681,12 +689,14 @@ ratio type_traits
 ratio version
 regex atomic
 regex cctype
+regex clocale
 regex compare
 regex concepts
 regex cstddef
 regex cstdint
 regex cstdlib
 regex cstring
+regex cwchar
 regex deque
 regex initializer_list
 regex iosfwd

diff  --git a/libcxx/test/libcxx/transitive_includes/cxx11.csv b/libcxx/test/libcxx/transitive_includes/cxx11.csv
index e54fe47fddf9a..b69d828405fa5 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx11.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx11.csv
@@ -127,11 +127,13 @@ cmath type_traits
 cmath version
 codecvt atomic
 codecvt cctype
+codecvt clocale
 codecvt concepts
 codecvt cstddef
 codecvt cstdint
 codecvt cstdlib
 codecvt cstring
+codecvt cwchar
 codecvt initializer_list
 codecvt iosfwd
 codecvt limits
@@ -354,12 +356,14 @@ forward_list typeinfo
 forward_list version
 fstream atomic
 fstream cctype
+fstream clocale
 fstream concepts
 fstream cstddef
 fstream cstdint
 fstream cstdio
 fstream cstdlib
 fstream cstring
+fstream cwchar
 fstream filesystem
 fstream initializer_list
 fstream iosfwd
@@ -420,11 +424,13 @@ iomanip istream
 iomanip version
 ios atomic
 ios cctype
+ios clocale
 ios concepts
 ios cstddef
 ios cstdint
 ios cstdlib
 ios cstring
+ios cwchar
 ios initializer_list
 ios iosfwd
 ios limits
@@ -496,6 +502,7 @@ list version
 locale atomic
 locale cctype
 locale cerrno
+locale clocale
 locale concepts
 locale cstdarg
 locale cstddef
@@ -504,6 +511,7 @@ locale cstdio
 locale cstdlib
 locale cstring
 locale ctime
+locale cwchar
 locale initializer_list
 locale ios
 locale iosfwd
@@ -682,12 +690,14 @@ ratio type_traits
 ratio version
 regex atomic
 regex cctype
+regex clocale
 regex compare
 regex concepts
 regex cstddef
 regex cstdint
 regex cstdlib
 regex cstring
+regex cwchar
 regex deque
 regex initializer_list
 regex iosfwd

diff  --git a/libcxx/test/libcxx/transitive_includes/cxx14.csv b/libcxx/test/libcxx/transitive_includes/cxx14.csv
index 3de4afa8922a9..6d029a7b685ea 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx14.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx14.csv
@@ -127,11 +127,13 @@ cmath type_traits
 cmath version
 codecvt atomic
 codecvt cctype
+codecvt clocale
 codecvt concepts
 codecvt cstddef
 codecvt cstdint
 codecvt cstdlib
 codecvt cstring
+codecvt cwchar
 codecvt initializer_list
 codecvt iosfwd
 codecvt limits
@@ -356,12 +358,14 @@ forward_list typeinfo
 forward_list version
 fstream atomic
 fstream cctype
+fstream clocale
 fstream concepts
 fstream cstddef
 fstream cstdint
 fstream cstdio
 fstream cstdlib
 fstream cstring
+fstream cwchar
 fstream filesystem
 fstream initializer_list
 fstream iosfwd
@@ -422,11 +426,13 @@ iomanip istream
 iomanip version
 ios atomic
 ios cctype
+ios clocale
 ios concepts
 ios cstddef
 ios cstdint
 ios cstdlib
 ios cstring
+ios cwchar
 ios initializer_list
 ios iosfwd
 ios limits
@@ -498,6 +504,7 @@ list version
 locale atomic
 locale cctype
 locale cerrno
+locale clocale
 locale concepts
 locale cstdarg
 locale cstddef
@@ -506,6 +513,7 @@ locale cstdio
 locale cstdlib
 locale cstring
 locale ctime
+locale cwchar
 locale initializer_list
 locale ios
 locale iosfwd
@@ -684,12 +692,14 @@ ratio type_traits
 ratio version
 regex atomic
 regex cctype
+regex clocale
 regex compare
 regex concepts
 regex cstddef
 regex cstdint
 regex cstdlib
 regex cstring
+regex cwchar
 regex deque
 regex initializer_list
 regex iosfwd

diff  --git a/libcxx/test/libcxx/transitive_includes/cxx17.csv b/libcxx/test/libcxx/transitive_includes/cxx17.csv
index 3de4afa8922a9..6d029a7b685ea 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx17.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx17.csv
@@ -127,11 +127,13 @@ cmath type_traits
 cmath version
 codecvt atomic
 codecvt cctype
+codecvt clocale
 codecvt concepts
 codecvt cstddef
 codecvt cstdint
 codecvt cstdlib
 codecvt cstring
+codecvt cwchar
 codecvt initializer_list
 codecvt iosfwd
 codecvt limits
@@ -356,12 +358,14 @@ forward_list typeinfo
 forward_list version
 fstream atomic
 fstream cctype
+fstream clocale
 fstream concepts
 fstream cstddef
 fstream cstdint
 fstream cstdio
 fstream cstdlib
 fstream cstring
+fstream cwchar
 fstream filesystem
 fstream initializer_list
 fstream iosfwd
@@ -422,11 +426,13 @@ iomanip istream
 iomanip version
 ios atomic
 ios cctype
+ios clocale
 ios concepts
 ios cstddef
 ios cstdint
 ios cstdlib
 ios cstring
+ios cwchar
 ios initializer_list
 ios iosfwd
 ios limits
@@ -498,6 +504,7 @@ list version
 locale atomic
 locale cctype
 locale cerrno
+locale clocale
 locale concepts
 locale cstdarg
 locale cstddef
@@ -506,6 +513,7 @@ locale cstdio
 locale cstdlib
 locale cstring
 locale ctime
+locale cwchar
 locale initializer_list
 locale ios
 locale iosfwd
@@ -684,12 +692,14 @@ ratio type_traits
 ratio version
 regex atomic
 regex cctype
+regex clocale
 regex compare
 regex concepts
 regex cstddef
 regex cstdint
 regex cstdlib
 regex cstring
+regex cwchar
 regex deque
 regex initializer_list
 regex iosfwd

diff  --git a/libcxx/test/libcxx/transitive_includes/cxx20.csv b/libcxx/test/libcxx/transitive_includes/cxx20.csv
index 81a3b0c8d7b50..c3a309a709520 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx20.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx20.csv
@@ -134,11 +134,13 @@ cmath type_traits
 cmath version
 codecvt atomic
 codecvt cctype
+codecvt clocale
 codecvt concepts
 codecvt cstddef
 codecvt cstdint
 codecvt cstdlib
 codecvt cstring
+codecvt cwchar
 codecvt initializer_list
 codecvt iosfwd
 codecvt limits
@@ -363,12 +365,14 @@ forward_list typeinfo
 forward_list version
 fstream atomic
 fstream cctype
+fstream clocale
 fstream concepts
 fstream cstddef
 fstream cstdint
 fstream cstdio
 fstream cstdlib
 fstream cstring
+fstream cwchar
 fstream filesystem
 fstream initializer_list
 fstream iosfwd
@@ -428,11 +432,13 @@ iomanip istream
 iomanip version
 ios atomic
 ios cctype
+ios clocale
 ios concepts
 ios cstddef
 ios cstdint
 ios cstdlib
 ios cstring
+ios cwchar
 ios initializer_list
 ios iosfwd
 ios limits
@@ -504,6 +510,7 @@ list version
 locale atomic
 locale cctype
 locale cerrno
+locale clocale
 locale concepts
 locale cstdarg
 locale cstddef
@@ -512,6 +519,7 @@ locale cstdio
 locale cstdlib
 locale cstring
 locale ctime
+locale cwchar
 locale initializer_list
 locale ios
 locale iosfwd
@@ -690,12 +698,14 @@ ratio type_traits
 ratio version
 regex atomic
 regex cctype
+regex clocale
 regex compare
 regex concepts
 regex cstddef
 regex cstdint
 regex cstdlib
 regex cstring
+regex cwchar
 regex deque
 regex initializer_list
 regex iosfwd

diff  --git a/libcxx/test/libcxx/transitive_includes/cxx2b.csv b/libcxx/test/libcxx/transitive_includes/cxx2b.csv
index c444ff9a99dbc..7b82ae1016a5e 100644
--- a/libcxx/test/libcxx/transitive_includes/cxx2b.csv
+++ b/libcxx/test/libcxx/transitive_includes/cxx2b.csv
@@ -84,10 +84,12 @@ chrono version
 cinttypes cstdint
 cmath version
 codecvt cctype
+codecvt clocale
 codecvt cstddef
 codecvt cstdint
 codecvt cstdlib
 codecvt cstring
+codecvt cwchar
 codecvt mutex
 codecvt string
 codecvt version
@@ -242,11 +244,13 @@ forward_list stdexcept
 forward_list tuple
 forward_list version
 fstream cctype
+fstream clocale
 fstream cstddef
 fstream cstdint
 fstream cstdio
 fstream cstdlib
 fstream cstring
+fstream cwchar
 fstream filesystem
 fstream initializer_list
 fstream istream
@@ -290,10 +294,12 @@ initializer_list cstddef
 iomanip istream
 iomanip version
 ios cctype
+ios clocale
 ios cstddef
 ios cstdint
 ios cstdlib
 ios cstring
+ios cwchar
 ios iosfwd
 ios mutex
 ios string
@@ -337,12 +343,14 @@ list tuple
 list version
 locale cctype
 locale cerrno
+locale clocale
 locale cstddef
 locale cstdint
 locale cstdio
 locale cstdlib
 locale cstring
 locale ctime
+locale cwchar
 locale initializer_list
 locale ios
 locale iosfwd
@@ -460,11 +468,13 @@ ratio climits
 ratio cstdint
 ratio version
 regex cctype
+regex clocale
 regex compare
 regex cstddef
 regex cstdint
 regex cstdlib
 regex cstring
+regex cwchar
 regex deque
 regex initializer_list
 regex limits

diff  --git a/libcxx/utils/data/ignore_format.txt b/libcxx/utils/data/ignore_format.txt
index a1c7869a797b0..24cfc241fbd9f 100644
--- a/libcxx/utils/data/ignore_format.txt
+++ b/libcxx/utils/data/ignore_format.txt
@@ -236,8 +236,6 @@ libcxx/include/__bit/popcount.h
 libcxx/include/__bit_reference
 libcxx/include/__bit/rotate.h
 libcxx/include/bitset
-libcxx/include/__bsd_locale_defaults.h
-libcxx/include/__bsd_locale_fallbacks.h
 libcxx/include/cctype
 libcxx/include/chrono
 libcxx/include/__chrono/calendar.h
@@ -455,6 +453,9 @@ libcxx/include/limits.h
 libcxx/include/list
 libcxx/include/__locale
 libcxx/include/locale
+libcxx/include/__locale_dir/locale_base_api/bsd_locale_defaults.h
+libcxx/include/__locale_dir/locale_base_api/bsd_locale_fallbacks.h
+libcxx/include/__locale_dir/locale_base_api/locale_guard.h
 libcxx/include/locale.h
 libcxx/include/map
 libcxx/include/math.h

diff  --git a/libcxx/utils/generate_header_tests.py b/libcxx/utils/generate_header_tests.py
index f9f9ddc4cfdc7..d2f18883f8abe 100755
--- a/libcxx/utils/generate_header_tests.py
+++ b/libcxx/utils/generate_header_tests.py
@@ -64,7 +64,7 @@
 }
 
 private_headers_still_public_in_modules = [
-    '__assert', '__bsd_locale_defaults.h', '__bsd_locale_fallbacks.h', '__config',
+    '__assert', '__config',
     '__config_site.in', '__debug', '__hash_table',
     '__threading_support', '__tree', '__undef_macros', '__verbose_abort'
 ]

diff  --git a/libcxx/utils/generate_iwyu_mapping.py b/libcxx/utils/generate_iwyu_mapping.py
index 16db78df6502f..c092bd6a53ae1 100644
--- a/libcxx/utils/generate_iwyu_mapping.py
+++ b/libcxx/utils/generate_iwyu_mapping.py
@@ -30,7 +30,7 @@ def generate_map(include):
             c_headers.append(i.name)
 
     result = []
-    temporary_mappings = {}
+    temporary_mappings = {'__locale_dir' : 'locale'}
     for i in detail_directories:
         public_header = temporary_mappings.get(i, i.lstrip('_'))
         result.append(f'{generate(f"@<{i}/.*>", public_header)},')
@@ -41,8 +41,6 @@ def generate_map(include):
         elif i == '__availability': continue
         elif i == '__bit_reference': continue
         elif i == '__bits': public = ['bits']
-        elif i == '__bsd_locale_defaults.h': continue
-        elif i == '__bsd_locale_fallbacks.h': continue
         elif i == '__config_site.in': continue
         elif i == '__config': continue
         elif i == '__debug': continue


        


More information about the libcxx-commits mailing list