[libc++] Add a libc++ configuration that does not support localization
authorLouis Dionne <ldionne@apple.com>
Fri, 9 Oct 2020 19:31:05 +0000 (15:31 -0400)
committerLouis Dionne <ldionne@apple.com>
Tue, 27 Oct 2020 18:56:30 +0000 (14:56 -0400)
When porting libc++ to embedded systems, it can be useful to drop support
for localization, which these systems don't implement or care about.

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

117 files changed:
libcxx/CMakeLists.txt
libcxx/cmake/caches/Generic-no-localization.cmake [new file with mode: 0644]
libcxx/include/__config_site.in
libcxx/include/__locale
libcxx/include/complex
libcxx/include/filesystem
libcxx/src/CMakeLists.txt
libcxx/test/libcxx/depr/depr.str.strstreams/version.pass.cpp
libcxx/test/libcxx/double_include.sh.cpp
libcxx/test/libcxx/experimental/memory/memory.resource.aliases/header_regex_libcpp_version.pass.cpp
libcxx/test/libcxx/fuzzing/regex.pass.cpp
libcxx/test/libcxx/input.output/file.streams/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/input.output/iostream.format/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/input.output/iostream.objects/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/input.output/iostreams.base/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/input.output/stream.buffers/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/input.output/string.streams/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/localization/lit.local.cfg [new file with mode: 0644]
libcxx/test/libcxx/min_max_macros.compile.pass.cpp
libcxx/test/libcxx/modules/cinttypes_exports.compile.pass.cpp
libcxx/test/libcxx/modules/clocale_exports.compile.pass.cpp
libcxx/test/libcxx/modules/cstdint_exports.compile.pass.cpp
libcxx/test/libcxx/modules/inttypes_h_exports.compile.pass.cpp
libcxx/test/libcxx/modules/stdint_h_exports.compile.pass.cpp
libcxx/test/libcxx/modules/stds_include.sh.cpp
libcxx/test/libcxx/no_assert_include.compile.pass.cpp
libcxx/test/std/depr/depr.ios.members/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/depr/depr.str.strstreams/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/diagnostics/syserr/syserr.errcode/syserr.errcode.nonmembers/stream_inserter.pass.cpp
libcxx/test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp
libcxx/test/std/experimental/iterator/ostream.joiner/ostream.joiner.creation/make_ostream_joiner.pass.cpp
libcxx/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp
libcxx/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp
libcxx/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp
libcxx/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp
libcxx/test/std/experimental/memory/memory.resource.aliases/header_regex_synop.pass.cpp
libcxx/test/std/input.output/file.streams/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.assign/source.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.concat.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.construct/source.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/generic_string_alloc.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/named_overloads.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.native.obs/named_overloads.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.member/path.native.obs/string_alloc.pass.cpp
libcxx/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
libcxx/test/std/input.output/input.output.general/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/iostream.format/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/iostream.forward/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/iostream.objects/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/iostreams.base/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/iostreams.requirements/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/stream.buffers/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/input.output/string.streams/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/iterators/stream.iterators/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/language.support/support.limits/support.limits.general/iomanip.version.pass.cpp
libcxx/test/std/language.support/support.limits/support.limits.general/istream.version.pass.cpp
libcxx/test/std/language.support/support.limits/support.limits.general/locale.version.pass.cpp
libcxx/test/std/language.support/support.limits/support.limits.general/ostream.version.pass.cpp
libcxx/test/std/language.support/support.limits/support.limits.general/regex.version.pass.cpp
libcxx/test/std/localization/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/namespace/addressable_functions.sh.cpp
libcxx/test/std/numerics/complex.number/complex.ops/stream_input.pass.cpp
libcxx/test/std/numerics/complex.number/complex.ops/stream_output.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.disc/ctor_result_type.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.disc/ctor_sseq.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.disc/io.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.ibits/ctor_result_type.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.ibits/ctor_sseq.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.ibits/io.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/ctor_result_type.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/ctor_sseq.pass.cpp
libcxx/test/std/numerics/rand/rand.adapt/rand.adapt.shuf/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bernoulli/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/eval.PR44847.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.bin/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.geo/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.bern/rand.dist.bern.negbin/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.norm/rand.dist.norm.cauchy/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.norm/rand.dist.norm.chisq/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.norm/rand.dist.norm.f/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.norm/rand.dist.norm.lognormal/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.norm/rand.dist.norm.normal/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.norm/rand.dist.norm.t/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.exp/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.extreme/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.gamma/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.poisson/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.pois/rand.dist.pois.weibull/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.samp/rand.dist.samp.discrete/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.samp/rand.dist.samp.pconst/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.samp/rand.dist.samp.plinear/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.int/io.pass.cpp
libcxx/test/std/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.real/io.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.lcong/ctor_result_type.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.lcong/io.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.mers/ctor_result_type.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.mers/ctor_sseq.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.mers/io.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.sub/ctor_result_type.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.sub/ctor_sseq.pass.cpp
libcxx/test/std/numerics/rand/rand.eng/rand.eng.sub/io.pass.cpp
libcxx/test/std/re/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/strings/basic.string/string.nonmembers/string.io/lit.local.cfg [new file with mode: 0644]
libcxx/test/std/strings/string.view/string.view.io/stream_insert.pass.cpp
libcxx/test/std/strings/string.view/string.view.nonmem/quoted.pass.cpp
libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/stream.pass.cpp
libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.fail.cpp
libcxx/test/std/utilities/memory/unique.ptr/unique.ptr.special/io.pass.cpp
libcxx/test/std/utilities/memory/util.smartptr/util.smartptr.shared/util.smartptr.shared.io/io.pass.cpp
libcxx/test/std/utilities/template.bitset/bitset.operators/stream_in.pass.cpp
libcxx/test/std/utilities/template.bitset/bitset.operators/stream_out.pass.cpp
libcxx/test/std/utilities/time/time.cal/time.cal.day/time.cal.day.nonmembers/streaming.pass.cpp
libcxx/utils/ci/buildkite-pipeline.yml
libcxx/utils/ci/run-buildbot.sh
libcxx/utils/generate_feature_test_macro_components.py
libcxx/utils/libcxx/test/features.py

index 015a359..ee8ba45 100644 (file)
@@ -115,6 +115,12 @@ option(LIBCXX_ENABLE_RANDOM_DEVICE
    a source of randomness, such as some embedded platforms. When this is not
    supported, most of <random> will still be available, but std::random_device
    will not." ON)
+option(LIBCXX_ENABLE_LOCALIZATION
+  "Whether to include support for localization in the library. Disabling
+   localization can be useful when porting to platforms that don't support
+   the C locale API (e.g. embedded). When localization is not supported,
+   several parts of the library will be disabled: <iostream>, <regex>, <locale>
+   will be completely unusable, and other parts may be only partly available." ON)
 option(LIBCXX_TEST_GDB_PRETTY_PRINTERS "Test gdb pretty printers." OFF)
 set(LIBCXX_TEST_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/test/configs/legacy.cfg.in" CACHE STRING
     "The Lit testing configuration to use when running the tests.")
@@ -843,6 +849,7 @@ config_define_if(LIBCXX_HAS_MUSL_LIBC _LIBCPP_HAS_MUSL_LIBC)
 config_define_if(LIBCXX_NO_VCRUNTIME _LIBCPP_NO_VCRUNTIME)
 config_define_if(LIBCXX_ENABLE_PARALLEL_ALGORITHMS _LIBCPP_HAS_PARALLEL_ALGORITHMS)
 config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
+config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
 
 if (LIBCXX_ABI_DEFINES)
   set(abi_defines)
diff --git a/libcxx/cmake/caches/Generic-no-localization.cmake b/libcxx/cmake/caches/Generic-no-localization.cmake
new file mode 100644 (file)
index 0000000..79d6b44
--- /dev/null
@@ -0,0 +1 @@
+set(LIBCXX_ENABLE_LOCALIZATION OFF CACHE BOOL "")
index 908fb1e..8141d3c 100644 (file)
@@ -33,6 +33,7 @@
 #cmakedefine _LIBCPP_ABI_NAMESPACE @_LIBCPP_ABI_NAMESPACE@
 #cmakedefine _LIBCPP_HAS_PARALLEL_ALGORITHMS
 #cmakedefine _LIBCPP_HAS_NO_RANDOM_DEVICE
+#cmakedefine _LIBCPP_HAS_NO_LOCALIZATION
 
 @_LIBCPP_ABI_DEFINES@
 
index 4721a00..48e7b64 100644 (file)
 #define _LIBCPP___LOCALE
 
 #include <__config>
+
+#if defined(_LIBCPP_HAS_NO_LOCALIZATION)
+#   error "Localization is not supported by this configuration of libc++"
+#endif
+
 #include <string>
 #include <memory>
 #include <utility>
index ec35f8a..ed84cd4 100644 (file)
@@ -236,9 +236,12 @@ template<class T> complex<T> tanh (const complex<T>&);
 #include <stdexcept>
 #include <cmath>
 #include <iosfwd>
-#include <sstream>
 #include <version>
 
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
+#   include <sstream> // for std::basic_ostringstream
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
 #endif
@@ -1430,6 +1433,7 @@ operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
     return __is;
 }
 
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
 template<class _Tp, class _CharT, class _Traits>
 basic_ostream<_CharT, _Traits>&
 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
@@ -1441,6 +1445,7 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
     __s << '(' << __x.real() << ',' << __x.imag() << ')';
     return __os << __s.str();
 }
+#endif // !_LIBCPP_HAS_NO_LOCALIZATION
 
 #if _LIBCPP_STD_VER > 11
 // Literal suffix for complex number literals [complex.literals]
index 86fff6c..5783ed3 100644 (file)
 #include <chrono>
 #include <iterator>
 #include <iosfwd>
-#include <locale>
 #include <memory>
 #include <stack>
 #include <string>
 #include <system_error>
 #include <utility>
-#include <iomanip> // for quoted
 #include <string_view>
 #include <version>
 
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
+# include <locale>
+# include <iomanip> // for quoted
+#endif
+
 #include <__debug>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -662,6 +665,10 @@ template <class _Tp>
 struct __is_pathable<_Tp, false, false, true> : __is_pathable_iter<_Tp> {};
 
 template <class _ECharT>
+struct _PathCVT;
+
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
+template <class _ECharT>
 struct _PathCVT {
   static_assert(__can_convert_char<_ECharT>::value,
                 "Char type not convertible");
@@ -703,6 +710,7 @@ struct _PathCVT {
                    _Traits::__range_end(__s));
   }
 };
+#endif // !_LIBCPP_HAS_NO_LOCALIZATION
 
 template <>
 struct _PathCVT<char> {
@@ -779,12 +787,14 @@ public:
     _PathCVT<_ItVal>::__append_range(__pn_, __first, __last);
   }
 
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
   // TODO Implement locale conversions.
   template <class _Source, class = _EnableIfPathable<_Source, void> >
   path(const _Source& __src, const locale& __loc, format = format::auto_format);
   template <class _InputIt>
   path(_InputIt __first, _InputIt _last, const locale& __loc,
        format = format::auto_format);
+#endif
 
   _LIBCPP_INLINE_VISIBILITY
   ~path() = default;
@@ -983,6 +993,10 @@ public:
 
   _LIBCPP_INLINE_VISIBILITY operator string_type() const { return __pn_; }
 
+  _LIBCPP_INLINE_VISIBILITY std::string string() const { return __pn_; }
+  _LIBCPP_INLINE_VISIBILITY std::string u8string() const { return __pn_; }
+
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
   template <class _ECharT, class _Traits = char_traits<_ECharT>,
             class _Allocator = allocator<_ECharT> >
   basic_string<_ECharT, _Traits, _Allocator>
@@ -995,19 +1009,22 @@ public:
     return __s;
   }
 
-  _LIBCPP_INLINE_VISIBILITY std::string string() const { return __pn_; }
   _LIBCPP_INLINE_VISIBILITY std::wstring wstring() const {
     return string<wchar_t>();
   }
-  _LIBCPP_INLINE_VISIBILITY std::string u8string() const { return __pn_; }
   _LIBCPP_INLINE_VISIBILITY std::u16string u16string() const {
     return string<char16_t>();
   }
   _LIBCPP_INLINE_VISIBILITY std::u32string u32string() const {
     return string<char32_t>();
   }
+#endif
 
   // generic format observers
+  std::string generic_string() const { return __pn_; }
+  std::string generic_u8string() const { return __pn_; }
+
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
   template <class _ECharT, class _Traits = char_traits<_ECharT>,
             class _Allocator = allocator<_ECharT> >
   basic_string<_ECharT, _Traits, _Allocator>
@@ -1015,11 +1032,10 @@ public:
     return string<_ECharT, _Traits, _Allocator>(__a);
   }
 
-  std::string generic_string() const { return __pn_; }
   std::wstring generic_wstring() const { return string<wchar_t>(); }
-  std::string generic_u8string() const { return __pn_; }
   std::u16string generic_u16string() const { return string<char16_t>(); }
   std::u32string generic_u32string() const { return string<char32_t>(); }
+#endif
 
 private:
   int __compare(__string_view) const;
@@ -1123,6 +1139,7 @@ public:
   iterator begin() const;
   iterator end() const;
 
+#if !defined(_LIBCPP_HAS_NO_LOCALIZATION)
   template <class _CharT, class _Traits>
   _LIBCPP_INLINE_VISIBILITY friend
       typename enable_if<is_same<_CharT, char>::value &&
@@ -1151,6 +1168,7 @@ public:
     __p = __tmp;
     return __is;
   }
+#endif // !_LIBCPP_HAS_NO_LOCALIZATION
 
   friend _LIBCPP_INLINE_VISIBILITY bool operator==(const path& __lhs, const path& __rhs) noexcept {
     return __lhs.compare(__rhs) == 0;
index 95dd520..d0e7255 100644 (file)
@@ -19,20 +19,15 @@ set(LIBCXX_SOURCES
   include/atomic_support.h
   include/config_elast.h
   include/refstring.h
-  ios.cpp
-  iostream.cpp
-  locale.cpp
   memory.cpp
   mutex.cpp
   mutex_destructor.cpp
   new.cpp
   optional.cpp
   random_shuffle.cpp
-  regex.cpp
   shared_mutex.cpp
   stdexcept.cpp
   string.cpp
-  strstream.cpp
   support/runtime/exception_fallback.ipp
   support/runtime/exception_glibcxx.ipp
   support/runtime/exception_libcxxabi.ipp
@@ -66,6 +61,16 @@ if (LIBCXX_ENABLE_RANDOM_DEVICE)
     )
 endif()
 
+if (LIBCXX_ENABLE_LOCALIZATION)
+  list(APPEND LIBCXX_SOURCES
+    ios.cpp
+    iostream.cpp
+    locale.cpp
+    regex.cpp
+    strstream.cpp
+    )
+endif()
+
 if(WIN32)
   list(APPEND LIBCXX_SOURCES
     support/win32/locale_win32.cpp
index 59279f7..ac72689 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <strstream>
 
 #include <strstream>
index 42a437b..8384371 100644 (file)
@@ -49,7 +49,6 @@
 #include <climits>
 #include <clocale>
 #include <cmath>
-#include <codecvt>
 #include <compare>
 #include <complex>
 #include <complex.h>
 #include <filesystem>
 #include <float.h>
 #include <forward_list>
-#include <fstream>
 #include <functional>
 #ifndef _LIBCPP_HAS_NO_THREADS
 #include <future>
 #endif
 #include <initializer_list>
 #include <inttypes.h>
-#include <iomanip>
-#include <ios>
 #include <iosfwd>
-#include <iostream>
-#include <istream>
 #include <iterator>
 #include <limits>
 #include <limits.h>
 #include <list>
-#include <locale>
 #include <locale.h>
 #include <map>
 #include <math.h>
 #include <numbers>
 #include <numeric>
 #include <optional>
-#include <ostream>
 #include <queue>
 #include <random>
 #include <ratio>
-#include <regex>
 #include <scoped_allocator>
 #include <set>
 #include <setjmp.h>
 #include <shared_mutex>
 #endif
 #include <span>
-#include <sstream>
 #include <stack>
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <streambuf>
 #include <string>
 #include <string.h>
 #include <string_view>
-#include <strstream>
 #include <system_error>
 #include <tgmath.h>
 #ifndef _LIBCPP_HAS_NO_THREADS
 #include <wchar.h>
 #include <wctype.h>
 
+#ifndef _LIBCPP_HAS_NO_LOCALIZATION
+#   include <codecvt>
+#   include <fstream>
+#   include <iomanip>
+#   include <ios>
+#   include <iostream>
+#   include <istream>
+#   include <locale>
+#   include <ostream>
+#   include <regex>
+#   include <sstream>
+#   include <streambuf>
+#   include <strstream>
+#   if __cplusplus >= 201103L
+#       include <experimental/regex>
+#   endif
+#endif
+
 // experimental headers
 #if __cplusplus >= 201103L
 #include <experimental/algorithm>
 #include <experimental/map>
 #include <experimental/memory_resource>
 #include <experimental/propagate_const>
-#include <experimental/regex>
 #include <experimental/simd>
 #include <experimental/set>
 #include <experimental/string>
index b027dd0..fca7a9a 100644 (file)
@@ -8,6 +8,7 @@
 
 // UNSUPPORTED: c++03, c++11
 // UNSUPPORTED: no-exceptions
+// UNSUPPORTED: libcpp-has-no-localization
 
 #include <cstddef>
 #include <cstdint>
diff --git a/libcxx/test/libcxx/input.output/file.streams/lit.local.cfg b/libcxx/test/libcxx/input.output/file.streams/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
diff --git a/libcxx/test/libcxx/input.output/iostream.format/lit.local.cfg b/libcxx/test/libcxx/input.output/iostream.format/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
diff --git a/libcxx/test/libcxx/input.output/iostream.objects/lit.local.cfg b/libcxx/test/libcxx/input.output/iostream.objects/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
diff --git a/libcxx/test/libcxx/input.output/iostreams.base/lit.local.cfg b/libcxx/test/libcxx/input.output/iostreams.base/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
diff --git a/libcxx/test/libcxx/input.output/stream.buffers/lit.local.cfg b/libcxx/test/libcxx/input.output/stream.buffers/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
diff --git a/libcxx/test/libcxx/input.output/string.streams/lit.local.cfg b/libcxx/test/libcxx/input.output/string.streams/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
diff --git a/libcxx/test/libcxx/localization/lit.local.cfg b/libcxx/test/libcxx/localization/lit.local.cfg
new file mode 100644 (file)
index 0000000..1fc6b79
--- /dev/null
@@ -0,0 +1,4 @@
+# Load the same local configuration as the corresponding one in libcxx/test/std
+import os
+localConfig = os.path.realpath(__file__).replace('/test/libcxx/', '/test/std/')
+config.load_from_path(localConfig, lit_config)
index 9e9edb8..3347f6f 100644 (file)
@@ -61,8 +61,6 @@ TEST_MACROS();
 TEST_MACROS();
 #include <cmath>
 TEST_MACROS();
-#include <codecvt>
-TEST_MACROS();
 #include <complex>
 TEST_MACROS();
 #include <complex.h>
@@ -109,8 +107,6 @@ TEST_MACROS();
 TEST_MACROS();
 #include <forward_list>
 TEST_MACROS();
-#include <fstream>
-TEST_MACROS();
 #include <functional>
 TEST_MACROS();
 #ifndef _LIBCPP_HAS_NO_THREADS
@@ -121,16 +117,8 @@ TEST_MACROS();
 TEST_MACROS();
 #include <inttypes.h>
 TEST_MACROS();
-#include <iomanip>
-TEST_MACROS();
-#include <ios>
-TEST_MACROS();
 #include <iosfwd>
 TEST_MACROS();
-#include <iostream>
-TEST_MACROS();
-#include <istream>
-TEST_MACROS();
 #include <iterator>
 TEST_MACROS();
 #include <limits>
@@ -139,8 +127,6 @@ TEST_MACROS();
 TEST_MACROS();
 #include <list>
 TEST_MACROS();
-#include <locale>
-TEST_MACROS();
 #include <locale.h>
 TEST_MACROS();
 #include <map>
@@ -159,16 +145,12 @@ TEST_MACROS();
 TEST_MACROS();
 #include <optional>
 TEST_MACROS();
-#include <ostream>
-TEST_MACROS();
 #include <queue>
 TEST_MACROS();
 #include <random>
 TEST_MACROS();
 #include <ratio>
 TEST_MACROS();
-#include <regex>
-TEST_MACROS();
 #include <scoped_allocator>
 TEST_MACROS();
 #include <set>
@@ -181,8 +163,6 @@ TEST_MACROS();
 #endif
 #include <span>
 TEST_MACROS();
-#include <sstream>
-TEST_MACROS();
 #include <stack>
 TEST_MACROS();
 #include <stdbool.h>
@@ -197,16 +177,12 @@ TEST_MACROS();
 TEST_MACROS();
 #include <stdlib.h>
 TEST_MACROS();
-#include <streambuf>
-TEST_MACROS();
 #include <string>
 TEST_MACROS();
 #include <string.h>
 TEST_MACROS();
 #include <string_view>
 TEST_MACROS();
-#include <strstream>
-TEST_MACROS();
 #include <system_error>
 TEST_MACROS();
 #include <tgmath.h>
@@ -240,6 +216,37 @@ TEST_MACROS();
 #include <wctype.h>
 TEST_MACROS();
 
+#ifndef _LIBCPP_HAS_NO_LOCALIZATION
+#   include <codecvt>
+    TEST_MACROS();
+#   include <fstream>
+    TEST_MACROS();
+#   include <iomanip>
+    TEST_MACROS();
+#   include <ios>
+    TEST_MACROS();
+#   include <iostream>
+    TEST_MACROS();
+#   include <istream>
+    TEST_MACROS();
+#   include <locale>
+    TEST_MACROS();
+#   include <ostream>
+    TEST_MACROS();
+#   include <regex>
+    TEST_MACROS();
+#   include <sstream>
+    TEST_MACROS();
+#   include <streambuf>
+    TEST_MACROS();
+#   include <strstream>
+    TEST_MACROS();
+#   if __cplusplus >= 201103L
+#       include <experimental/regex>
+        TEST_MACROS();
+#   endif
+#endif
+
 // experimental headers
 #if __cplusplus >= 201103L
 #include <experimental/algorithm>
@@ -262,8 +269,6 @@ TEST_MACROS();
 TEST_MACROS();
 #include <experimental/propagate_const>
 TEST_MACROS();
-#include <experimental/regex>
-TEST_MACROS();
 #include <experimental/set>
 TEST_MACROS();
 #include <experimental/string>
index 57a5ba5..ec5c8de 100644 (file)
 // are not modular
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
-// FIXME: The <atomic> header is not supported for single-threaded systems,
-// but still gets built as part of the 'std' module, which breaks the build.
-// XFAIL: libcpp-has-no-threads
+// Some headers are not available when these features are disabled, but they
+// still get built as part of the 'std' module, which breaks the build.
+// UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // REQUIRES: modules-support
 // ADDITIONAL_COMPILE_FLAGS: -fmodules
index 9220f8e..a460c6e 100644 (file)
 // are not modular
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
-// FIXME: The <atomic> header is not supported for single-threaded systems,
-// but still gets built as part of the 'std' module, which breaks the build.
-// XFAIL: libcpp-has-no-threads
+// Some headers are not available when these features are disabled, but they
+// still get built as part of the 'std' module, which breaks the build.
+// UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // UNSUPPORTED: c++03
 
index 0887b59..c106bf6 100644 (file)
 // are not modular
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
-// FIXME: The <atomic> header is not supported for single-threaded systems,
-// but still gets built as part of the 'std' module, which breaks the build.
-// XFAIL: libcpp-has-no-threads
+// Some headers are not available when these features are disabled, but they
+// still get built as part of the 'std' module, which breaks the build.
+// UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // Test that <cstdint> re-exports <stdint.h>
 
index 0add4e1..59b0d62 100644 (file)
 // are not modular
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
-// FIXME: The <atomic> header is not supported for single-threaded systems,
-// but still gets built as part of the 'std' module, which breaks the build.
-// XFAIL: libcpp-has-no-threads
+// Some headers are not available when these features are disabled, but they
+// still get built as part of the 'std' module, which breaks the build.
+// UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // Test that intypes.h re-exports stdint.h
 
index b83e99b..830a251 100644 (file)
@@ -6,9 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
-// FIXME: The <atomic> header is not supported for single-threaded systems,
-// but still gets built as part of the 'std' module, which breaks the build.
-// XFAIL: libcpp-has-no-threads
+// Some headers are not available when these features are disabled, but they
+// still get built as part of the 'std' module, which breaks the build.
+// UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // Test that int8_t and the like are exported from stdint.h, not inttypes.h
 
index 12d2899..5235c7b 100644 (file)
 // are not modular
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
-// FIXME: The <atomic> header is not supported for single-threaded systems,
-// but still gets built as part of the 'std' module, which breaks the build.
-// XFAIL: libcpp-has-no-threads
+// Some headers are not available when these features are disabled, but they
+// still get built as part of the 'std' module, which breaks the build.
+// UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // REQUIRES: modules-support
 
index 3cb58cd..182a1f3 100644 (file)
@@ -39,7 +39,6 @@
 #include <climits>
 #include <clocale>
 #include <cmath>
-#include <codecvt>
 #include <compare>
 #include <complex>
 #include <complex.h>
 #include <filesystem>
 #include <float.h>
 #include <forward_list>
-#include <fstream>
 #include <functional>
 #ifndef _LIBCPP_HAS_NO_THREADS
 #include <future>
 #endif
 #include <initializer_list>
 #include <inttypes.h>
-#include <iomanip>
-#include <ios>
 #include <iosfwd>
-#include <iostream>
-#include <istream>
 #include <iterator>
 #include <limits>
 #include <limits.h>
 #include <list>
-#include <locale>
 #include <locale.h>
 #include <map>
 #include <math.h>
 #include <new>
 #include <numeric>
 #include <optional>
-#include <ostream>
 #include <queue>
 #include <random>
 #include <ratio>
-#include <regex>
 #include <scoped_allocator>
 #include <set>
 #include <setjmp.h>
 #include <shared_mutex>
 #endif
 #include <span>
-#include <sstream>
 #include <stack>
 #include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <streambuf>
 #include <string>
 #include <string.h>
 #include <string_view>
-#include <strstream>
 #include <system_error>
 #include <tgmath.h>
 #ifndef _LIBCPP_HAS_NO_THREADS
 #include <wchar.h>
 #include <wctype.h>
 
+#ifndef _LIBCPP_HAS_NO_LOCALIZATION
+#   include <codecvt>
+#   include <fstream>
+#   include <iomanip>
+#   include <ios>
+#   include <iostream>
+#   include <istream>
+#   include <locale>
+#   include <ostream>
+#   include <regex>
+#   include <sstream>
+#   include <streambuf>
+#   include <strstream>
+#   if __cplusplus >= 201103L
+#       include <experimental/regex>
+#   endif
+#endif
+
 // experimental headers
 #if __cplusplus >= 201103L
 #include <experimental/algorithm>
 #include <experimental/map>
 #include <experimental/memory_resource>
 #include <experimental/propagate_const>
-#include <experimental/regex>
 #include <experimental/simd>
 #include <experimental/set>
 #include <experimental/string>
diff --git a/libcxx/test/std/depr/depr.ios.members/lit.local.cfg b/libcxx/test/std/depr/depr.ios.members/lit.local.cfg
new file mode 100644 (file)
index 0000000..ebbd06e
--- /dev/null
@@ -0,0 +1,2 @@
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/depr/depr.str.strstreams/lit.local.cfg b/libcxx/test/std/depr/depr.str.strstreams/lit.local.cfg
new file mode 100644 (file)
index 0000000..ebbd06e
--- /dev/null
@@ -0,0 +1,2 @@
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
index 8f8dea1..faa67a4 100644 (file)
@@ -8,6 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 // UNSUPPORTED: c++03
+// UNSUPPORTED: libcpp-has-no-localization
 
 // <experimental/regex>
 
diff --git a/libcxx/test/std/input.output/file.streams/lit.local.cfg b/libcxx/test/std/input.output/file.streams/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
index 982a7a9..7c60ae2 100644 (file)
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 // UNSUPPORTED: c++03
+// UNSUPPORTED: libcpp-has-no-localization
 
 // <filesystem>
 
diff --git a/libcxx/test/std/input.output/input.output.general/lit.local.cfg b/libcxx/test/std/input.output/input.output.general/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/iostream.format/lit.local.cfg b/libcxx/test/std/input.output/iostream.format/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/iostream.forward/lit.local.cfg b/libcxx/test/std/input.output/iostream.forward/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/iostream.objects/lit.local.cfg b/libcxx/test/std/input.output/iostream.objects/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/iostreams.base/lit.local.cfg b/libcxx/test/std/input.output/iostreams.base/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/iostreams.requirements/lit.local.cfg b/libcxx/test/std/input.output/iostreams.requirements/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/stream.buffers/lit.local.cfg b/libcxx/test/std/input.output/stream.buffers/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/input.output/string.streams/lit.local.cfg b/libcxx/test/std/input.output/string.streams/lit.local.cfg
new file mode 100644 (file)
index 0000000..cebfbad
--- /dev/null
@@ -0,0 +1,3 @@
+# All non-trivial uses of iostreams require localization support
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/iterators/stream.iterators/lit.local.cfg b/libcxx/test/std/iterators/stream.iterators/lit.local.cfg
new file mode 100644 (file)
index 0000000..4d09041
--- /dev/null
@@ -0,0 +1,3 @@
+# stream iterators rely on the streams library, which requires localization
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
index 23378e0..0b1b4ea 100644 (file)
@@ -9,6 +9,8 @@
 // WARNING: This test was generated by generate_feature_test_macro_components.py
 // and should not be edited manually.
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <iomanip>
 
 // Test the feature test macros defined by <iomanip>
index 3d8fb7a..967173e 100644 (file)
@@ -9,6 +9,8 @@
 // WARNING: This test was generated by generate_feature_test_macro_components.py
 // and should not be edited manually.
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <istream>
 
 // Test the feature test macros defined by <istream>
index eeea539..4315634 100644 (file)
@@ -9,6 +9,8 @@
 // WARNING: This test was generated by generate_feature_test_macro_components.py
 // and should not be edited manually.
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <locale>
 
 // Test the feature test macros defined by <locale>
index d3ba258..bb07375 100644 (file)
@@ -9,6 +9,8 @@
 // WARNING: This test was generated by generate_feature_test_macro_components.py
 // and should not be edited manually.
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <ostream>
 
 // Test the feature test macros defined by <ostream>
index 66becad..a73d936 100644 (file)
@@ -9,6 +9,8 @@
 // WARNING: This test was generated by generate_feature_test_macro_components.py
 // and should not be edited manually.
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <regex>
 
 // Test the feature test macros defined by <regex>
diff --git a/libcxx/test/std/localization/lit.local.cfg b/libcxx/test/std/localization/lit.local.cfg
new file mode 100644 (file)
index 0000000..ed0331c
--- /dev/null
@@ -0,0 +1,3 @@
+# <locale> tests are obviously not supported when localization support is disabled
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
index 9b5e80e..de44ba4 100644 (file)
@@ -17,6 +17,9 @@
 // RUN: %{cxx} %t.tu1.o %t.tu2.o %{flags} %{link_flags} -o %t.exe
 // RUN: %{exec} %t.exe
 
+// The functions checked below come from <iostream> & friends
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <cassert>
 #include <ios>
 #include <istream>
index 5c78fe9..344caa2 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <complex>
 
 // template<class T, class charT, class traits>
index 690a16b..9d9f401 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <complex>
 
 // template<class T, class charT, class traits>
index c3f7812..68e5d8d 100644 (file)
@@ -13,6 +13,9 @@
 
 // explicit discard_block_engine(result_type s = default_seed);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 3cb9df5..2e59866 100644 (file)
@@ -13,6 +13,9 @@
 
 // template<class Sseq> explicit discard_block_engine(Sseq& q);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 9336b29..c5acba1 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class Engine, size_t p, size_t r>
index 27f408f..b54aa24 100644 (file)
@@ -13,6 +13,9 @@
 
 // explicit independent_bits_engine(result_type s = default_seed);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 37ca482..791ba3c 100644 (file)
@@ -13,6 +13,9 @@
 
 // template<class Sseq> explicit independent_bits_engine(Sseq& q);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 0fb967a..f7cc609 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class Engine, size_t w, class UIntType>
index e805538..b020229 100644 (file)
@@ -13,6 +13,9 @@
 
 // explicit shuffle_order_engine(result_type s = default_seed);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 22823ea..3ab141e 100644 (file)
@@ -13,6 +13,9 @@
 
 // template<class Sseq> explicit shuffle_order_engine(Sseq& q);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 6bf4c8a..2970c1a 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class Engine, size_t k>
index 875e501..c541274 100644 (file)
@@ -15,6 +15,9 @@
 
 // Test the fix for https://llvm.org/PR44847.
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <numeric>
 #include <vector>
index 7edf05f..accc6c3 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class IntType = int>
index 6cb22c8..c8b4722 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class IntType = int>
index e0e43d1..a8ca74c 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class IntType = int>
index 2f6bace..2873aef 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index 06d7b4e..8a2c380 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index 76d4a48..a6aca37 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index cd67c03..92abb3a 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index ae58744..fc136a3 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index 2d172dc..1e5e9f6 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index f634f3e..0cf3a5b 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index a3434d8..19ac0ea 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index ee9f20f..c5cb803 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index afd7713..e5e634a 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class IntType = int>
index 56b2527..06b3325 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index f4576e3..3b21092 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class IntType = int>
index 6256e59..7c761c0 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index 92f4d76..f01b38b 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index f3b921a..a52b253 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class _IntType = int>
index e5abad2..7935e6c 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class RealType = double>
index a273612..0d84604 100644 (file)
@@ -13,6 +13,9 @@
 
 // explicit linear_congruential_engine(result_type s = default_seed);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 6a93427..f9e9b2d 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template <class UIntType, UIntType a, UIntType c, UIntType m>
index a1f367f..be8ae17 100644 (file)
@@ -15,6 +15,9 @@
 
 // explicit mersenne_twister_engine(result_type s = default_seed);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 9c98e77..a820468 100644 (file)
@@ -15,6 +15,9 @@
 
 // template<class Sseq> explicit mersenne_twister_engine(Sseq& q);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 6cd1e34..cdb7163 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template <class UIntType, size_t w, size_t n, size_t m, size_t r,
index 0a4c536..b63d2e0 100644 (file)
@@ -13,6 +13,9 @@
 
 // explicit subtract_with_carry_engine(result_type s = default_seed);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index 08c7a3f..0a8d7e6 100644 (file)
@@ -13,6 +13,9 @@
 
 // template<class Sseq> explicit subtract_with_carry_engine(Sseq& q);
 
+// Serializing/deserializing the state of the RNG requires iostreams
+// UNSUPPORTED: libcpp-has-no-localization
+
 #include <random>
 #include <sstream>
 #include <cassert>
index d522284..472ed2d 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <random>
 
 // template<class UIntType, size_t w, size_t s, size_t r>
diff --git a/libcxx/test/std/re/lit.local.cfg b/libcxx/test/std/re/lit.local.cfg
new file mode 100644 (file)
index 0000000..a266474
--- /dev/null
@@ -0,0 +1,3 @@
+# Unfortunately, <regex> uses locales in regex_traits
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
diff --git a/libcxx/test/std/strings/basic.string/string.nonmembers/string.io/lit.local.cfg b/libcxx/test/std/strings/basic.string/string.nonmembers/string.io/lit.local.cfg
new file mode 100644 (file)
index 0000000..8f204af
--- /dev/null
@@ -0,0 +1,3 @@
+# These std::string functions require iostreams, which requires localization
+if 'libcpp-has-no-localization' in config.available_features:
+  config.unsupported = True
index c427e4a..8ba444d 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <string>
 
 // template<class charT, class traits, class Allocator>
index c70d342..3ad9ae2 100644 (file)
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 // UNSUPPORTED: c++03, c++11
+// UNSUPPORTED: libcpp-has-no-localization
 
 // <iomanip>
 
index 9f1f18d..f04a0eb 100644 (file)
@@ -5,8 +5,9 @@
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //===----------------------------------------------------------------------===//
-//
+
 // UNSUPPORTED: libcpp-has-no-threads
+// UNSUPPORTED: libcpp-has-no-localization
 
 // <thread>
 
index e63cf4e..583ca60 100644 (file)
@@ -6,8 +6,10 @@
 //
 //===----------------------------------------------------------------------===//
 
+// Because we don't have a functioning decltype in C++03
 // UNSUPPORTED: c++03
-//  Because we don't have a functioning decltype in C++03
+
+// UNSUPPORTED: libcpp-has-no-localization
 
 // <memory>
 
index dd1a9f7..d09e029 100644 (file)
@@ -9,6 +9,8 @@
 // UNSUPPORTED: c++03
 //  Because we don't have a functioning decltype in C++03
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // <memory>
 
 // unique_ptr
index 0127b75..e2667e5 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // test:
 
 // template <class charT, class traits, size_t N>
index 3ef0eb8..79621e2 100644 (file)
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: libcpp-has-no-localization
+
 // test:
 
 // template <class charT, class traits, size_t N>
index 2b1e224..d53c67c 100644 (file)
@@ -5,7 +5,9 @@
 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 //
 //===----------------------------------------------------------------------===//
+
 // UNSUPPORTED: c++03, c++11, c++14, c++17
+// UNSUPPORTED: libcpp-has-no-localization
 // XFAIL: *
 
 // <chrono>
index 3400083..925a944 100644 (file)
@@ -113,6 +113,13 @@ steps:
     agents:
       queue: "libcxx-builders"
 
+  - label: "No locale"
+    command: "libcxx/utils/ci/run-buildbot.sh generic-no-localization"
+    artifact_paths:
+      - "**/test-results.xml"
+    agents:
+      queue: "libcxx-builders"
+
   - label: "MacOS C++20"
     command: "libcxx/utils/ci/run-buildbot.sh generic-cxx2a"
     artifact_paths:
index 31035a4..1f0b3c7 100755 (executable)
@@ -143,6 +143,12 @@ generic-no-random_device)
     generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-random_device.cmake"
     check-cxx-cxxabi
 ;;
+generic-no-localization)
+    export CC=clang
+    export CXX=clang++
+    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-localization.cmake"
+    check-cxx-cxxabi
+;;
 x86_64-apple-system)
     export CC=clang
     export CXX=clang++
index be4bfe4..6fef8ea 100755 (executable)
@@ -493,6 +493,11 @@ lit_markup = {
   "atomic": ["UNSUPPORTED: libcpp-has-no-threads"],
   "shared_mutex": ["UNSUPPORTED: libcpp-has-no-threads"],
   "thread": ["UNSUPPORTED: libcpp-has-no-threads"],
+  "iomanip": ["UNSUPPORTED: libcpp-has-no-localization"],
+  "istream": ["UNSUPPORTED: libcpp-has-no-localization"],
+  "locale": ["UNSUPPORTED: libcpp-has-no-localization"],
+  "ostream": ["UNSUPPORTED: libcpp-has-no-localization"],
+  "regex": ["UNSUPPORTED: libcpp-has-no-localization"],
 }
 
 def get_std_dialects():
index 47cfa7d..53509d9 100644 (file)
@@ -75,6 +75,7 @@ macros = {
   '_LIBCPP_ABI_VERSION': 'libcpp-abi-version',
   '_LIBCPP_ABI_UNSTABLE': 'libcpp-abi-unstable',
   '_LIBCPP_HAS_NO_RANDOM_DEVICE': 'libcpp-has-no-random-device',
+  '_LIBCPP_HAS_NO_LOCALIZATION': 'libcpp-has-no-localization',
 }
 for macro, feature in macros.items():
   DEFAULT_FEATURES += [