[libc++] Add an option to disable wide character support in libc++

Some embedded platforms do not wish to support the C library functionality
for handling wchar_t because they have no use for it. It makes sense for
libc++ to work properly on those platforms, so this commit adds a carve-out
of functionality for wchar_t.

Unfortunately, unlike some other carve-outs (e.g. random device), this
patch touches several parts of the library. However, despite the wide
impact of this patch, I still think it is important to support this
configuration since it makes it much simpler to port libc++ to some
embedded platforms.

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

GitOrigin-RevId: f4c1258d5633fcf06385ff3fd1f4bf57ab971964
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e117a26..9bc955b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -120,6 +120,12 @@
   "Whether to include support for Unicode in the library. Disabling Unicode can
    be useful when porting to platforms that don't support UTF-8 encoding (e.g.
    embedded)." ON)
+option(LIBCXX_ENABLE_WIDE_CHARACTERS
+  "Whether to include support for wide characters in the library. Disabling
+   wide character support can be useful when porting to platforms that don't
+   support the C functionality for wide characters. When wide characters are
+   not supported, several parts of the library will be disabled, notably the
+   wide character specializations of std::basic_string." ON)
 option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS
   "Whether to turn on vendor availability annotations on declarations that depend
    on definitions in a shared library. By default, we assume that we're not building
@@ -893,6 +899,7 @@
 config_define_if_not(LIBCXX_ENABLE_RANDOM_DEVICE _LIBCPP_HAS_NO_RANDOM_DEVICE)
 config_define_if_not(LIBCXX_ENABLE_LOCALIZATION _LIBCPP_HAS_NO_LOCALIZATION)
 config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE)
+config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS)
 config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
 # Incomplete features get their own specific disabling flags. This makes it
 # easier to grep for target specific flags once the feature is complete.
diff --git a/cmake/caches/Generic-no-wide-characters.cmake b/cmake/caches/Generic-no-wide-characters.cmake
new file mode 100644
index 0000000..728d410
--- /dev/null
+++ b/cmake/caches/Generic-no-wide-characters.cmake
@@ -0,0 +1 @@
+set(LIBCXX_ENABLE_WIDE_CHARACTERS OFF CACHE BOOL "")
diff --git a/docs/BuildingLibcxx.rst b/docs/BuildingLibcxx.rst
index a29a05b..a0128b8 100644
--- a/docs/BuildingLibcxx.rst
+++ b/docs/BuildingLibcxx.rst
@@ -251,6 +251,15 @@
    This option can be used to enable or disable the filesystem components on
    platforms that may not support them. For example on Windows when using MSVC.
 
+.. option:: LIBCXX_ENABLE_WIDE_CHARACTERS:BOOL
+
+   **Default**: ``ON``
+
+   This option can be used to disable support for ``wchar_t`` in the library. It also
+   allows the library to work on top of a C Standard Library that does not provide
+   support for ``wchar_t``. This is especially useful in embedded settings where
+   C Standard Libraries don't always provide all the usual bells and whistles.
+
 .. option:: LIBCXX_ENABLE_INCOMPLETE_FEATURES:BOOL
 
   **Default**: ``ON``
diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst
index 1ec7fa3..1ffd5b4 100644
--- a/docs/ReleaseNotes.rst
+++ b/docs/ReleaseNotes.rst
@@ -49,7 +49,9 @@
 API Changes
 -----------
 
-- ...
+- Support for building libc++ on top of a C Standard Library that does not support ``wchar_t`` was
+  added. This is useful for building libc++ in an embedded setting, and it adds itself to the various
+  freestanding-friendly options provided by libc++.
 
 Build System Changes
 --------------------
diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt
index 55834ab..ed1a585 100644
--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -211,6 +211,7 @@
   __iterator/wrap_iter.h
   __libcpp_version
   __locale
+  __mbstate_t.h
   __memory/addressof.h
   __memory/allocation_guard.h
   __memory/allocator_arg_t.h
diff --git a/include/__algorithm/sort.h b/include/__algorithm/sort.h
index f038d5f..0ab6c44 100644
--- a/include/__algorithm/sort.h
+++ b/include/__algorithm/sort.h
@@ -463,7 +463,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<char>&, char*>(char*, char*, __less<char>&))
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
+#endif
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<short>&, short*>(short*, short*, __less<short>&))
@@ -479,7 +481,9 @@
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&))
 
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&))
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&))
+#endif
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&))
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&))
 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&))
diff --git a/include/__bsd_locale_fallbacks.h b/include/__bsd_locale_fallbacks.h
index ed0eabf..aa64b54 100644
--- a/include/__bsd_locale_fallbacks.h
+++ b/include/__bsd_locale_fallbacks.h
@@ -30,6 +30,7 @@
     return MB_CUR_MAX;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 inline _LIBCPP_INLINE_VISIBILITY
 wint_t __libcpp_btowc_l(int __c, locale_t __l)
 {
@@ -88,6 +89,7 @@
     __libcpp_locale_guard __current(__l);
     return mbrlen(__s, __n, __ps);
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 inline _LIBCPP_INLINE_VISIBILITY
 lconv *__libcpp_localeconv_l(locale_t __l)
@@ -96,6 +98,7 @@
     return localeconv();
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 inline _LIBCPP_INLINE_VISIBILITY
 size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
                      mbstate_t *__ps, locale_t __l)
@@ -103,6 +106,7 @@
     __libcpp_locale_guard __current(__l);
     return mbsrtowcs(__dest, __src, __len, __ps);
 }
+#endif
 
 inline
 int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
diff --git a/include/__config b/include/__config
index 31f98fa..0c68390 100644
--- a/include/__config
+++ b/include/__config
@@ -1241,6 +1241,16 @@
 #define _LIBCPP_PREFERRED_NAME(x)
 #endif
 
+// We often repeat things just for handling wide characters in the library.
+// When wide characters are disabled, it can be useful to have a quick way of
+// disabling it without having to resort to #if-#endif, which has a larger
+// impact on readability.
+#if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
+# define _LIBCPP_IF_WIDE_CHARACTERS(...)
+#else
+# define _LIBCPP_IF_WIDE_CHARACTERS(...) __VA_ARGS__
+#endif
+
 #if defined(_LIBCPP_ABI_MICROSOFT) && \
     (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases))
 #  define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases)
diff --git a/include/__config_site.in b/include/__config_site.in
index c938daa..a8b17ad 100644
--- a/include/__config_site.in
+++ b/include/__config_site.in
@@ -30,6 +30,7 @@
 #cmakedefine _LIBCPP_HAS_PARALLEL_ALGORITHMS
 #cmakedefine _LIBCPP_HAS_NO_RANDOM_DEVICE
 #cmakedefine _LIBCPP_HAS_NO_LOCALIZATION
+#cmakedefine _LIBCPP_HAS_NO_WIDE_CHARACTERS
 #cmakedefine _LIBCPP_HAS_NO_INCOMPLETE_FORMAT
 #cmakedefine _LIBCPP_HAS_NO_INCOMPLETE_RANGES
 
diff --git a/include/__format/format_context.h b/include/__format/format_context.h
index e277aa0..1cb7ee6 100644
--- a/include/__format/format_context.h
+++ b/include/__format/format_context.h
@@ -146,8 +146,9 @@
 // (such as a span<charT>) and polymorphic reallocation. - end note]
 
 using format_context = basic_format_context<back_insert_iterator<string>, char>;
-using wformat_context =
-    basic_format_context<back_insert_iterator<wstring>, wchar_t>;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+using wformat_context = basic_format_context<back_insert_iterator<wstring>, wchar_t>;
+#endif
 
 #endif // !defined(_LIBCPP_HAS_NO_CONCEPTS)
 
diff --git a/include/__format/format_parse_context.h b/include/__format/format_parse_context.h
index 35ecc1f..289cab9 100644
--- a/include/__format/format_parse_context.h
+++ b/include/__format/format_parse_context.h
@@ -96,7 +96,9 @@
 };
 
 using format_parse_context = basic_format_parse_context<char>;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 using wformat_parse_context = basic_format_parse_context<wchar_t>;
+#endif
 
 #endif // !defined(_LIBCPP_HAS_NO_CONCEPTS)
 
diff --git a/include/__format/formatter_bool.h b/include/__format/formatter_bool.h
index 8d9a1d2..fdd1d75 100644
--- a/include/__format/formatter_bool.h
+++ b/include/__format/formatter_bool.h
@@ -85,11 +85,13 @@
   static constexpr string_view __false{"false"};
 };
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 struct _LIBCPP_TEMPLATE_VIS __bool_strings<wchar_t> {
   static constexpr wstring_view __true{L"true"};
   static constexpr wstring_view __false{L"false"};
 };
+#endif
 
 template <class _CharT>
 using __formatter_bool = __formatter_integral<__parser_bool<_CharT>>;
diff --git a/include/__format/formatter_char.h b/include/__format/formatter_char.h
index bbc54c4..2131de0 100644
--- a/include/__format/formatter_char.h
+++ b/include/__format/formatter_char.h
@@ -78,6 +78,7 @@
 struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<char, char>
     : public __format_spec::__formatter_char<char> {};
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT formatter<char, wchar_t>
     : public __format_spec::__formatter_char<wchar_t> {
@@ -93,7 +94,7 @@
 struct _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FORMAT
     formatter<wchar_t, wchar_t>
     : public __format_spec::__formatter_char<wchar_t> {};
-
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 #endif // !defined(_LIBCPP_HAS_NO_CONCEPTS)
 
 #endif //_LIBCPP_STD_VER > 17
diff --git a/include/__functional/hash.h b/include/__functional/hash.h
index f8bcda0..b1a3ad9 100644
--- a/include/__functional/hash.h
+++ b/include/__functional/hash.h
@@ -561,6 +561,7 @@
 
 #endif // _LIBCPP_HAS_NO_UNICODE_CHARS
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
 template <>
 struct _LIBCPP_TEMPLATE_VIS hash<wchar_t>
@@ -576,6 +577,7 @@
     _LIBCPP_INLINE_VISIBILITY
     size_t operator()(wchar_t __v) const _NOEXCEPT {return static_cast<size_t>(__v);}
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
 template <>
diff --git a/include/__locale b/include/__locale
index 5f4d66f..4296adb 100644
--- a/include/__locale
+++ b/include/__locale
@@ -338,7 +338,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>)
+#endif
 
 // template <class CharT> class collate_byname;
 
@@ -363,6 +365,7 @@
     virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
 };
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS collate_byname<wchar_t>
     : public collate<wchar_t>
@@ -382,6 +385,7 @@
                            const char_type* __lo2, const char_type* __hi2) const;
     virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
 };
+#endif
 
 template <class _CharT, class _Traits, class _Allocator>
 bool
@@ -516,6 +520,7 @@
 
 template <class _CharT> class _LIBCPP_TEMPLATE_VIS ctype;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS ctype<wchar_t>
     : public locale::facet,
@@ -617,6 +622,7 @@
     virtual char do_narrow(char_type, char __dfault) const;
     virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <>
 class _LIBCPP_TYPE_VIS ctype<char>
@@ -761,6 +767,7 @@
     virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
 };
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS ctype_byname<wchar_t>
     : public ctype<wchar_t>
@@ -786,6 +793,7 @@
     virtual char do_narrow(char_type, char __dfault) const;
     virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <class _CharT>
 inline _LIBCPP_INLINE_VISIBILITY
@@ -992,6 +1000,7 @@
 
 // template <> class codecvt<wchar_t, char, mbstate_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS codecvt<wchar_t, char, mbstate_t>
     : public locale::facet,
@@ -1072,6 +1081,7 @@
     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
     virtual int do_max_length() const  _NOEXCEPT;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // template <> class codecvt<char16_t, char, mbstate_t> // deprecated in C++20
 
@@ -1450,7 +1460,9 @@
 _LIBCPP_SUPPRESS_DEPRECATED_POP
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
+#endif
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>) // deprecated in C++20
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>) // deprecated in C++20
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
@@ -1681,6 +1693,7 @@
     string __grouping_;
 };
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS numpunct<wchar_t>
     : public locale::facet
@@ -1711,6 +1724,7 @@
     char_type __thousands_sep_;
     string __grouping_;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // template <class charT> class numpunct_byname
 
@@ -1734,6 +1748,7 @@
     void __init(const char*);
 };
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS numpunct_byname<wchar_t>
 : public numpunct<wchar_t>
@@ -1751,6 +1766,7 @@
 private:
     void __init(const char*);
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _LIBCPP_END_NAMESPACE_STD
 
diff --git a/include/__mbstate_t.h b/include/__mbstate_t.h
new file mode 100644
index 0000000..3489f9c
--- /dev/null
+++ b/include/__mbstate_t.h
@@ -0,0 +1,44 @@
+// -*- C++ -*-
+//===----------------------------------------------------------------------===//
+//
+// 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___MBSTATE_T_H
+#define _LIBCPP___MBSTATE_T_H
+
+#include <__config>
+
+#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
+#pragma GCC system_header
+#endif
+
+// TODO(ldionne):
+// The goal of this header is to provide mbstate_t without having to pull in
+// <wchar.h> or <uchar.h>. This is necessary because we need that type even
+// when we don't have (or try to provide) support for wchar_t, because several
+// types like std::fpos are defined in terms of mbstate_t.
+//
+// This is a gruesome hack, but I don't know how to make it cleaner for
+// the time being.
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include <wchar.h> // for mbstate_t
+#elif __has_include(<bits/types/mbstate_t.h>)
+#   include <bits/types/mbstate_t.h> // works on most Unixes
+#elif __has_include(<sys/_types/_mbstate_t.h>)
+#   include <sys/_types/_mbstate_t.h> // works on Darwin
+#else
+#   error "The library was configured without support for wide-characters, but we don't know how to get the definition of mbstate_t without <wchar.h> on your platform."
+#endif
+
+_LIBCPP_BEGIN_NAMESPACE_STD
+
+using ::mbstate_t _LIBCPP_USING_IF_EXISTS;
+
+_LIBCPP_END_NAMESPACE_STD
+
+#endif // _LIBCPP___MBSTATE_T_H
diff --git a/include/__string b/include/__string
index a968fc0..1691b44 100644
--- a/include/__string
+++ b/include/__string
@@ -23,8 +23,12 @@
 #include <cstdio>      // for EOF
 #include <cstdint>     // for uint_least16_t
 #include <cstring>     // for memcpy
-#include <cwchar>      // for wmemcpy
 #include <type_traits> // for __libcpp_is_constant_evaluated
+#include <iosfwd>      // for streampos & friends
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar> // for wmemcpy
+#endif
 
 #include <__debug>
 
@@ -423,6 +427,7 @@
 
 // char_traits<wchar_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 struct _LIBCPP_TEMPLATE_VIS char_traits<wchar_t>
 {
@@ -539,6 +544,7 @@
     return nullptr;
 #endif
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <class _Traits>
 _LIBCPP_INLINE_VISIBILITY
diff --git a/include/__utility/cmp.h b/include/__utility/cmp.h
index a14e373..4fc96b0 100644
--- a/include/__utility/cmp.h
+++ b/include/__utility/cmp.h
@@ -30,14 +30,17 @@
 
 template<class _Tp>
 concept __is_safe_integral_cmp = is_integral_v<_Tp> &&
-                      !_IsSameAsAny<_Tp, bool, char,
+                      !_IsSameAsAny<_Tp, bool, char
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
-                                    char8_t,
+                                    , char8_t
 #endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
-                                    char16_t, char32_t,
+                                    , char16_t, char32_t
 #endif
-                                    wchar_t>::value;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+                                    , wchar_t
+#endif
+                                    >::value;
 
 template<__is_safe_integral_cmp _Tp, __is_safe_integral_cmp _Up>
 _LIBCPP_INLINE_VISIBILITY constexpr
diff --git a/include/atomic b/include/atomic
index 958935b..a10e596 100644
--- a/include/atomic
+++ b/include/atomic
@@ -1473,7 +1473,9 @@
 #endif
 template<> struct __cxx_is_always_lock_free<char16_t> { enum { __value = 2 == ATOMIC_CHAR16_T_LOCK_FREE }; };
 template<> struct __cxx_is_always_lock_free<char32_t> { enum { __value = 2 == ATOMIC_CHAR32_T_LOCK_FREE }; };
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template<> struct __cxx_is_always_lock_free<wchar_t> { enum { __value = 2 == ATOMIC_WCHAR_T_LOCK_FREE }; };
+#endif
 template<> struct __cxx_is_always_lock_free<short> { enum { __value = 2 == ATOMIC_SHORT_LOCK_FREE }; };
 template<> struct __cxx_is_always_lock_free<unsigned short> { enum { __value = 2 == ATOMIC_SHORT_LOCK_FREE }; };
 template<> struct __cxx_is_always_lock_free<int> { enum { __value = 2 == ATOMIC_INT_LOCK_FREE }; };
@@ -2672,7 +2674,9 @@
 #endif
 typedef atomic<char16_t>           atomic_char16_t;
 typedef atomic<char32_t>           atomic_char32_t;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef atomic<wchar_t>            atomic_wchar_t;
+#endif
 
 typedef atomic<int_least8_t>   atomic_int_least8_t;
 typedef atomic<uint_least8_t>  atomic_uint_least8_t;
diff --git a/include/codecvt b/include/codecvt
index ec7d4a7..4ae07be 100644
--- a/include/codecvt
+++ b/include/codecvt
@@ -74,6 +74,7 @@
 
 template <class _Elem> class __codecvt_utf8;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS __codecvt_utf8<wchar_t>
     : public codecvt<wchar_t, char, mbstate_t>
@@ -108,6 +109,7 @@
                           size_t __mx) const;
     virtual int do_max_length() const _NOEXCEPT;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
 template <>
@@ -203,6 +205,7 @@
 
 template <class _Elem, bool _LittleEndian> class __codecvt_utf16;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS __codecvt_utf16<wchar_t, false>
     : public codecvt<wchar_t, char, mbstate_t>
@@ -272,6 +275,7 @@
                           size_t __mx) const;
     virtual int do_max_length() const _NOEXCEPT;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
 template <>
@@ -443,6 +447,7 @@
 
 template <class _Elem> class __codecvt_utf8_utf16;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 class _LIBCPP_TYPE_VIS __codecvt_utf8_utf16<wchar_t>
     : public codecvt<wchar_t, char, mbstate_t>
@@ -477,6 +482,7 @@
                           size_t __mx) const;
     virtual int do_max_length() const _NOEXCEPT;
 };
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
 template <>
diff --git a/include/cstddef b/include/cstddef
index 551bd83..3e56d44 100644
--- a/include/cstddef
+++ b/include/cstddef
@@ -58,7 +58,9 @@
 template <>          struct __libcpp_is_integral<char>               { enum { value = 1 }; };
 template <>          struct __libcpp_is_integral<signed char>        { enum { value = 1 }; };
 template <>          struct __libcpp_is_integral<unsigned char>      { enum { value = 1 }; };
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>          struct __libcpp_is_integral<wchar_t>            { enum { value = 1 }; };
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
 template <>          struct __libcpp_is_integral<char8_t>            { enum { value = 1 }; };
 #endif
diff --git a/include/experimental/regex b/include/experimental/regex
index 17193cf..dcd45ac 100644
--- a/include/experimental/regex
+++ b/include/experimental/regex
@@ -52,9 +52,11 @@
         polymorphic_allocator<_VSTD::sub_match<_BiDirIter>>>;
 
 typedef match_results<const char*> cmatch;
-typedef match_results<const wchar_t*> wcmatch;
 typedef match_results<_VSTD_LFTS_PMR::string::const_iterator> smatch;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+typedef match_results<const wchar_t*> wcmatch;
 typedef match_results<_VSTD_LFTS_PMR::wstring::const_iterator> wsmatch;
+#endif
 
 _LIBCPP_END_NAMESPACE_LFTS_PMR
 
diff --git a/include/experimental/string b/include/experimental/string
index 264ff92..63890ac 100644
--- a/include/experimental/string
+++ b/include/experimental/string
@@ -54,7 +54,9 @@
 typedef basic_string<char> string;
 typedef basic_string<char16_t> u16string;
 typedef basic_string<char32_t> u32string;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef basic_string<wchar_t> wstring;
+#endif
 
 _LIBCPP_END_NAMESPACE_LFTS_PMR
 
diff --git a/include/filesystem b/include/filesystem
index ccb7bc4..a11d2a4 100644
--- a/include/filesystem
+++ b/include/filesystem
@@ -1283,9 +1283,11 @@
     return __s;
   }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
   _LIBCPP_INLINE_VISIBILITY _VSTD::wstring wstring() const {
     return string<wchar_t>();
   }
+#endif
   _LIBCPP_INLINE_VISIBILITY _VSTD::u16string u16string() const {
     return string<char16_t>();
   }
@@ -1310,7 +1312,9 @@
     return string<_ECharT, _Traits, _Allocator>(__a);
   }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
   _VSTD::wstring generic_wstring() const { return string<wchar_t>(); }
+#endif
   _VSTD::u16string generic_u16string() const { return string<char16_t>(); }
   _VSTD::u32string generic_u32string() const { return string<char32_t>(); }
 #endif /* !_LIBCPP_HAS_NO_LOCALIZATION */
diff --git a/include/format b/include/format
index 9116015..19f6427 100644
--- a/include/format
+++ b/include/format
@@ -318,7 +318,9 @@
 // to do this optimization now.
 
 using format_args = basic_format_args<format_context>;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 using wformat_args = basic_format_args<wformat_context>;
+#endif
 
 template <class _OutIt, class _CharT>
 using format_args_t = basic_format_args<basic_format_context<_OutIt, _CharT>>;
@@ -335,11 +337,14 @@
   return {basic_format_arg<_Context>(__args)...};
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI __format_arg_store<wformat_context, _Args...>
 make_wformat_args(const _Args&... __args) {
   return _VSTD::make_format_args<wformat_context>(__args...);
 }
+#endif
+
 namespace __format {
 
 template <class _Tp, class _CharT>
@@ -363,11 +368,13 @@
   __convert(_Uv __value) requires(same_as<_CharT, char>) {
     return _VSTD::to_string(__value);
   }
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
   template <class _Uv>
   _LIBCPP_HIDDEN static wstring
   __convert(_Uv __value) requires(same_as<_CharT, wchar_t>) {
     return _VSTD::to_wstring(__value);
   }
+#endif
 
   template <class _Uv>
   _LIBCPP_HIDDEN auto __handle_format(_Uv __value, auto& __ctx)
@@ -514,12 +521,14 @@
   return _VSTD::__vformat_to(_VSTD::move(__out_it), __fmt, __args);
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <output_iterator<const wchar_t&> _OutIt>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt
 vformat_to(_OutIt __out_it, wstring_view __fmt,
            format_args_t<type_identity_t<_OutIt>, wchar_t> __args) {
   return _VSTD::__vformat_to(_VSTD::move(__out_it), __fmt, __args);
 }
+#endif
 
 template <output_iterator<const char&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt
@@ -529,6 +538,7 @@
       _VSTD::make_format_args<basic_format_context<_OutIt, char>>(__args...));
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <output_iterator<const wchar_t&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt
 format_to(_OutIt __out_it, wstring_view __fmt, const _Args&... __args) {
@@ -537,6 +547,7 @@
       _VSTD::make_format_args<basic_format_context<_OutIt, wchar_t>>(
           __args...));
 }
+#endif
 
 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string
 vformat(string_view __fmt, format_args __args) {
@@ -545,12 +556,14 @@
   return __res;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring
 vformat(wstring_view __fmt, wformat_args __args) {
   wstring __res;
   _VSTD::vformat_to(_VSTD::back_inserter(__res), __fmt, __args);
   return __res;
 }
+#endif
 
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string
@@ -558,11 +571,13 @@
   return _VSTD::vformat(__fmt, _VSTD::make_format_args(__args...));
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring
 format(wstring_view __fmt, const _Args&... __args) {
   return _VSTD::vformat(__fmt, _VSTD::make_wformat_args(__args...));
 }
+#endif
 
 template <class _OutIt>
 struct _LIBCPP_TEMPLATE_VIS format_to_n_result {
@@ -583,6 +598,7 @@
   return {_VSTD::move(__out_it), __s};
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <output_iterator<const wchar_t&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt>
 format_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, wstring_view __fmt,
@@ -595,6 +611,7 @@
   __out_it = _VSTD::copy_n(__str.begin(), __m, _VSTD::move(__out_it));
   return {_VSTD::move(__out_it), __s};
 }
+#endif
 
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t
@@ -603,12 +620,14 @@
   return _VSTD::vformat(__fmt, _VSTD::make_format_args(__args...)).size();
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t
 formatted_size(wstring_view __fmt, const _Args&... __args) {
   // TODO FMT Improve PoC: using std::string is inefficient.
   return _VSTD::vformat(__fmt, _VSTD::make_wformat_args(__args...)).size();
 }
+#endif
 
 #ifndef _LIBCPP_HAS_NO_LOCALIZATION
 
@@ -630,6 +649,7 @@
                              __args);
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <output_iterator<const wchar_t&> _OutIt>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt
 vformat_to(_OutIt __out_it, locale __loc, wstring_view __fmt,
@@ -637,6 +657,7 @@
   return _VSTD::__vformat_to(_VSTD::move(__out_it), _VSTD::move(__loc), __fmt,
                              __args);
 }
+#endif
 
 template <output_iterator<const char&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt format_to(
@@ -646,6 +667,7 @@
       _VSTD::make_format_args<basic_format_context<_OutIt, char>>(__args...));
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <output_iterator<const wchar_t&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT _OutIt format_to(
     _OutIt __out_it, locale __loc, wstring_view __fmt, const _Args&... __args) {
@@ -654,6 +676,7 @@
       _VSTD::make_format_args<basic_format_context<_OutIt, wchar_t>>(
           __args...));
 }
+#endif
 
 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string
 vformat(locale __loc, string_view __fmt, format_args __args) {
@@ -663,6 +686,7 @@
   return __res;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring
 vformat(locale __loc, wstring_view __fmt, wformat_args __args) {
   wstring __res;
@@ -670,6 +694,7 @@
                     __args);
   return __res;
 }
+#endif
 
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT string
@@ -678,12 +703,14 @@
                         _VSTD::make_format_args(__args...));
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT wstring
 format(locale __loc, wstring_view __fmt, const _Args&... __args) {
   return _VSTD::vformat(_VSTD::move(__loc), __fmt,
                         _VSTD::make_wformat_args(__args...));
 }
+#endif
 
 template <output_iterator<const char&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt>
@@ -699,6 +726,7 @@
   return {_VSTD::move(__out_it), __s};
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <output_iterator<const wchar_t&> _OutIt, class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT format_to_n_result<_OutIt>
 format_to_n(_OutIt __out_it, iter_difference_t<_OutIt> __n, locale __loc,
@@ -712,6 +740,7 @@
   __out_it = _VSTD::copy_n(__str.begin(), __m, _VSTD::move(__out_it));
   return {_VSTD::move(__out_it), __s};
 }
+#endif
 
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t
@@ -722,6 +751,7 @@
       .size();
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class... _Args>
 _LIBCPP_HIDE_FROM_ABI _LIBCPP_AVAILABILITY_FORMAT size_t
 formatted_size(locale __loc, wstring_view __fmt, const _Args&... __args) {
@@ -730,6 +760,7 @@
                         _VSTD::make_wformat_args(__args...))
       .size();
 }
+#endif
 
 #endif // _LIBCPP_HAS_NO_LOCALIZATION
 
diff --git a/include/iosfwd b/include/iosfwd
index 974cb42..099b60e 100644
--- a/include/iosfwd
+++ b/include/iosfwd
@@ -95,7 +95,7 @@
 */
 
 #include <__config>
-#include <wchar.h>  // for mbstate_t
+#include <__mbstate_t.h>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
@@ -112,7 +112,9 @@
 #endif
 template<> struct char_traits<char16_t>;
 template<> struct char_traits<char32_t>;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template<> struct char_traits<wchar_t>;
+#endif
 
 template<class _Tp>     class _LIBCPP_TEMPLATE_VIS allocator;
 
@@ -156,7 +158,9 @@
     class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator;
 
 typedef basic_ios<char>              ios;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef basic_ios<wchar_t>           wios;
+#endif
 
 typedef basic_streambuf<char>        streambuf;
 typedef basic_istream<char>          istream;
@@ -173,6 +177,7 @@
 typedef basic_ofstream<char>         ofstream;
 typedef basic_fstream<char>          fstream;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef basic_streambuf<wchar_t>     wstreambuf;
 typedef basic_istream<wchar_t>       wistream;
 typedef basic_ostream<wchar_t>       wostream;
@@ -187,36 +192,37 @@
 typedef basic_ifstream<wchar_t>      wifstream;
 typedef basic_ofstream<wchar_t>      wofstream;
 typedef basic_fstream<wchar_t>       wfstream;
+#endif
 
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(ios) _LIBCPP_PREFERRED_NAME(wios) basic_ios;
+    class _LIBCPP_PREFERRED_NAME(ios) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wios)) basic_ios;
 
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(streambuf) _LIBCPP_PREFERRED_NAME(wstreambuf) basic_streambuf;
+    class _LIBCPP_PREFERRED_NAME(streambuf) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wstreambuf)) basic_streambuf;
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(istream) _LIBCPP_PREFERRED_NAME(wistream) basic_istream;
+    class _LIBCPP_PREFERRED_NAME(istream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wistream)) basic_istream;
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(ostream) _LIBCPP_PREFERRED_NAME(wostream) basic_ostream;
+    class _LIBCPP_PREFERRED_NAME(ostream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wostream)) basic_ostream;
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(iostream) _LIBCPP_PREFERRED_NAME(wiostream) basic_iostream;
+    class _LIBCPP_PREFERRED_NAME(iostream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wiostream)) basic_iostream;
 
 template <class _CharT, class _Traits, class _Allocator>
-    class _LIBCPP_PREFERRED_NAME(stringbuf) _LIBCPP_PREFERRED_NAME(wstringbuf) basic_stringbuf;
+    class _LIBCPP_PREFERRED_NAME(stringbuf) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wstringbuf)) basic_stringbuf;
 template <class _CharT, class _Traits, class _Allocator>
-    class _LIBCPP_PREFERRED_NAME(istringstream) _LIBCPP_PREFERRED_NAME(wistringstream) basic_istringstream;
+    class _LIBCPP_PREFERRED_NAME(istringstream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wistringstream)) basic_istringstream;
 template <class _CharT, class _Traits, class _Allocator>
-    class _LIBCPP_PREFERRED_NAME(ostringstream) _LIBCPP_PREFERRED_NAME(wostringstream) basic_ostringstream;
+    class _LIBCPP_PREFERRED_NAME(ostringstream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wostringstream)) basic_ostringstream;
 template <class _CharT, class _Traits, class _Allocator>
-    class _LIBCPP_PREFERRED_NAME(stringstream) _LIBCPP_PREFERRED_NAME(wstringstream) basic_stringstream;
+    class _LIBCPP_PREFERRED_NAME(stringstream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wstringstream)) basic_stringstream;
 
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(filebuf) _LIBCPP_PREFERRED_NAME(wfilebuf) basic_filebuf;
+    class _LIBCPP_PREFERRED_NAME(filebuf) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wfilebuf)) basic_filebuf;
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(ifstream) _LIBCPP_PREFERRED_NAME(wifstream) basic_ifstream;
+    class _LIBCPP_PREFERRED_NAME(ifstream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wifstream)) basic_ifstream;
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(ofstream) _LIBCPP_PREFERRED_NAME(wofstream) basic_ofstream;
+    class _LIBCPP_PREFERRED_NAME(ofstream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wofstream)) basic_ofstream;
 template <class _CharT, class _Traits>
-    class _LIBCPP_PREFERRED_NAME(fstream) _LIBCPP_PREFERRED_NAME(wfstream) basic_fstream;
+    class _LIBCPP_PREFERRED_NAME(fstream) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wfstream)) basic_fstream;
 
 template <class _State>             class _LIBCPP_TEMPLATE_VIS fpos;
 typedef fpos<mbstate_t>    streampos;
@@ -241,10 +247,12 @@
           class _Allocator = allocator<_CharT> >
     class _LIBCPP_TEMPLATE_VIS basic_string;
 typedef basic_string<char, char_traits<char>, allocator<char> > string;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
+#endif
 
 template <class _CharT, class _Traits, class _Allocator>
-    class _LIBCPP_PREFERRED_NAME(string) _LIBCPP_PREFERRED_NAME(wstring) basic_string;
+    class _LIBCPP_PREFERRED_NAME(string) _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wstring)) basic_string;
 
 // Include other forward declarations here
 template <class _Tp, class _Alloc = allocator<_Tp> >
diff --git a/include/iostream b/include/iostream
index 788cfe1..f88f013 100644
--- a/include/iostream
+++ b/include/iostream
@@ -46,13 +46,16 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 extern _LIBCPP_FUNC_VIS istream cin;
-extern _LIBCPP_FUNC_VIS wistream wcin;
 extern _LIBCPP_FUNC_VIS ostream cout;
-extern _LIBCPP_FUNC_VIS wostream wcout;
 extern _LIBCPP_FUNC_VIS ostream cerr;
-extern _LIBCPP_FUNC_VIS wostream wcerr;
 extern _LIBCPP_FUNC_VIS ostream clog;
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+extern _LIBCPP_FUNC_VIS wistream wcin;
+extern _LIBCPP_FUNC_VIS wostream wcout;
+extern _LIBCPP_FUNC_VIS wostream wcerr;
 extern _LIBCPP_FUNC_VIS wostream wclog;
+#endif
 
 _LIBCPP_END_NAMESPACE_STD
 
diff --git a/include/istream b/include/istream
index 17ca683..6fb296f 100644
--- a/include/istream
+++ b/include/istream
@@ -1628,7 +1628,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>)
+#endif
 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>)
 
 _LIBCPP_END_NAMESPACE_STD
diff --git a/include/locale b/include/locale
index 25cafdd..c20e15f 100644
--- a/include/locale
+++ b/include/locale
@@ -573,7 +573,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<wchar_t>)
+#endif
 
 template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
 class _LIBCPP_TEMPLATE_VIS num_get
@@ -1111,7 +1113,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<wchar_t>)
+#endif
 
 struct _LIBCPP_TYPE_VIS __num_put_base
 {
@@ -1261,7 +1265,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<wchar_t>)
+#endif
 
 template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
 class _LIBCPP_TEMPLATE_VIS num_put
@@ -1694,7 +1700,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<wchar_t>)
+#endif
 
 template <class _CharT, class _InputIterator>
 _LIBCPP_HIDDEN
@@ -1761,6 +1769,7 @@
 template <> _LIBCPP_FUNC_VIS const string& __time_get_c_storage<char>::__x() const;
 template <> _LIBCPP_FUNC_VIS const string& __time_get_c_storage<char>::__X() const;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <> _LIBCPP_FUNC_VIS const wstring* __time_get_c_storage<wchar_t>::__weeks() const;
 template <> _LIBCPP_FUNC_VIS const wstring* __time_get_c_storage<wchar_t>::__months() const;
 template <> _LIBCPP_FUNC_VIS const wstring* __time_get_c_storage<wchar_t>::__am_pm() const;
@@ -1768,6 +1777,7 @@
 template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__r() const;
 template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__x() const;
 template <> _LIBCPP_FUNC_VIS const wstring& __time_get_c_storage<wchar_t>::__X() const;
+#endif
 
 template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
 class _LIBCPP_TEMPLATE_VIS time_get
@@ -2380,7 +2390,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<wchar_t>)
+#endif
 
 class _LIBCPP_TYPE_VIS __time_get
 {
@@ -2480,7 +2492,9 @@
 };
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<wchar_t>)
+#endif
 
 class _LIBCPP_TYPE_VIS __time_put
 {
@@ -2593,7 +2607,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<wchar_t>)
+#endif
 
 template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
 class _LIBCPP_TEMPLATE_VIS time_put_byname
@@ -2614,7 +2630,9 @@
 };
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<wchar_t>)
+#endif
 
 // money_base
 
@@ -2682,8 +2700,10 @@
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, false>)
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, true>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, false>)
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, true>)
+#endif
 
 // moneypunct_byname
 
@@ -2734,13 +2754,15 @@
 
 template<> _LIBCPP_FUNC_VIS void moneypunct_byname<char, false>::init(const char*);
 template<> _LIBCPP_FUNC_VIS void moneypunct_byname<char, true>::init(const char*);
-template<> _LIBCPP_FUNC_VIS void moneypunct_byname<wchar_t, false>::init(const char*);
-template<> _LIBCPP_FUNC_VIS void moneypunct_byname<wchar_t, true>::init(const char*);
-
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, false>)
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, true>)
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+template<> _LIBCPP_FUNC_VIS void moneypunct_byname<wchar_t, false>::init(const char*);
+template<> _LIBCPP_FUNC_VIS void moneypunct_byname<wchar_t, true>::init(const char*);
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, false>)
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, true>)
+#endif
 
 // money_get
 
@@ -2797,7 +2819,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<wchar_t>)
+#endif
 
 template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
 class _LIBCPP_TEMPLATE_VIS money_get
@@ -3184,7 +3208,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<wchar_t>)
+#endif
 
 // money_put
 
@@ -3359,7 +3385,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<wchar_t>)
+#endif
 
 template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
 class _LIBCPP_TEMPLATE_VIS money_put
@@ -3512,7 +3540,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<wchar_t>)
+#endif
 
 // messages
 
@@ -3628,7 +3658,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<wchar_t>)
+#endif
 
 template <class _CharT>
 class _LIBCPP_TEMPLATE_VIS messages_byname
@@ -3652,7 +3684,9 @@
 };
 
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE_EVEN_IN_DEBUG_MODE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<wchar_t>)
+#endif
 
 template<class _Codecvt, class _Elem = wchar_t,
          class _Wide_alloc = allocator<_Elem>,
diff --git a/include/module.modulemap b/include/module.modulemap
index d8049cb..80cdfe3 100644
--- a/include/module.modulemap
+++ b/include/module.modulemap
@@ -869,6 +869,7 @@
   module __function_like     { private header "__function_like.h"   export * }
   module __hash_table        { header "__hash_table"        export * }
   module __locale            { private header "__locale"            export * }
+  module __mbstate           { private header "__mbstate_t.h"       export * }
   module __mutex_base        { private header "__mutex_base"        export * }
   module __node_handle       { private header "__node_handle"       export * }
   module __nullptr           { header "__nullptr"           export * }
diff --git a/include/ostream b/include/ostream
index efeaee2..e0aa18f 100644
--- a/include/ostream
+++ b/include/ostream
@@ -1087,7 +1087,9 @@
 }
 
 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>)
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>)
+#endif
 
 _LIBCPP_END_NAMESPACE_STD
 
diff --git a/include/regex b/include/regex
index a0bf3e2..c0d1eda 100644
--- a/include/regex
+++ b/include/regex
@@ -1072,32 +1072,38 @@
     template <class _ForwardIterator>
         string_type
         __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     template <class _ForwardIterator>
         string_type
         __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
-
+#endif
     template <class _ForwardIterator>
         string_type
         __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     template <class _ForwardIterator>
         string_type
         __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
-
+#endif
     template <class _ForwardIterator>
         char_class_type
         __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
                            bool __icase, char) const;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     template <class _ForwardIterator>
         char_class_type
         __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
                            bool __icase, wchar_t) const;
+#endif
 
     static int __regex_traits_value(unsigned char __ch, int __radix);
     _LIBCPP_INLINE_VISIBILITY
     int __regex_traits_value(char __ch, int __radix) const
         {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     _LIBCPP_INLINE_VISIBILITY
     int __regex_traits_value(wchar_t __ch, int __radix) const;
+#endif
 };
 
 template <class _CharT>
@@ -1168,6 +1174,7 @@
     return __d;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class _CharT>
 template <class _ForwardIterator>
 typename regex_traits<_CharT>::string_type
@@ -1189,6 +1196,7 @@
     }
     return __d;
 }
+#endif
 
 // lookup_collatename is very FreeBSD-specific
 
@@ -1217,6 +1225,7 @@
     return __r;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class _CharT>
 template <class _ForwardIterator>
 typename regex_traits<_CharT>::string_type
@@ -1250,6 +1259,7 @@
     }
     return __r;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // lookup_classname
 
@@ -1268,6 +1278,7 @@
     return __get_classname(__s.c_str(), __icase);
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class _CharT>
 template <class _ForwardIterator>
 typename regex_traits<_CharT>::char_class_type
@@ -1288,6 +1299,7 @@
     }
     return __get_classname(__n.c_str(), __icase);
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <class _CharT>
 bool
@@ -1318,6 +1330,7 @@
     return -1;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <class _CharT>
 inline
 int
@@ -1325,6 +1338,7 @@
 {
     return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
 }
+#endif
 
 template <class _CharT> class __node;
 
@@ -2135,7 +2149,9 @@
 };
 
 template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
+#endif
 
 // __match_char
 
@@ -2542,13 +2558,15 @@
     class _LIBCPP_TEMPLATE_VIS basic_regex;
 
 typedef basic_regex<char>    regex;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef basic_regex<wchar_t> wregex;
+#endif
 
 template <class _CharT, class _Traits>
 class
     _LIBCPP_TEMPLATE_VIS
     _LIBCPP_PREFERRED_NAME(regex)
-    _LIBCPP_PREFERRED_NAME(wregex)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex))
     basic_regex
 {
 public:
@@ -4897,17 +4915,19 @@
 // sub_match
 
 typedef sub_match<const char*>             csub_match;
-typedef sub_match<const wchar_t*>          wcsub_match;
 typedef sub_match<string::const_iterator>  ssub_match;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+typedef sub_match<const wchar_t*>          wcsub_match;
 typedef sub_match<wstring::const_iterator> wssub_match;
+#endif
 
 template <class _BidirectionalIterator>
 class
     _LIBCPP_TEMPLATE_VIS
     _LIBCPP_PREFERRED_NAME(csub_match)
-    _LIBCPP_PREFERRED_NAME(wcsub_match)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match))
     _LIBCPP_PREFERRED_NAME(ssub_match)
-    _LIBCPP_PREFERRED_NAME(wssub_match)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match))
     sub_match
     : public pair<_BidirectionalIterator, _BidirectionalIterator>
 {
@@ -5326,17 +5346,19 @@
 }
 
 typedef match_results<const char*>             cmatch;
-typedef match_results<const wchar_t*>          wcmatch;
 typedef match_results<string::const_iterator>  smatch;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+typedef match_results<const wchar_t*>          wcmatch;
 typedef match_results<wstring::const_iterator> wsmatch;
+#endif
 
 template <class _BidirectionalIterator, class _Allocator>
 class
     _LIBCPP_TEMPLATE_VIS
     _LIBCPP_PREFERRED_NAME(cmatch)
-    _LIBCPP_PREFERRED_NAME(wcmatch)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
     _LIBCPP_PREFERRED_NAME(smatch)
-    _LIBCPP_PREFERRED_NAME(wsmatch)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch))
     match_results
 {
 public:
@@ -6244,17 +6266,19 @@
     class _LIBCPP_TEMPLATE_VIS regex_iterator;
 
 typedef regex_iterator<const char*>             cregex_iterator;
-typedef regex_iterator<const wchar_t*>          wcregex_iterator;
 typedef regex_iterator<string::const_iterator>  sregex_iterator;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+typedef regex_iterator<const wchar_t*>          wcregex_iterator;
 typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
+#endif
 
 template <class _BidirectionalIterator, class _CharT, class _Traits>
 class
     _LIBCPP_TEMPLATE_VIS
     _LIBCPP_PREFERRED_NAME(cregex_iterator)
-    _LIBCPP_PREFERRED_NAME(wcregex_iterator)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator))
     _LIBCPP_PREFERRED_NAME(sregex_iterator)
-    _LIBCPP_PREFERRED_NAME(wsregex_iterator)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator))
     regex_iterator
 {
 public:
@@ -6372,17 +6396,19 @@
     class _LIBCPP_TEMPLATE_VIS regex_token_iterator;
 
 typedef regex_token_iterator<const char*>             cregex_token_iterator;
-typedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
 typedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+typedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
+#endif
 
 template <class _BidirectionalIterator, class _CharT, class _Traits>
 class
     _LIBCPP_TEMPLATE_VIS
     _LIBCPP_PREFERRED_NAME(cregex_token_iterator)
-    _LIBCPP_PREFERRED_NAME(wcregex_token_iterator)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
     _LIBCPP_PREFERRED_NAME(sregex_token_iterator)
-    _LIBCPP_PREFERRED_NAME(wsregex_token_iterator)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator))
     regex_token_iterator
 {
 public:
diff --git a/include/string b/include/string
index c6a799d..53b4e09 100644
--- a/include/string
+++ b/include/string
@@ -524,7 +524,6 @@
 #include <cstdio>  // EOF
 #include <cstdlib>
 #include <cstring>
-#include <cwchar>
 #include <initializer_list>
 #include <iosfwd>
 #include <iterator>
@@ -535,6 +534,10 @@
 #include <utility>
 #include <version>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar>
+#endif
+
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
 # include <cstdint>
 #endif
@@ -1729,11 +1732,15 @@
 // These declarations must appear before any functions are implicitly used
 // so that they have the correct visibility specifier.
 #ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
-_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char)
-_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t)
+    _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char)
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+        _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t)
+#   endif
 #else
-_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char)
-_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t)
+    _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, char)
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+        _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE, wchar_t)
+#   endif
 #endif
 
 
@@ -4395,6 +4402,7 @@
 _LIBCPP_FUNC_VIS string to_string(double __val);
 _LIBCPP_FUNC_VIS string to_string(long double __val);
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _LIBCPP_FUNC_VIS int                stoi  (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
 _LIBCPP_FUNC_VIS long               stol  (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
 _LIBCPP_FUNC_VIS unsigned long      stoul (const wstring& __str, size_t* __idx = nullptr, int __base = 10);
@@ -4414,6 +4422,7 @@
 _LIBCPP_FUNC_VIS wstring to_wstring(float __val);
 _LIBCPP_FUNC_VIS wstring to_wstring(double __val);
 _LIBCPP_FUNC_VIS wstring to_wstring(long double __val);
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template<class _CharT, class _Traits, class _Allocator>
 _LIBCPP_TEMPLATE_DATA_VIS
@@ -4535,11 +4544,13 @@
         return basic_string<char> (__str, __len);
     }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     inline _LIBCPP_INLINE_VISIBILITY
     basic_string<wchar_t> operator "" s( const wchar_t *__str, size_t __len )
     {
         return basic_string<wchar_t> (__str, __len);
     }
+#endif
 
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
     inline _LIBCPP_INLINE_VISIBILITY
diff --git a/include/string_view b/include/string_view
index 45bb765..b9d00b3 100644
--- a/include/string_view
+++ b/include/string_view
@@ -225,7 +225,9 @@
 #endif
 typedef basic_string_view<char16_t> u16string_view;
 typedef basic_string_view<char32_t> u32string_view;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 typedef basic_string_view<wchar_t>  wstring_view;
+#endif
 
 template<class _CharT, class _Traits>
 class
@@ -235,7 +237,7 @@
 #endif
     _LIBCPP_PREFERRED_NAME(u16string_view)
     _LIBCPP_PREFERRED_NAME(u32string_view)
-    _LIBCPP_PREFERRED_NAME(wstring_view)
+    _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wstring_view))
     basic_string_view {
 public:
     // types
@@ -885,11 +887,13 @@
         return basic_string_view<char> (__str, __len);
     }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
     basic_string_view<wchar_t> operator "" sv(const wchar_t *__str, size_t __len) _NOEXCEPT
     {
         return basic_string_view<wchar_t> (__str, __len);
     }
+#endif
 
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
     inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
diff --git a/include/wchar.h b/include/wchar.h
index 4d391f9..0802640 100644
--- a/include/wchar.h
+++ b/include/wchar.h
@@ -108,6 +108,10 @@
 #include <__config>
 #include <stddef.h>
 
+#if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
+#   error "The <wchar.h> header is not supported since libc++ has been configured with LIBCXX_ENABLE_WIDE_CHARACTERS disabled"
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
 #endif
diff --git a/include/wctype.h b/include/wctype.h
index 3b61475..8dd8232 100644
--- a/include/wctype.h
+++ b/include/wctype.h
@@ -46,6 +46,10 @@
 
 #include <__config>
 
+#if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
+#   error "The <wctype.h> header is not supported since libc++ has been configured with LIBCXX_ENABLE_WIDE_CHARACTERS disabled"
+#endif
+
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
 #pragma GCC system_header
 #endif
diff --git a/src/algorithm.cpp b/src/algorithm.cpp
index 9f11dc3..16221f4 100644
--- a/src/algorithm.cpp
+++ b/src/algorithm.cpp
@@ -11,7 +11,9 @@
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 template void __sort<__less<char>&, char*>(char*, char*, __less<char>&);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template void __sort<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
+#endif
 template void __sort<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
 template void __sort<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
 template void __sort<__less<short>&, short*>(short*, short*, __less<short>&);
@@ -27,7 +29,9 @@
 template void __sort<__less<long double>&, long double*>(long double*, long double*, __less<long double>&);
 
 template bool __insertion_sort_incomplete<__less<char>&, char*>(char*, char*, __less<char>&);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template bool __insertion_sort_incomplete<__less<wchar_t>&, wchar_t*>(wchar_t*, wchar_t*, __less<wchar_t>&);
+#endif
 template bool __insertion_sort_incomplete<__less<signed char>&, signed char*>(signed char*, signed char*, __less<signed char>&);
 template bool __insertion_sort_incomplete<__less<unsigned char>&, unsigned char*>(unsigned char*, unsigned char*, __less<unsigned char>&);
 template bool __insertion_sort_incomplete<__less<short>&, short*>(short*, short*, __less<short>&);
diff --git a/src/ios.instantiations.cpp b/src/ios.instantiations.cpp
index 1a23687..e1189d0 100644
--- a/src/ios.instantiations.cpp
+++ b/src/ios.instantiations.cpp
@@ -19,15 +19,18 @@
 
 // Original explicit instantiations provided in the library
 template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<wchar_t>;
 template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<wchar_t>;
 template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<wchar_t>;
 template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<wchar_t>;
 template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_iostream<char>;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ios<wchar_t>;
+template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_streambuf<wchar_t>;
+template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_istream<wchar_t>;
+template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_ostream<wchar_t>;
+#endif
+
 // Additional instantiations added later. Whether programs rely on these being
 // available is protected by _LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1.
 template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS basic_stringbuf<char>;
diff --git a/src/iostream.cpp b/src/iostream.cpp
index 99bd528..61d5e54 100644
--- a/src/iostream.cpp
+++ b/src/iostream.cpp
@@ -24,6 +24,8 @@
 ;
 _ALIGNAS_TYPE (__stdinbuf<char> ) static char __cin[sizeof(__stdinbuf <char>)];
 static mbstate_t mb_cin;
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _ALIGNAS_TYPE (wistream) _LIBCPP_FUNC_VIS char wcin[sizeof(wistream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
 __asm__("?wcin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A")
@@ -31,6 +33,7 @@
 ;
 _ALIGNAS_TYPE (__stdinbuf<wchar_t> ) static char __wcin[sizeof(__stdinbuf <wchar_t>)];
 static mbstate_t mb_wcin;
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cout[sizeof(ostream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
@@ -39,6 +42,8 @@
 ;
 _ALIGNAS_TYPE (__stdoutbuf<char>) static char __cout[sizeof(__stdoutbuf<char>)];
 static mbstate_t mb_cout;
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcout[sizeof(wostream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
 __asm__("?wcout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A")
@@ -46,6 +51,7 @@
 ;
 _ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcout[sizeof(__stdoutbuf<wchar_t>)];
 static mbstate_t mb_wcout;
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cerr[sizeof(ostream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
@@ -54,6 +60,8 @@
 ;
 _ALIGNAS_TYPE (__stdoutbuf<char>) static char __cerr[sizeof(__stdoutbuf<char>)];
 static mbstate_t mb_cerr;
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcerr[sizeof(wostream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
 __asm__("?wcerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A")
@@ -61,17 +69,21 @@
 ;
 _ALIGNAS_TYPE (__stdoutbuf<wchar_t>) static char __wcerr[sizeof(__stdoutbuf<wchar_t>)];
 static mbstate_t mb_wcerr;
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char clog[sizeof(ostream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
 __asm__("?clog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A")
 #endif
 ;
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wclog[sizeof(wostream)]
 #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__)
 __asm__("?wclog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A")
 #endif
 ;
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // Hacky way to make the compiler believe that we're inside a system header so
 // it doesn't flag the use of the init_priority attribute with a value that's
@@ -109,33 +121,38 @@
     force_locale_initialization();
 
     istream* cin_ptr  = ::new(cin)  istream(::new(__cin)  __stdinbuf <char>(stdin, &mb_cin));
-    wistream* wcin_ptr  = ::new(wcin)  wistream(::new(__wcin)  __stdinbuf <wchar_t>(stdin, &mb_wcin));
     ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf<char>(stdout, &mb_cout));
-    wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf<wchar_t>(stdout, &mb_wcout));
     ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf<char>(stderr, &mb_cerr));
                         ::new(clog) ostream(cerr_ptr->rdbuf());
+    cin_ptr->tie(cout_ptr);
+    _VSTD::unitbuf(*cerr_ptr);
+    cerr_ptr->tie(cout_ptr);
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+    wistream* wcin_ptr  = ::new(wcin)  wistream(::new(__wcin)  __stdinbuf <wchar_t>(stdin, &mb_wcin));
+    wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf<wchar_t>(stdout, &mb_wcout));
     wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf<wchar_t>(stderr, &mb_wcerr));
                           ::new(wclog) wostream(wcerr_ptr->rdbuf());
 
-    cin_ptr->tie(cout_ptr);
     wcin_ptr->tie(wcout_ptr);
-    _VSTD::unitbuf(*cerr_ptr);
     _VSTD::unitbuf(*wcerr_ptr);
-    cerr_ptr->tie(cout_ptr);
     wcerr_ptr->tie(wcout_ptr);
+#endif
 }
 
 DoIOSInit::~DoIOSInit()
 {
     ostream* cout_ptr = reinterpret_cast<ostream*>(cout);
-    wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout);
     cout_ptr->flush();
-    wcout_ptr->flush();
-
     ostream* clog_ptr = reinterpret_cast<ostream*>(clog);
-    wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog);
     clog_ptr->flush();
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+    wostream* wcout_ptr = reinterpret_cast<wostream*>(wcout);
+    wcout_ptr->flush();
+    wostream* wclog_ptr = reinterpret_cast<wostream*>(wclog);
     wclog_ptr->flush();
+#endif
 }
 
 ios_base::Init::Init()
diff --git a/src/locale.cpp b/src/locale.cpp
index 8aa67f7..d069b42 100644
--- a/src/locale.cpp
+++ b/src/locale.cpp
@@ -18,13 +18,16 @@
 #include "cstdio"
 #include "cstdlib"
 #include "cstring"
-#include "cwctype"
 #include "locale"
 #include "string"
 #include "type_traits"
 #include "typeinfo"
 #include "vector"
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include "cwctype"
+#endif
+
 #if defined(_LIBCPP_MSVCRT)
 #   define _CTYPE_DISABLE_MACROS
 #endif
@@ -176,11 +179,17 @@
 {
     facets_.clear();
     install(&make<_VSTD::collate<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<_VSTD::collate<wchar_t> >(1u));
+#endif
     install(&make<_VSTD::ctype<char> >(nullptr, false, 1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<_VSTD::ctype<wchar_t> >(1u));
+#endif
     install(&make<codecvt<char, char, mbstate_t> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<codecvt<wchar_t, char, mbstate_t> >(1u));
+#endif
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
     install(&make<codecvt<char16_t, char, mbstate_t> >(1u));
     install(&make<codecvt<char32_t, char, mbstate_t> >(1u));
@@ -190,25 +199,43 @@
     install(&make<codecvt<char32_t, char8_t, mbstate_t> >(1u));
 #endif
     install(&make<numpunct<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<numpunct<wchar_t> >(1u));
+#endif
     install(&make<num_get<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<num_get<wchar_t> >(1u));
+#endif
     install(&make<num_put<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<num_put<wchar_t> >(1u));
+#endif
     install(&make<moneypunct<char, false> >(1u));
     install(&make<moneypunct<char, true> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<moneypunct<wchar_t, false> >(1u));
     install(&make<moneypunct<wchar_t, true> >(1u));
+#endif
     install(&make<money_get<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<money_get<wchar_t> >(1u));
+#endif
     install(&make<money_put<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<money_put<wchar_t> >(1u));
+#endif
     install(&make<time_get<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<time_get<wchar_t> >(1u));
+#endif
     install(&make<time_put<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<time_put<wchar_t> >(1u));
+#endif
     install(&make<_VSTD::messages<char> >(1u));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     install(&make<_VSTD::messages<wchar_t> >(1u));
+#endif
 }
 
 locale::__imp::__imp(const string& name, size_t refs)
@@ -225,11 +252,17 @@
             if (facets_[i])
                 facets_[i]->__add_shared();
         install(new collate_byname<char>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new collate_byname<wchar_t>(name_));
+#endif
         install(new ctype_byname<char>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new ctype_byname<wchar_t>(name_));
+#endif
         install(new codecvt_byname<char, char, mbstate_t>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new codecvt_byname<wchar_t, char, mbstate_t>(name_));
+#endif
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
         install(new codecvt_byname<char16_t, char, mbstate_t>(name_));
         install(new codecvt_byname<char32_t, char, mbstate_t>(name_));
@@ -239,17 +272,27 @@
         install(new codecvt_byname<char32_t, char8_t, mbstate_t>(name_));
 #endif
         install(new numpunct_byname<char>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new numpunct_byname<wchar_t>(name_));
+#endif
         install(new moneypunct_byname<char, false>(name_));
         install(new moneypunct_byname<char, true>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new moneypunct_byname<wchar_t, false>(name_));
         install(new moneypunct_byname<wchar_t, true>(name_));
+#endif
         install(new time_get_byname<char>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new time_get_byname<wchar_t>(name_));
+#endif
         install(new time_put_byname<char>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new time_put_byname<wchar_t>(name_));
+#endif
         install(new messages_byname<char>(name_));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
         install(new messages_byname<wchar_t>(name_));
+#endif
 #ifndef _LIBCPP_NO_EXCEPTIONS
     }
     catch (...)
@@ -287,14 +330,20 @@
         if (c & locale::collate)
         {
             install(new collate_byname<char>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new collate_byname<wchar_t>(name));
+#endif
         }
         if (c & locale::ctype)
         {
             install(new ctype_byname<char>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new ctype_byname<wchar_t>(name));
+#endif
             install(new codecvt_byname<char, char, mbstate_t>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new codecvt_byname<wchar_t, char, mbstate_t>(name));
+#endif
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
             install(new codecvt_byname<char16_t, char, mbstate_t>(name));
             install(new codecvt_byname<char32_t, char, mbstate_t>(name));
@@ -308,25 +357,35 @@
         {
             install(new moneypunct_byname<char, false>(name));
             install(new moneypunct_byname<char, true>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new moneypunct_byname<wchar_t, false>(name));
             install(new moneypunct_byname<wchar_t, true>(name));
+#endif
         }
         if (c & locale::numeric)
         {
             install(new numpunct_byname<char>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new numpunct_byname<wchar_t>(name));
+#endif
         }
         if (c & locale::time)
         {
             install(new time_get_byname<char>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new time_get_byname<wchar_t>(name));
+#endif
             install(new time_put_byname<char>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new time_put_byname<wchar_t>(name));
+#endif
         }
         if (c & locale::messages)
         {
             install(new messages_byname<char>(name));
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install(new messages_byname<wchar_t>(name));
+#endif
         }
 #ifndef _LIBCPP_NO_EXCEPTIONS
     }
@@ -364,12 +423,16 @@
         if (c & locale::collate)
         {
             install_from<_VSTD::collate<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<_VSTD::collate<wchar_t> >(one);
+#endif
         }
         if (c & locale::ctype)
         {
             install_from<_VSTD::ctype<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<_VSTD::ctype<wchar_t> >(one);
+#endif
             install_from<_VSTD::codecvt<char, char, mbstate_t> >(one);
 _LIBCPP_SUPPRESS_DEPRECATED_PUSH
             install_from<_VSTD::codecvt<char16_t, char, mbstate_t> >(one);
@@ -379,39 +442,59 @@
             install_from<_VSTD::codecvt<char16_t, char8_t, mbstate_t> >(one);
             install_from<_VSTD::codecvt<char32_t, char8_t, mbstate_t> >(one);
 #endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<_VSTD::codecvt<wchar_t, char, mbstate_t> >(one);
+#endif
         }
         if (c & locale::monetary)
         {
             install_from<moneypunct<char, false> >(one);
             install_from<moneypunct<char, true> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<moneypunct<wchar_t, false> >(one);
             install_from<moneypunct<wchar_t, true> >(one);
+#endif
             install_from<money_get<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<money_get<wchar_t> >(one);
+#endif
             install_from<money_put<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<money_put<wchar_t> >(one);
+#endif
         }
         if (c & locale::numeric)
         {
             install_from<numpunct<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<numpunct<wchar_t> >(one);
+#endif
             install_from<num_get<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<num_get<wchar_t> >(one);
+#endif
             install_from<num_put<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<num_put<wchar_t> >(one);
+#endif
         }
         if (c & locale::time)
         {
             install_from<time_get<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<time_get<wchar_t> >(one);
+#endif
             install_from<time_put<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<time_put<wchar_t> >(one);
+#endif
         }
         if (c & locale::messages)
         {
             install_from<_VSTD::messages<char> >(one);
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
             install_from<_VSTD::messages<wchar_t> >(one);
+#endif
         }
 #ifndef _LIBCPP_NO_EXCEPTIONS
     }
@@ -702,6 +785,7 @@
 
 // template <> class collate_byname<wchar_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 collate_byname<wchar_t>::collate_byname(const char* n, size_t refs)
     : collate<wchar_t>(refs),
       __l(newlocale(LC_ALL_MASK, n, 0))
@@ -747,6 +831,7 @@
     wcsxfrm_l(const_cast<wchar_t*>(out.c_str()), in.c_str(), out.size()+1, __l);
     return out;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 const ctype_base::mask ctype_base::space;
 const ctype_base::mask ctype_base::print;
@@ -763,6 +848,7 @@
 
 // template <> class ctype<wchar_t>;
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 locale::id ctype<wchar_t>::id;
 
 ctype<wchar_t>::~ctype()
@@ -892,6 +978,7 @@
             *dest = dfault;
     return low;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // template <> class ctype<char>;
 
@@ -1223,6 +1310,7 @@
 
 // template <> class ctype_byname<wchar_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 ctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs)
     : ctype<wchar_t>(refs),
       __l(newlocale(LC_ALL_MASK, name, 0))
@@ -1422,6 +1510,7 @@
     }
     return low;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // template <> class codecvt<char, char, mbstate_t>
 
@@ -1486,6 +1575,7 @@
 
 // template <> class codecvt<wchar_t, char, mbstate_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 locale::id codecvt<wchar_t, char, mbstate_t>::id;
 
 codecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs)
@@ -1698,6 +1788,7 @@
 {
     return __l == 0 ? 1 : static_cast<int>(__libcpp_mb_cur_max_l(__l));
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 //                                     Valid UTF ranges
 //     UTF-32               UTF-16                          UTF-8               # of code points
@@ -3404,6 +3495,7 @@
 
 // __codecvt_utf8<wchar_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 __codecvt_utf8<wchar_t>::result
 __codecvt_utf8<wchar_t>::do_out(state_type&,
     const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
@@ -3505,6 +3597,7 @@
     return 4;
 #endif
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // __codecvt_utf8<char16_t>
 
@@ -3658,6 +3751,7 @@
 
 // __codecvt_utf16<wchar_t, false>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 __codecvt_utf16<wchar_t, false>::result
 __codecvt_utf16<wchar_t, false>::do_out(state_type&,
     const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
@@ -3863,6 +3957,7 @@
     return 4;
 #endif
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // __codecvt_utf16<char16_t, false>
 
@@ -4166,6 +4261,7 @@
 
 // __codecvt_utf8_utf16<wchar_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 __codecvt_utf8_utf16<wchar_t>::result
 __codecvt_utf8_utf16<wchar_t>::do_out(state_type&,
     const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
@@ -4250,6 +4346,7 @@
         return 7;
     return 4;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // __codecvt_utf8_utf16<char16_t>
 
@@ -4425,7 +4522,7 @@
 {
 }
 
-
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 static bool checked_string_to_wchar_convert(wchar_t& dest,
                                             const char* ptr,
                                             locale_t loc) {
@@ -4440,6 +4537,7 @@
   dest = out;
   return true;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 static bool checked_string_to_char_convert(char& dest,
                                            const char* ptr,
@@ -4450,6 +4548,8 @@
     dest = *ptr;
     return true;
   }
+
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
   // First convert the MBS into a wide char then attempt to narrow it using
   // wctob_l.
   wchar_t wout;
@@ -4470,6 +4570,9 @@
   default:
     return false;
   }
+#else // _LIBCPP_HAS_NO_WIDE_CHARACTERS
+  return false;
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
   _LIBCPP_UNREACHABLE();
 }
 
@@ -4477,7 +4580,9 @@
 // numpunct<char> && numpunct<wchar_t>
 
 locale::id numpunct< char  >::id;
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 locale::id numpunct<wchar_t>::id;
+#endif
 
 numpunct<char>::numpunct(size_t refs)
     : locale::facet(refs),
@@ -4486,35 +4591,49 @@
 {
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 numpunct<wchar_t>::numpunct(size_t refs)
     : locale::facet(refs),
       __decimal_point_(L'.'),
       __thousands_sep_(L',')
 {
 }
+#endif
 
 numpunct<char>::~numpunct()
 {
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 numpunct<wchar_t>::~numpunct()
 {
 }
+#endif
 
  char   numpunct< char  >::do_decimal_point() const {return __decimal_point_;}
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 wchar_t numpunct<wchar_t>::do_decimal_point() const {return __decimal_point_;}
+#endif
 
  char   numpunct< char  >::do_thousands_sep() const {return __thousands_sep_;}
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 wchar_t numpunct<wchar_t>::do_thousands_sep() const {return __thousands_sep_;}
+#endif
 
 string numpunct< char  >::do_grouping() const {return __grouping_;}
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 string numpunct<wchar_t>::do_grouping() const {return __grouping_;}
+#endif
 
  string numpunct< char  >::do_truename() const {return "true";}
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 wstring numpunct<wchar_t>::do_truename() const {return L"true";}
+#endif
 
  string numpunct< char  >::do_falsename() const {return "false";}
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 wstring numpunct<wchar_t>::do_falsename() const {return L"false";}
+#endif
 
 // numpunct_byname<char>
 
@@ -4537,6 +4656,7 @@
 void
 numpunct_byname<char>::__init(const char* nm)
 {
+    typedef numpunct<char> base;
     if (strcmp(nm, "C") != 0)
     {
         __libcpp_unique_locale loc(nm);
@@ -4545,10 +4665,12 @@
                                 " failed to construct for " + string(nm));
 
         lconv* lc = __libcpp_localeconv_l(loc.get());
-        checked_string_to_char_convert(__decimal_point_, lc->decimal_point,
-                                       loc.get());
-        checked_string_to_char_convert(__thousands_sep_, lc->thousands_sep,
-                                       loc.get());
+        if (!checked_string_to_char_convert(__decimal_point_, lc->decimal_point,
+                                            loc.get()))
+            __decimal_point_ = base::do_decimal_point();
+        if (!checked_string_to_char_convert(__thousands_sep_, lc->thousands_sep,
+                                            loc.get()))
+            __thousands_sep_ = base::do_thousands_sep();
         __grouping_ = lc->grouping;
         // localization for truename and falsename is not available
     }
@@ -4556,6 +4678,7 @@
 
 // numpunct_byname<wchar_t>
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 numpunct_byname<wchar_t>::numpunct_byname(const char* nm, size_t refs)
     : numpunct<wchar_t>(refs)
 {
@@ -4591,6 +4714,7 @@
         // localization for truename and falsename is not available
     }
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // num_get helpers
 
@@ -4766,6 +4890,7 @@
     return weeks;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 static
 wstring*
 init_wweeks()
@@ -4787,6 +4912,7 @@
     weeks[13] = L"Sat";
     return weeks;
 }
+#endif
 
 template <>
 const string*
@@ -4796,6 +4922,7 @@
     return weeks;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring*
 __time_get_c_storage<wchar_t>::__weeks() const
@@ -4803,6 +4930,7 @@
     static const wstring* weeks = init_wweeks();
     return weeks;
 }
+#endif
 
 static
 string*
@@ -4836,6 +4964,7 @@
     return months;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 static
 wstring*
 init_wmonths()
@@ -4867,6 +4996,7 @@
     months[23] = L"Dec";
     return months;
 }
+#endif
 
 template <>
 const string*
@@ -4876,6 +5006,7 @@
     return months;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring*
 __time_get_c_storage<wchar_t>::__months() const
@@ -4883,6 +5014,7 @@
     static const wstring* months = init_wmonths();
     return months;
 }
+#endif
 
 static
 string*
@@ -4894,6 +5026,7 @@
     return am_pm;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 static
 wstring*
 init_wam_pm()
@@ -4903,6 +5036,7 @@
     am_pm[1]  = L"PM";
     return am_pm;
 }
+#endif
 
 template <>
 const string*
@@ -4912,6 +5046,7 @@
     return am_pm;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring*
 __time_get_c_storage<wchar_t>::__am_pm() const
@@ -4919,6 +5054,7 @@
     static const wstring* am_pm = init_wam_pm();
     return am_pm;
 }
+#endif
 
 template <>
 const string&
@@ -4928,6 +5064,7 @@
     return s;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring&
 __time_get_c_storage<wchar_t>::__x() const
@@ -4935,6 +5072,7 @@
     static wstring s(L"%m/%d/%y");
     return s;
 }
+#endif
 
 template <>
 const string&
@@ -4944,6 +5082,7 @@
     return s;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring&
 __time_get_c_storage<wchar_t>::__X() const
@@ -4951,6 +5090,7 @@
     static wstring s(L"%H:%M:%S");
     return s;
 }
+#endif
 
 template <>
 const string&
@@ -4960,6 +5100,7 @@
     return s;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring&
 __time_get_c_storage<wchar_t>::__c() const
@@ -4967,6 +5108,7 @@
     static wstring s(L"%a %b %d %H:%M:%S %Y");
     return s;
 }
+#endif
 
 template <>
 const string&
@@ -4976,6 +5118,7 @@
     return s;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 const wstring&
 __time_get_c_storage<wchar_t>::__r() const
@@ -4983,6 +5126,7 @@
     static wstring s(L"%I:%M:%S %p");
     return s;
 }
+#endif
 
 // time_get_byname
 
@@ -5161,6 +5305,7 @@
 #pragma clang diagnostic ignored "-Wmissing-braces"
 #endif
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 wstring
 __time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct)
@@ -5310,6 +5455,7 @@
     }
     return result;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <>
 void
@@ -5348,6 +5494,7 @@
     __X_ = __analyze('X', ct);
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 void
 __time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct)
@@ -5423,6 +5570,7 @@
     __x_ = __analyze('x', ct);
     __X_ = __analyze('X', ct);
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <class CharT>
 struct _LIBCPP_HIDDEN __time_get_temp
@@ -5450,6 +5598,7 @@
     init(ct);
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 __time_get_storage<wchar_t>::__time_get_storage(const char* __nm)
     : __time_get(__nm)
@@ -5465,6 +5614,7 @@
     const __time_get_temp<wchar_t> ct(__nm);
     init(ct);
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <>
 time_base::dateorder
@@ -5553,6 +5703,7 @@
     return time_base::no_order;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 time_base::dateorder
 __time_get_storage<wchar_t>::__do_date_order() const
@@ -5639,6 +5790,7 @@
     }
     return time_base::no_order;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // time_put
 
@@ -5675,6 +5827,7 @@
     __ne = __nb + n;
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 void
 __time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm,
                      char __fmt, char __mod) const
@@ -5689,6 +5842,7 @@
         __throw_runtime_error("locale not supported");
     __we = __wb + j;
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // moneypunct_byname
 
@@ -6168,6 +6322,7 @@
 #endif // !_LIBCPP_MSVCRT
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template<>
 void
 moneypunct_byname<wchar_t, false>::init(const char* nm)
@@ -6315,6 +6470,7 @@
                lc->int_n_sign_posn, L' ');
 #endif // !_LIBCPP_MSVCRT
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 void __do_nothing(void*) {}
 
@@ -6328,63 +6484,63 @@
 #endif
 }
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS collate<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS collate<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS collate<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS collate<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_get<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_get<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_get<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_get<wchar_t>;)
 
-template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_get<char>;
-template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_get<wchar_t>;
+                           template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_get<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_get<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_put<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_put<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_put<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS num_put<wchar_t>;)
 
-template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_put<char>;
-template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_put<wchar_t>;
+                           template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_put<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template struct _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __num_put<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get_byname<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get_byname<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get_byname<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_get_byname<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put_byname<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put_byname<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put_byname<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS time_put_byname<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<char, false>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<char, true>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<wchar_t, false>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<wchar_t, true>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<char, false>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<char, true>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<wchar_t, false>;)
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct<wchar_t, true>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<char, false>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<char, true>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<wchar_t, false>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<wchar_t, true>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<char, false>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<char, true>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<wchar_t, false>;)
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS moneypunct_byname<wchar_t, true>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_get<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_get<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_get<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_get<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_get<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_get<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_get<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_get<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_put<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_put<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_put<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS money_put<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_put<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_put<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_put<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __money_put<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages_byname<char>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages_byname<wchar_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages_byname<char>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS messages_byname<wchar_t>;)
 
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char, char, mbstate_t>;
-template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<wchar_t, char, mbstate_t>;
+                           template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char, char, mbstate_t>;
+_LIBCPP_IF_WIDE_CHARACTERS(template class _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<wchar_t, char, mbstate_t>;)
 template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char16_t, char, mbstate_t>;
 template class _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS codecvt_byname<char32_t, char, mbstate_t>;
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
diff --git a/src/string.cpp b/src/string.cpp
index 012b2ea..c8dae34 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -9,13 +9,16 @@
 #include "string"
 #include "charconv"
 #include "cstdlib"
-#include "cwchar"
 #include "cerrno"
 #include "limits"
 #include "stdexcept"
 #include <stdio.h>
 #include "__debug"
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include "cwchar"
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 void __basic_string_common<true>::__throw_length_error() const {
@@ -28,11 +31,15 @@
 
 #define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
 #ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
-_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
-_LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
+    _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+        _LIBCPP_STRING_UNSTABLE_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
+#   endif
 #else
-_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
-_LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
+    _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, char)
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+        _LIBCPP_STRING_V1_EXTERN_TEMPLATE_LIST(_LIBCPP_EXTERN_TEMPLATE_DEFINE, wchar_t)
+#   endif
 #endif
 #undef _LIBCPP_EXTERN_TEMPLATE_DEFINE
 
@@ -137,6 +144,7 @@
     return as_integer_helper<unsigned long long>( func, s, idx, base, strtoull );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 // wstring
 template<>
 inline
@@ -181,6 +189,7 @@
 {
     return as_integer_helper<unsigned long long>( func, s, idx, base, wcstoull );
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 // as_float
 
@@ -232,6 +241,7 @@
     return as_float_helper<long double>( func, s, idx, strtold );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template<>
 inline
 float
@@ -255,6 +265,7 @@
 {
     return as_float_helper<long double>( func, s, idx, wcstold );
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 }  // unnamed namespace
 
@@ -264,11 +275,13 @@
     return as_integer<int>( "stoi", str, idx, base );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 int
 stoi(const wstring& str, size_t* idx, int base)
 {
     return as_integer<int>( "stoi", str, idx, base );
 }
+#endif
 
 long
 stol(const string& str, size_t* idx, int base)
@@ -276,11 +289,13 @@
     return as_integer<long>( "stol", str, idx, base );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 long
 stol(const wstring& str, size_t* idx, int base)
 {
     return as_integer<long>( "stol", str, idx, base );
 }
+#endif
 
 unsigned long
 stoul(const string& str, size_t* idx, int base)
@@ -288,11 +303,13 @@
     return as_integer<unsigned long>( "stoul", str, idx, base );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 unsigned long
 stoul(const wstring& str, size_t* idx, int base)
 {
     return as_integer<unsigned long>( "stoul", str, idx, base );
 }
+#endif
 
 long long
 stoll(const string& str, size_t* idx, int base)
@@ -300,11 +317,13 @@
     return as_integer<long long>( "stoll", str, idx, base );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 long long
 stoll(const wstring& str, size_t* idx, int base)
 {
     return as_integer<long long>( "stoll", str, idx, base );
 }
+#endif
 
 unsigned long long
 stoull(const string& str, size_t* idx, int base)
@@ -312,11 +331,13 @@
     return as_integer<unsigned long long>( "stoull", str, idx, base );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 unsigned long long
 stoull(const wstring& str, size_t* idx, int base)
 {
     return as_integer<unsigned long long>( "stoull", str, idx, base );
 }
+#endif
 
 float
 stof(const string& str, size_t* idx)
@@ -324,11 +345,13 @@
     return as_float<float>( "stof", str, idx );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 float
 stof(const wstring& str, size_t* idx)
 {
     return as_float<float>( "stof", str, idx );
 }
+#endif
 
 double
 stod(const string& str, size_t* idx)
@@ -336,11 +359,13 @@
     return as_float<double>( "stod", str, idx );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 double
 stod(const wstring& str, size_t* idx)
 {
     return as_float<double>( "stod", str, idx );
 }
+#endif
 
 long double
 stold(const string& str, size_t* idx)
@@ -348,11 +373,13 @@
     return as_float<long double>( "stold", str, idx );
 }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 long double
 stold(const wstring& str, size_t* idx)
 {
     return as_float<long double>( "stold", str, idx );
 }
+#endif
 
 // to_string
 
@@ -403,6 +430,7 @@
     }
 };
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 template <>
 struct initial_string<wstring>
 {
@@ -427,6 +455,7 @@
     return static_cast<int (__cdecl*)(wchar_t* __restrict, size_t, const wchar_t*__restrict, ...)>(_snwprintf);
 #endif
 }
+#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
 
 template <typename S, typename V>
 S i_to_string(V v)
@@ -450,20 +479,23 @@
 string  to_string (unsigned long val)      { return i_to_string< string>(val); }
 string  to_string (unsigned long long val) { return i_to_string< string>(val); }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 wstring to_wstring(int val)                { return i_to_string<wstring>(val); }
 wstring to_wstring(long val)               { return i_to_string<wstring>(val); }
 wstring to_wstring(long long val)          { return i_to_string<wstring>(val); }
 wstring to_wstring(unsigned val)           { return i_to_string<wstring>(val); }
 wstring to_wstring(unsigned long val)      { return i_to_string<wstring>(val); }
 wstring to_wstring(unsigned long long val) { return i_to_string<wstring>(val); }
-
+#endif
 
 string  to_string (float val)       { return as_string(snprintf,       initial_string< string>()(),   "%f", val); }
 string  to_string (double val)      { return as_string(snprintf,       initial_string< string>()(),   "%f", val); }
 string  to_string (long double val) { return as_string(snprintf,       initial_string< string>()(),  "%Lf", val); }
 
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
 wstring to_wstring(float val)       { return as_string(get_swprintf(), initial_string<wstring>()(),  L"%f", val); }
 wstring to_wstring(double val)      { return as_string(get_swprintf(), initial_string<wstring>()(),  L"%f", val); }
 wstring to_wstring(long double val) { return as_string(get_swprintf(), initial_string<wstring>()(), L"%Lf", val); }
+#endif
 
 _LIBCPP_END_NAMESPACE_STD
diff --git a/test/libcxx/atomics/atomics.align/align.pass.cpp b/test/libcxx/atomics/atomics.align/align.pass.cpp
index 3735bb5..2e5a9c1 100644
--- a/test/libcxx/atomics/atomics.align/align.pass.cpp
+++ b/test/libcxx/atomics/atomics.align/align.pass.cpp
@@ -65,7 +65,9 @@
   CHECK_ALIGNMENT(unsigned char);
   CHECK_ALIGNMENT(char16_t);
   CHECK_ALIGNMENT(char32_t);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   CHECK_ALIGNMENT(wchar_t);
+#endif
   CHECK_ALIGNMENT(short);
   CHECK_ALIGNMENT(unsigned short);
   CHECK_ALIGNMENT(int);
diff --git a/test/libcxx/depr/depr.c.headers/extern_c.pass.cpp b/test/libcxx/depr/depr.c.headers/extern_c.pass.cpp
index acfcc90..a4a05e6 100644
--- a/test/libcxx/depr/depr.c.headers/extern_c.pass.cpp
+++ b/test/libcxx/depr/depr.c.headers/extern_c.pass.cpp
@@ -39,8 +39,10 @@
 // tgmath.h is not supported in extern "C".
 #include <time.h>
 // FIXME: #include <uchar.h>
-#include <wchar.h>
-#include <wctype.h>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include <wchar.h>
+#   include <wctype.h>
+#endif
 }
 
 int main(int, char**) {
diff --git a/test/libcxx/diagnostics/detail.headers/mbstate_t.h.module.verify.cpp b/test/libcxx/diagnostics/detail.headers/mbstate_t.h.module.verify.cpp
new file mode 100644
index 0000000..a656832
--- /dev/null
+++ b/test/libcxx/diagnostics/detail.headers/mbstate_t.h.module.verify.cpp
@@ -0,0 +1,15 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// REQUIRES: modules-build
+
+// WARNING: This test was generated by 'generate_private_header_tests.py'
+// and should not be edited manually.
+
+// expected-error@*:* {{use of private header from outside its module: '__mbstate_t.h'}}
+#include <__mbstate_t.h>
diff --git a/test/libcxx/double_include.sh.cpp b/test/libcxx/double_include.sh.cpp
index f18fc89..05286fb 100644
--- a/test/libcxx/double_include.sh.cpp
+++ b/test/libcxx/double_include.sh.cpp
@@ -74,8 +74,12 @@
 #include <ctgmath>
 #include <ctime>
 #include <ctype.h>
-#include <cwchar>
-#include <cwctype>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <cwchar>
+#endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <cwctype>
+#endif
 #include <deque>
 #include <errno.h>
 #include <exception>
@@ -191,8 +195,12 @@
 #include <variant>
 #include <vector>
 #include <version>
-#include <wchar.h>
-#include <wctype.h>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <wchar.h>
+#endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <wctype.h>
+#endif
 
 // experimental headers
 #if __cplusplus >= 201103L
diff --git a/test/libcxx/include_as_c.sh.cpp b/test/libcxx/include_as_c.sh.cpp
index 7dc3753..a3e5d53 100644
--- a/test/libcxx/include_as_c.sh.cpp
+++ b/test/libcxx/include_as_c.sh.cpp
@@ -45,8 +45,10 @@
 #ifndef _MSC_VER
 #    include <tgmath.h>
 #endif
-#include <wchar.h>
-#include <wctype.h>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#   include <wchar.h>
+#   include <wctype.h>
+#endif
 
 int main(int argc, char **argv) {
   (void)argc;
diff --git a/test/libcxx/input.output/filesystems/class.path/path.member/path.native.obs/string_alloc.pass.cpp b/test/libcxx/input.output/filesystems/class.path/path.member/path.native.obs/string_alloc.pass.cpp
index e38000e..87f9766 100644
--- a/test/libcxx/input.output/filesystems/class.path/path.member/path.native.obs/string_alloc.pass.cpp
+++ b/test/libcxx/input.output/filesystems/class.path/path.member/path.native.obs/string_alloc.pass.cpp
@@ -146,7 +146,9 @@
   {
     auto const& S = shortString;
     doShortStringTest<char>(S);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     doShortStringTest<wchar_t>(S);
+#endif
     doShortStringTest<char16_t>(S);
     doShortStringTest<char32_t>(S);
 #if TEST_STD_VER > 17 && defined(__cpp_lib_char8_t)
@@ -156,7 +158,9 @@
   {
     auto const& S = longString;
     doLongStringTest<char>(S);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     doLongStringTest<wchar_t>(S);
+#endif
     doLongStringTest<char16_t>(S);
     doLongStringTest<char32_t>(S);
 #if TEST_STD_VER > 17 && defined(__cpp_lib_char8_t)
diff --git a/test/libcxx/input.output/filesystems/class.path/path.req/is_pathable.pass.cpp b/test/libcxx/input.output/filesystems/class.path/path.req/is_pathable.pass.cpp
index 7e15864..2dbc016 100644
--- a/test/libcxx/input.output/filesystems/class.path/path.req/is_pathable.pass.cpp
+++ b/test/libcxx/input.output/filesystems/class.path/path.req/is_pathable.pass.cpp
@@ -97,7 +97,9 @@
 
 int main(int, char**) {
   MakeTestType<char>::Test();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   MakeTestType<wchar_t>::Test();
+#endif
   MakeTestType<char16_t>::Test();
   MakeTestType<char32_t>::Test();
 
diff --git a/test/libcxx/input.output/iostream.format/input.streams/traits_mismatch.fail.cpp b/test/libcxx/input.output/iostream.format/input.streams/traits_mismatch.fail.cpp
index 1013198..faa693a 100644
--- a/test/libcxx/input.output/iostream.format/input.streams/traits_mismatch.fail.cpp
+++ b/test/libcxx/input.output/iostream.format/input.streams/traits_mismatch.fail.cpp
@@ -13,6 +13,8 @@
 
 // The char type of the stream and the char_type of the traits have to match
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <istream>
 #include <type_traits>
 #include <cassert>
diff --git a/test/libcxx/input.output/iostream.format/output.streams/traits_mismatch.fail.cpp b/test/libcxx/input.output/iostream.format/output.streams/traits_mismatch.fail.cpp
index dba4c92..bf974d3 100644
--- a/test/libcxx/input.output/iostream.format/output.streams/traits_mismatch.fail.cpp
+++ b/test/libcxx/input.output/iostream.format/output.streams/traits_mismatch.fail.cpp
@@ -13,6 +13,8 @@
 
 // The char type of the stream and the char_type of the traits have to match
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <ostream>
 #include <type_traits>
 #include <cassert>
diff --git a/test/libcxx/input.output/string.streams/traits_mismatch.fail.cpp b/test/libcxx/input.output/string.streams/traits_mismatch.fail.cpp
index 60b95a7..91d992d 100644
--- a/test/libcxx/input.output/string.streams/traits_mismatch.fail.cpp
+++ b/test/libcxx/input.output/string.streams/traits_mismatch.fail.cpp
@@ -14,6 +14,8 @@
 //
 // The char type of the stream and the char_type of the traits have to match
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <sstream>
 
 int main(int, char**)
diff --git a/test/libcxx/iterators/contiguous_iterators.pass.cpp b/test/libcxx/iterators/contiguous_iterators.pass.cpp
index 71407ba..dcb573c 100644
--- a/test/libcxx/iterators/contiguous_iterators.pass.cpp
+++ b/test/libcxx/iterators/contiguous_iterators.pass.cpp
@@ -225,10 +225,12 @@
     static_assert(( std::__is_cpp17_contiguous_iterator<std::string::const_iterator>        ::value), "");
     static_assert((!std::__is_cpp17_contiguous_iterator<std::string::reverse_iterator>      ::value), "");
     static_assert((!std::__is_cpp17_contiguous_iterator<std::string::const_reverse_iterator>::value), "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert(( std::__is_cpp17_contiguous_iterator<std::wstring::iterator>              ::value), "");
     static_assert(( std::__is_cpp17_contiguous_iterator<std::wstring::const_iterator>        ::value), "");
     static_assert((!std::__is_cpp17_contiguous_iterator<std::wstring::reverse_iterator>      ::value), "");
     static_assert((!std::__is_cpp17_contiguous_iterator<std::wstring::const_reverse_iterator>::value), "");
+#endif
 
 //  deque is random-access but not contiguous
     static_assert((!std::__is_cpp17_contiguous_iterator<std::deque<int>::iterator>                   ::value), "");
diff --git a/test/libcxx/iterators/failed.pass.cpp b/test/libcxx/iterators/failed.pass.cpp
index c47101e..afb4453 100644
--- a/test/libcxx/iterators/failed.pass.cpp
+++ b/test/libcxx/iterators/failed.pass.cpp
@@ -25,10 +25,12 @@
         std::ostreambuf_iterator<char> i(nullptr);
         assert(i.failed());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::ostreambuf_iterator<wchar_t> i(nullptr);
         assert(i.failed());
     }
+#endif
 
   return 0;
 }
diff --git a/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp b/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp
index c514f6a..fa400d0 100644
--- a/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp
+++ b/test/libcxx/iterators/iterator.requirements/iterator.concepts/integer_like.compile.pass.cpp
@@ -25,7 +25,9 @@
 static_assert(std::__integer_like<long long>);
 static_assert(std::__integer_like<unsigned long long>);
 static_assert(std::__integer_like<char>);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(std::__integer_like<wchar_t>);
+#endif
 static_assert(std::__integer_like<char8_t>);
 static_assert(std::__integer_like<char16_t>);
 static_assert(std::__integer_like<char32_t>);
@@ -42,7 +44,9 @@
 static_assert(!std::__signed_integer_like<unsigned long>);
 static_assert(!std::__signed_integer_like<unsigned long long>);
 static_assert(std::__signed_integer_like<char> == std::signed_integral<char>);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(std::__signed_integer_like<wchar_t> == std::signed_integral<wchar_t>);
+#endif
 static_assert(std::__signed_integer_like<char8_t> == std::signed_integral<char8_t>);
 static_assert(std::__signed_integer_like<char16_t> == std::signed_integral<char16_t>);
 static_assert(std::__signed_integer_like<char32_t> == std::signed_integral<char32_t>);
diff --git a/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp b/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp
index dc7979d..8816227 100644
--- a/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp
+++ b/test/libcxx/localization/locales/locale.convenience/conversions/conversions.string/ctor_move.pass.cpp
@@ -9,6 +9,8 @@
 // 'do_bytes' throws a std::range_error unexpectedly
 // XFAIL: LIBCXX-WINDOWS-FIXME, powerpc-ibm-aix
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // UNSUPPORTED: c++03
 
 // <locale>
diff --git a/test/libcxx/min_max_macros.compile.pass.cpp b/test/libcxx/min_max_macros.compile.pass.cpp
index 18702d6..d1e2b90 100644
--- a/test/libcxx/min_max_macros.compile.pass.cpp
+++ b/test/libcxx/min_max_macros.compile.pass.cpp
@@ -112,10 +112,14 @@
 TEST_MACROS();
 #include <ctype.h>
 TEST_MACROS();
-#include <cwchar>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <cwchar>
 TEST_MACROS();
-#include <cwctype>
+#endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <cwctype>
 TEST_MACROS();
+#endif
 #include <deque>
 TEST_MACROS();
 #include <errno.h>
@@ -304,10 +308,14 @@
 TEST_MACROS();
 #include <version>
 TEST_MACROS();
-#include <wchar.h>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <wchar.h>
 TEST_MACROS();
-#include <wctype.h>
+#endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <wctype.h>
 TEST_MACROS();
+#endif
 
 // experimental headers
 #if __cplusplus >= 201103L
diff --git a/test/libcxx/no_assert_include.compile.pass.cpp b/test/libcxx/no_assert_include.compile.pass.cpp
index 8b5581f..9c80b40 100644
--- a/test/libcxx/no_assert_include.compile.pass.cpp
+++ b/test/libcxx/no_assert_include.compile.pass.cpp
@@ -69,8 +69,12 @@
 #include <ctgmath>
 #include <ctime>
 #include <ctype.h>
-#include <cwchar>
-#include <cwctype>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <cwchar>
+#endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <cwctype>
+#endif
 #include <deque>
 #include <errno.h>
 #include <exception>
@@ -186,8 +190,12 @@
 #include <variant>
 #include <vector>
 #include <version>
-#include <wchar.h>
-#include <wctype.h>
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <wchar.h>
+#endif
+#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
+#    include <wctype.h>
+#endif
 
 // experimental headers
 #if __cplusplus >= 201103L
diff --git a/test/libcxx/strings/c.strings/version_cwchar.pass.cpp b/test/libcxx/strings/c.strings/version_cwchar.pass.cpp
index 1e2eff5..571bdc6 100644
--- a/test/libcxx/strings/c.strings/version_cwchar.pass.cpp
+++ b/test/libcxx/strings/c.strings/version_cwchar.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // <cwchar>
 
 #include <cwchar>
diff --git a/test/libcxx/strings/c.strings/version_cwctype.pass.cpp b/test/libcxx/strings/c.strings/version_cwctype.pass.cpp
index d821980..453ceb1 100644
--- a/test/libcxx/strings/c.strings/version_cwctype.pass.cpp
+++ b/test/libcxx/strings/c.strings/version_cwctype.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // <cwctype>
 
 #include <cwctype>
diff --git a/test/libcxx/type_traits/convert_to_integral.pass.cpp b/test/libcxx/type_traits/convert_to_integral.pass.cpp
index f7152d2..d8fce1e 100644
--- a/test/libcxx/type_traits/convert_to_integral.pass.cpp
+++ b/test/libcxx/type_traits/convert_to_integral.pass.cpp
@@ -87,7 +87,9 @@
   check_integral_types<char, int>();
   check_integral_types<signed char, int>();
   check_integral_types<unsigned char, int>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   check_integral_types<wchar_t, decltype(((wchar_t)1) + 1)>();
+#endif
   check_integral_types<char16_t, int>();
   // On some platforms, unsigned int and long are the same size.  These
   // platforms have a choice of making uint32_t an int or a long.  However
diff --git a/test/libcxx/utilities/format/format.arguments/format.arg/visit_format_arg.pass.cpp b/test/libcxx/utilities/format/format.arguments/format.arg/visit_format_arg.pass.cpp
index 03c177b..b6e34d7 100644
--- a/test/libcxx/utilities/format/format.arguments/format.arg/visit_format_arg.pass.cpp
+++ b/test/libcxx/utilities/format/format.arguments/format.arg/visit_format_arg.pass.cpp
@@ -350,7 +350,9 @@
 
 void test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 }
 
 int main(int, char**) {
diff --git a/test/libcxx/utilities/format/format.arguments/format.args/get.pass.cpp b/test/libcxx/utilities/format/format.arguments/format.args/get.pass.cpp
index 37116c5..6f8035b 100644
--- a/test/libcxx/utilities/format/format.arguments/format.args/get.pass.cpp
+++ b/test/libcxx/utilities/format/format.arguments/format.args/get.pass.cpp
@@ -304,7 +304,9 @@
 
 void test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 }
 
 int main(int, char**) {
diff --git a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_bool.pass.cpp b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_bool.pass.cpp
index c6fdbee..c32d363 100644
--- a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_bool.pass.cpp
+++ b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_bool.pass.cpp
@@ -430,7 +430,9 @@
 
 constexpr bool test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 
   return true;
 }
@@ -440,10 +442,12 @@
   // Make sure the parsers match the expectations. The layout of the
   // subobjects is chosen to minimize the size required.
   static_assert(sizeof(Parser<char>) == 2 * sizeof(uint32_t));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   static_assert(
       sizeof(Parser<wchar_t>) ==
       (sizeof(wchar_t) <= 2 ? 2 * sizeof(uint32_t) : 3 * sizeof(uint32_t)));
 #endif
+#endif // _WIN32
 
   test();
   static_assert(test());
diff --git a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_char.pass.cpp b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_char.pass.cpp
index 07c5bbb..876c7d2 100644
--- a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_char.pass.cpp
+++ b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_char.pass.cpp
@@ -428,7 +428,9 @@
 
 constexpr bool test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 
   return true;
 }
@@ -440,10 +442,12 @@
   // Make sure the parsers match the expectations. The layout of the
   // subobjects is chosen to minimize the size required.
   static_assert(sizeof(Parser<char>) == 2 * sizeof(uint32_t));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   static_assert(
       sizeof(Parser<wchar_t>) ==
       (sizeof(wchar_t) <= 2 ? 2 * sizeof(uint32_t) : 3 * sizeof(uint32_t)));
 #endif
+#endif // _WIN32
 
   test();
   static_assert(test());
diff --git a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_integer.pass.cpp b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_integer.pass.cpp
index d7c3d6a..652c2ca 100644
--- a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_integer.pass.cpp
+++ b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_integer.pass.cpp
@@ -323,7 +323,9 @@
 
 constexpr bool test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 
   return true;
 }
@@ -333,10 +335,12 @@
   // Make sure the parsers match the expectations. The layout of the
   // subobjects is chosen to minimize the size required.
   static_assert(sizeof(Parser<char>) == 2 * sizeof(uint32_t));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   static_assert(
       sizeof(Parser<wchar_t>) ==
       (sizeof(wchar_t) <= 2 ? 2 * sizeof(uint32_t) : 3 * sizeof(uint32_t)));
 #endif
+#endif // _WIN32
 
   test();
   static_assert(test());
diff --git a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string.pass.cpp b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string.pass.cpp
index 53753d0..930a6b4 100644
--- a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string.pass.cpp
+++ b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string.pass.cpp
@@ -351,7 +351,9 @@
 
 constexpr bool test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<char8_t>();
 #endif
@@ -368,10 +370,12 @@
   // Make sure the parsers match the expectations. The layout of the
   // subobjects is chosen to minimize the size required.
   LIBCPP_STATIC_ASSERT(sizeof(Parser<char>) == 3 * sizeof(uint32_t));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   LIBCPP_STATIC_ASSERT(
       sizeof(Parser<wchar_t>) ==
       (sizeof(wchar_t) <= 2 ? 3 * sizeof(uint32_t) : 4 * sizeof(uint32_t)));
 #endif
+#endif // _WIN32
 
   test();
   static_assert(test());
diff --git a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_non_unicode.pass.cpp b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_non_unicode.pass.cpp
index 51c0826..f2d3381 100644
--- a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_non_unicode.pass.cpp
+++ b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_non_unicode.pass.cpp
@@ -91,7 +91,9 @@
 
 constexpr bool test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<char8_t>();
 #endif
diff --git a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_unicode.pass.cpp b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_unicode.pass.cpp
index 8109331..f6337a0 100644
--- a/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_unicode.pass.cpp
+++ b/test/libcxx/utilities/format/format.string/format.string.std/std_format_spec_string_unicode.pass.cpp
@@ -251,7 +251,9 @@
 
 constexpr bool test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<char8_t>();
 #endif
diff --git a/test/std/atomics/atomics.types.generic/integral.pass.cpp b/test/std/atomics/atomics.types.generic/integral.pass.cpp
index 5f23be8..b585f45 100644
--- a/test/std/atomics/atomics.types.generic/integral.pass.cpp
+++ b/test/std/atomics/atomics.types.generic/integral.pass.cpp
@@ -183,7 +183,9 @@
     test<std::atomic_char16_t, char16_t>();
     test<std::atomic_char32_t, char32_t>();
 #endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::atomic_wchar_t, wchar_t>();
+#endif
 
     test<std::atomic_int8_t,    int8_t>();
     test<std::atomic_uint8_t,  uint8_t>();
@@ -209,7 +211,9 @@
     test<volatile std::atomic_char16_t, char16_t>();
     test<volatile std::atomic_char32_t, char32_t>();
 #endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<volatile std::atomic_wchar_t, wchar_t>();
+#endif
 
     test<volatile std::atomic_int8_t,    int8_t>();
     test<volatile std::atomic_uint8_t,  uint8_t>();
diff --git a/test/std/atomics/atomics.types.generic/integral_typedefs.pass.cpp b/test/std/atomics/atomics.types.generic/integral_typedefs.pass.cpp
index 56e0dec..6ae1fa6 100644
--- a/test/std/atomics/atomics.types.generic/integral_typedefs.pass.cpp
+++ b/test/std/atomics/atomics.types.generic/integral_typedefs.pass.cpp
@@ -56,7 +56,9 @@
     static_assert((std::is_same<std::atomic<unsigned long>, std::atomic_ulong>::value), "");
     static_assert((std::is_same<std::atomic<long long>, std::atomic_llong>::value), "");
     static_assert((std::is_same<std::atomic<unsigned long long>, std::atomic_ullong>::value), "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert((std::is_same<std::atomic<wchar_t>, std::atomic_wchar_t>::value), "");
+#endif
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
     static_assert((std::is_same<std::atomic<char8_t>, std::atomic_char8_t>::value), "");
 #endif
diff --git a/test/std/atomics/types.pass.cpp b/test/std/atomics/types.pass.cpp
index e3f1a43..21ff0d3 100644
--- a/test/std/atomics/types.pass.cpp
+++ b/test/std/atomics/types.pass.cpp
@@ -118,7 +118,9 @@
 #endif
     test<char16_t>           ();
     test<char32_t>           ();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>            ();
+#endif
 
     test<int_least8_t>   ();
     test<uint_least8_t>  ();
diff --git a/test/std/concepts/concepts.lang/concept.default.init/default_initializable.compile.pass.cpp b/test/std/concepts/concepts.lang/concept.default.init/default_initializable.compile.pass.cpp
index 930282f..57d3132 100644
--- a/test/std/concepts/concepts.lang/concept.default.init/default_initializable.compile.pass.cpp
+++ b/test/std/concepts/concepts.lang/concept.default.init/default_initializable.compile.pass.cpp
@@ -236,14 +236,18 @@
 
     // Strings
     test_true     <std::string>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test_true     <std::wstring>();
+#endif
     test_true     <std::u8string>();
     test_true     <std::u16string>();
     test_true     <std::u32string>();
 
     // String views
     test_true     <std::string_view>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test_true     <std::wstring_view>();
+#endif
     test_true     <std::u8string_view>();
     test_true     <std::u16string_view>();
     test_true     <std::u32string_view>();
diff --git a/test/std/depr/depr.c.headers/stdint_h.pass.cpp b/test/std/depr/depr.c.headers/stdint_h.pass.cpp
index 36f0ae8..37945ee 100644
--- a/test/std/depr/depr.c.headers/stdint_h.pass.cpp
+++ b/test/std/depr/depr.c.headers/stdint_h.pass.cpp
@@ -11,7 +11,6 @@
 #include <stdint.h>
 #include <cstddef>
 #include <csignal>
-#include <cwctype>
 #include <climits>
 #include <type_traits>
 #include <limits>
@@ -19,6 +18,10 @@
 
 #include "test_macros.h"
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   include <cwctype>
+#endif
+
 int main(int, char**)
 {
     // typedef int8_t
@@ -238,6 +241,7 @@
     // SIZE_MAX
     assert(SIZE_MAX == std::numeric_limits<size_t>::max());
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     // WCHAR_MIN
     assert(WCHAR_MIN == std::numeric_limits<wchar_t>::min());
 
@@ -249,6 +253,7 @@
 
     // WINT_MAX
     assert(WINT_MAX == std::numeric_limits<wint_t>::max());
+#endif
 
 #ifndef INT8_C
 #error INT8_C not defined
diff --git a/test/std/depr/depr.c.headers/wchar_h.pass.cpp b/test/std/depr/depr.c.headers/wchar_h.pass.cpp
index de05a2d..e5b8c2c 100644
--- a/test/std/depr/depr.c.headers/wchar_h.pass.cpp
+++ b/test/std/depr/depr.c.headers/wchar_h.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // <wchar.h>
 
 #include <wchar.h>
diff --git a/test/std/depr/depr.c.headers/wctype_h.pass.cpp b/test/std/depr/depr.c.headers/wctype_h.pass.cpp
index 8ec5bbd..1738c6c 100644
--- a/test/std/depr/depr.c.headers/wctype_h.pass.cpp
+++ b/test/std/depr/depr.c.headers/wctype_h.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // <wctype.h>
 
 #include <wctype.h>
diff --git a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp
index 429388c..a4210d0 100644
--- a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp
+++ b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.cons/ostream_joiner.cons.pass.cpp
@@ -28,33 +28,40 @@
 int main(int, char**) {
     const char eight = '8';
     const std::string nine = "9";
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     const std::wstring ten = L"10";
+#endif
     const int eleven = 11;
 
-//  Narrow streams w/rvalues
+    // Narrow streams w/rvalues
     { exper::ostream_joiner<char>         oj(std::cout, '8'); }
     { exper::ostream_joiner<std::string>  oj(std::cout, std::string("9")); }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<std::wstring> oj(std::cout, std::wstring(L"10")); }
+#endif
     { exper::ostream_joiner<int>          oj(std::cout, 11); }
 
-//  Narrow streams w/lvalues
+    // Narrow streams w/lvalues
     { exper::ostream_joiner<char>         oj(std::cout, eight); }
     { exper::ostream_joiner<std::string>  oj(std::cout, nine); }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<std::wstring> oj(std::cout, ten); }
+#endif
     { exper::ostream_joiner<int>          oj(std::cout, eleven); }
 
-//  Wide streams w/rvalues
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    // Wide streams w/rvalues
     { exper::ostream_joiner<char, wchar_t>         oj(std::wcout, '8'); }
     { exper::ostream_joiner<std::string, wchar_t>  oj(std::wcout, std::string("9")); }
     { exper::ostream_joiner<std::wstring, wchar_t> oj(std::wcout, std::wstring(L"10")); }
     { exper::ostream_joiner<int, wchar_t>          oj(std::wcout, 11); }
 
-//  Wide streams w/lvalues
+    // Wide streams w/lvalues
     { exper::ostream_joiner<char, wchar_t>         oj(std::wcout, eight); }
     { exper::ostream_joiner<std::string, wchar_t>  oj(std::wcout, nine); }
     { exper::ostream_joiner<std::wstring, wchar_t> oj(std::wcout, ten); }
     { exper::ostream_joiner<int, wchar_t>          oj(std::wcout, eleven); }
-
+#endif
 
   return 0;
 }
diff --git a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp
index 44604d4..2007473 100644
--- a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp
+++ b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.assign.pass.cpp
@@ -85,8 +85,10 @@
     test("Z", chars, chars+10, "0Z1Z2Z3Z4Z5Z6Z7Z8Z9");
     test("z", ints,  ints+10,  "10z11z12z13z14z15z16z17z18z19");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<char, const char *, wchar_t> ('X', chars, chars+10, L"0X1X2X3X4X5X6X7X8X9");
     test<char, const int *,  wchar_t> ('x',  ints,  ints+10, L"10x11x12x13x14x15x16x17x18x19");
+#endif
 //  test<char, const char *, char16_t>('X', chars, chars+10, u"0X1X2X3X4X5X6X7X8X9");
 //  test<char, const int *,  char16_t>('x',  ints,  ints+10, u"10x11x12x13x14x15x16x17x18x19");
 //  test<char, const char *, char32_t>('X', chars, chars+10, U"0X1X2X3X4X5X6X7X8X9");
@@ -96,6 +98,7 @@
     test(mutating_delimiter2(), chars, chars+10, "0 1!2\"3#4$5%6&7'8(9");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     const wchar_t chars[] = L"0123456789";
     const int  ints [] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 };
@@ -116,7 +119,7 @@
 
     test(mutating_delimiter(), chars, chars+10, L"0 1!2\"3#4$5%6&7'8(9");
     }
-
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp
index 9d9457b..774ee36 100644
--- a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp
+++ b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.postincrement.pass.cpp
@@ -36,13 +36,17 @@
 
     { exper::ostream_joiner<char>         oj(std::cout, '8');                 test(oj); }
     { exper::ostream_joiner<std::string>  oj(std::cout, std::string("9"));    test(oj); }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<std::wstring> oj(std::cout, std::wstring(L"10")); test(oj); }
+#endif
     { exper::ostream_joiner<int>          oj(std::cout, 11);                  test(oj); }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<char, wchar_t>         oj(std::wcout, '8');                 test(oj); }
     { exper::ostream_joiner<std::string, wchar_t>  oj(std::wcout, std::string("9"));    test(oj); }
     { exper::ostream_joiner<std::wstring, wchar_t> oj(std::wcout, std::wstring(L"10")); test(oj); }
     { exper::ostream_joiner<int, wchar_t>          oj(std::wcout, 11);                  test(oj); }
+#endif
 
   return 0;
 }
diff --git a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp
index f03fbb0..d8929c4 100644
--- a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp
+++ b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.pretincrement.pass.cpp
@@ -36,13 +36,17 @@
 
     { exper::ostream_joiner<char>         oj(std::cout, '8');                 test(oj); }
     { exper::ostream_joiner<std::string>  oj(std::cout, std::string("9"));    test(oj); }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<std::wstring> oj(std::cout, std::wstring(L"10")); test(oj); }
+#endif
     { exper::ostream_joiner<int>          oj(std::cout, 11);                  test(oj); }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<char, wchar_t>         oj(std::wcout, '8');                 test(oj); }
     { exper::ostream_joiner<std::string, wchar_t>  oj(std::wcout, std::string("9"));    test(oj); }
     { exper::ostream_joiner<std::wstring, wchar_t> oj(std::wcout, std::wstring(L"10")); test(oj); }
     { exper::ostream_joiner<int, wchar_t>          oj(std::wcout, 11);                  test(oj); }
+#endif
 
   return 0;
 }
diff --git a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp
index 6e54879..a0804cc 100644
--- a/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp
+++ b/test/std/experimental/iterator/ostream.joiner/ostream.joiner.ops/ostream_joiner.op.star.pass.cpp
@@ -36,13 +36,17 @@
 
     { exper::ostream_joiner<char>         oj(std::cout, '8');                 test(oj); }
     { exper::ostream_joiner<std::string>  oj(std::cout, std::string("9"));    test(oj); }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<std::wstring> oj(std::cout, std::wstring(L"10")); test(oj); }
+#endif
     { exper::ostream_joiner<int>          oj(std::cout, 11);                  test(oj); }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     { exper::ostream_joiner<char, wchar_t>         oj(std::wcout, '8');                 test(oj); }
     { exper::ostream_joiner<std::string, wchar_t>  oj(std::wcout, std::string("9"));    test(oj); }
     { exper::ostream_joiner<std::wstring, wchar_t> oj(std::wcout, std::wstring(L"10")); test(oj); }
     { exper::ostream_joiner<int, wchar_t>          oj(std::wcout, 11);                  test(oj); }
+#endif
 
   return 0;
 }
diff --git a/test/std/experimental/memory/memory.resource.aliases/header_regex_synop.pass.cpp b/test/std/experimental/memory/memory.resource.aliases/header_regex_synop.pass.cpp
index d407378..7d5c263 100644
--- a/test/std/experimental/memory/memory.resource.aliases/header_regex_synop.pass.cpp
+++ b/test/std/experimental/memory/memory.resource.aliases/header_regex_synop.pass.cpp
@@ -45,9 +45,11 @@
 {
     {
         test_match_result_typedef<const char*, pmr::cmatch>();
-        test_match_result_typedef<const wchar_t*, pmr::wcmatch>();
         test_match_result_typedef<pmr::string::const_iterator, pmr::smatch>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+        test_match_result_typedef<const wchar_t*, pmr::wcmatch>();
         test_match_result_typedef<pmr::wstring::const_iterator, pmr::wsmatch>();
+#endif
     }
     {
         // Check that std::match_results has been included and is complete.
diff --git a/test/std/experimental/memory/memory.resource.aliases/header_string_synop.pass.cpp b/test/std/experimental/memory/memory.resource.aliases/header_string_synop.pass.cpp
index 326ca78..95cb8e5 100644
--- a/test/std/experimental/memory/memory.resource.aliases/header_string_synop.pass.cpp
+++ b/test/std/experimental/memory/memory.resource.aliases/header_string_synop.pass.cpp
@@ -54,13 +54,17 @@
 {
     {
         test_string_typedef<char,     pmr::string>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         test_string_typedef<wchar_t,  pmr::wstring>();
+#endif
         test_string_typedef<char16_t, pmr::u16string>();
         test_string_typedef<char32_t, pmr::u32string>();
     }
     {
         test_basic_string_alias<char,    constexpr_char_traits<char>>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         test_basic_string_alias<wchar_t, constexpr_char_traits<wchar_t>>();
+#endif
         test_basic_string_alias<char16_t, constexpr_char_traits<char16_t>>();
         test_basic_string_alias<char32_t, constexpr_char_traits<char32_t>>();
     }
diff --git a/test/std/input.output/file.streams/c.files/cinttypes.pass.cpp b/test/std/input.output/file.streams/c.files/cinttypes.pass.cpp
index 5a49bb8..6b76efd 100644
--- a/test/std/input.output/file.streams/c.files/cinttypes.pass.cpp
+++ b/test/std/input.output/file.streams/c.files/cinttypes.pass.cpp
@@ -927,8 +927,10 @@
     static_assert((std::is_same<decltype(std::imaxdiv(i, i)), std::imaxdiv_t>::value), "");
     static_assert((std::is_same<decltype(std::strtoimax("", (char**)0, 0)), std::intmax_t>::value), "");
     static_assert((std::is_same<decltype(std::strtoumax("", (char**)0, 0)), std::uintmax_t>::value), "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert((std::is_same<decltype(std::wcstoimax(L"", (wchar_t**)0, 0)), std::intmax_t>::value), "");
     static_assert((std::is_same<decltype(std::wcstoumax(L"", (wchar_t**)0, 0)), std::uintmax_t>::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.assign/member_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.assign/member_swap.pass.cpp
index c4e67c1..6febc69 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.assign/member_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.assign/member_swap.pass.cpp
@@ -36,6 +36,8 @@
         assert(f2.sgetc() == '2');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfilebuf f;
         assert(f.open(temp.c_str(), std::ios_base::out | std::ios_base::in
@@ -51,6 +53,7 @@
         assert(f2.sgetc() == L'2');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.assign/move_assign.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.assign/move_assign.pass.cpp
index 173c9d1..863fd3e 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.assign/move_assign.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.assign/move_assign.pass.cpp
@@ -36,6 +36,8 @@
         assert(f2.sgetc() == '2');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfilebuf f;
         assert(f.open(temp.c_str(), std::ios_base::out | std::ios_base::in
@@ -51,6 +53,7 @@
         assert(f2.sgetc() == L'2');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.assign/nonmember_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.assign/nonmember_swap.pass.cpp
index 4b7ec47..4ae3fc2 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.assign/nonmember_swap.pass.cpp
@@ -38,6 +38,8 @@
         assert(f2.sgetc() == '2');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfilebuf f;
         assert(f.open(temp.c_str(), std::ios_base::out | std::ios_base::in
@@ -53,6 +55,7 @@
         assert(f2.sgetc() == L'2');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.cons/default.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.cons/default.pass.cpp
index 5808690..f012fe7 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.cons/default.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.cons/default.pass.cpp
@@ -24,10 +24,12 @@
         std::filebuf f;
         assert(!f.is_open());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfilebuf f;
         assert(!f.is_open());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.cons/move.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.cons/move.pass.cpp
index 38aba56..f618e43 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.cons/move.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.cons/move.pass.cpp
@@ -35,6 +35,8 @@
         assert(f2.sgetc() == '2');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfilebuf f;
         assert(f.open(temp.c_str(), std::ios_base::out | std::ios_base::in
@@ -49,6 +51,7 @@
         assert(f2.sgetc() == L'2');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.members/open_path.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.members/open_path.pass.cpp
index cf85296..81749cf 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.members/open_path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.members/open_path.pass.cpp
@@ -42,6 +42,8 @@
     assert(f.sbumpc() == '3');
   }
   std::remove(p.string().c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wfilebuf f;
     assert(f.open(p, std::ios_base::out) != 0);
@@ -56,7 +58,8 @@
     assert(f.sbumpc() == L'2');
     assert(f.sbumpc() == L'3');
   }
-  remove(p.string().c_str());
+  std::remove(p.string().c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp
index 8b95988..388d452 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.members/open_pointer.pass.cpp
@@ -33,6 +33,8 @@
         assert(f.sbumpc() == '3');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfilebuf f;
         assert(f.open(temp.c_str(), std::ios_base::out) != 0);
@@ -47,7 +49,8 @@
         assert(f.sbumpc() == L'2');
         assert(f.sbumpc() == L'3');
     }
-    remove(temp.c_str());
+    std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.virtuals/overflow.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.virtuals/overflow.pass.cpp
index 69ab278..d4f8f0f 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.virtuals/overflow.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.virtuals/overflow.pass.cpp
@@ -80,6 +80,8 @@
         assert(f.sgetc() == 'a');
     }
     std::remove("overflow.dat");
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test_buf<wchar_t> f;
         assert(f.open("overflow.dat", std::ios_base::out) != 0);
@@ -143,6 +145,7 @@
         assert(f.sbumpc() == -1);
     }
     std::remove("overflow.dat");
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.virtuals/seekoff.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.virtuals/seekoff.pass.cpp
index f9e8938..475974e 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.virtuals/seekoff.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.virtuals/seekoff.pass.cpp
@@ -43,6 +43,8 @@
         assert(f.sgetc() == 'l');
     }
     std::remove("seekoff.dat");
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         wchar_t buf[10];
         typedef std::filebuf::pos_type pos_type;
@@ -64,6 +66,7 @@
         assert(f.sgetc() == L'l');
     }
     std::remove("seekoff.dat");
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/filebuf.virtuals/underflow.pass.cpp b/test/std/input.output/file.streams/fstreams/filebuf.virtuals/underflow.pass.cpp
index 1954ffa..7adc07d 100644
--- a/test/std/input.output/file.streams/fstreams/filebuf.virtuals/underflow.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/filebuf.virtuals/underflow.pass.cpp
@@ -78,6 +78,7 @@
         assert(*f.gptr() == '9');
         assert(f.egptr() - f.gptr() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test_buf<wchar_t> f;
         assert(f.open("underflow.dat", std::ios_base::in) != 0);
@@ -125,6 +126,7 @@
         assert(f.sbumpc() == 0x4E53);
         assert(f.sbumpc() == static_cast<Traits::int_type>(-1));
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp
index d08ca9e..392fc40 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp
@@ -65,6 +65,8 @@
     }
     std::remove(temp1.c_str());
     std::remove(temp2.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs1(temp1.c_str(), std::ios_base::in | std::ios_base::out
                                                    | std::ios_base::trunc);
@@ -88,6 +90,7 @@
     }
     std::remove(temp1.c_str());
     std::remove(temp2.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.assign/move_assign.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.assign/move_assign.pass.cpp
index 9bc7887..90a7cf6 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.assign/move_assign.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.assign/move_assign.pass.cpp
@@ -33,6 +33,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fso(temp.c_str(), std::ios_base::in | std::ios_base::out
                                                   | std::ios_base::trunc);
@@ -45,6 +47,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp
index e222392..287716f 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp
@@ -67,6 +67,8 @@
     }
     std::remove(temp1.c_str());
     std::remove(temp2.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs1(temp1.c_str(), std::ios_base::in | std::ios_base::out
                                                    | std::ios_base::trunc);
@@ -90,6 +92,7 @@
     }
     std::remove(temp1.c_str());
     std::remove(temp2.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.cons/default.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.cons/default.pass.cpp
index ac74678..5749de2 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.cons/default.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.cons/default.pass.cpp
@@ -23,9 +23,11 @@
     {
         std::fstream fs;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs;
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.cons/move.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.cons/move.pass.cpp
index e210b56..b282e7f 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.cons/move.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.cons/move.pass.cpp
@@ -32,6 +32,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fso(temp, std::ios_base::in | std::ios_base::out
                                                   | std::ios_base::trunc);
@@ -43,6 +45,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp
index 364fe72..6714e62 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.cons/path.pass.cpp
@@ -40,6 +40,8 @@
     assert(x == 3.25);
   }
   std::remove(p.string().c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wfstream fs(p, std::ios_base::in | std::ios_base::out |
                             std::ios_base::trunc);
@@ -50,6 +52,7 @@
     assert(x == 3.25);
   }
   std::remove(p.string().c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp
index 5ecdcc5..63f8b04 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.cons/pointer.pass.cpp
@@ -31,6 +31,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs(temp.c_str(), std::ios_base::in | std::ios_base::out
                                                  | std::ios_base::trunc);
@@ -41,6 +43,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.cons/string.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.cons/string.pass.cpp
index d07926a..80b3fe4 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.cons/string.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.cons/string.pass.cpp
@@ -32,6 +32,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs(temp,
                          std::ios_base::in | std::ios_base::out
@@ -43,6 +45,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.members/close.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.members/close.pass.cpp
index ac708d1..d1ab079 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.members/close.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.members/close.pass.cpp
@@ -30,6 +30,8 @@
         assert(!fs.is_open());
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs;
         assert(!fs.is_open());
@@ -39,6 +41,7 @@
         assert(!fs.is_open());
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.members/open_path.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.members/open_path.pass.cpp
index 824201a..e44dde9 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.members/open_path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.members/open_path.pass.cpp
@@ -40,6 +40,8 @@
     assert(x == 3.25);
   }
   std::remove(p.string().c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wfstream stream;
     assert(!stream.is_open());
@@ -53,6 +55,7 @@
     assert(x == 3.25);
   }
   std::remove(p.string().c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp
index a406c6a..acfc282 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.members/open_pointer.pass.cpp
@@ -34,6 +34,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs;
         assert(!fs.is_open());
@@ -47,6 +49,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.members/open_string.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.members/open_string.pass.cpp
index 854b668..8ee0fe4 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.members/open_string.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.members/open_string.pass.cpp
@@ -34,6 +34,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs;
         assert(!fs.is_open());
@@ -47,6 +49,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/fstream.members/rdbuf.pass.cpp b/test/std/input.output/file.streams/fstreams/fstream.members/rdbuf.pass.cpp
index 2d86c25..7216b08 100644
--- a/test/std/input.output/file.streams/fstreams/fstream.members/rdbuf.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/fstream.members/rdbuf.pass.cpp
@@ -24,10 +24,13 @@
         std::fstream fs;
         assert(fs.rdbuf());
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wfstream fs;
         assert(fs.rdbuf());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.assign/member_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.assign/member_swap.pass.cpp
index 7a5d9c1..0115959 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.assign/member_swap.pass.cpp
@@ -32,6 +32,7 @@
         fs2 >> x;
         assert(x == 3.25);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs1("test.dat");
         std::wifstream fs2("test2.dat");
@@ -42,6 +43,7 @@
         fs2 >> x;
         assert(x == 3.25);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.assign/move_assign.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.assign/move_assign.pass.cpp
index 439db87..abb3863 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.assign/move_assign.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.assign/move_assign.pass.cpp
@@ -30,6 +30,7 @@
         fs >> x;
         assert(x == 3.25);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fso("test.dat");
         std::wifstream fs;
@@ -38,6 +39,7 @@
         fs >> x;
         assert(x == 3.25);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.assign/nonmember_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.assign/nonmember_swap.pass.cpp
index f04c5e4..f22193d 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.assign/nonmember_swap.pass.cpp
@@ -33,6 +33,7 @@
         fs2 >> x;
         assert(x == 3.25);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs1("test.dat");
         std::wifstream fs2("test2.dat");
@@ -43,6 +44,7 @@
         fs2 >> x;
         assert(x == 3.25);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.cons/default.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.cons/default.pass.cpp
index e4fffa7..043db15 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.cons/default.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.cons/default.pass.cpp
@@ -23,9 +23,11 @@
     {
         std::ifstream fs;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs;
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.cons/move.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.cons/move.pass.cpp
index 28f55f6..f21943a 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.cons/move.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.cons/move.pass.cpp
@@ -29,6 +29,7 @@
         fs >> x;
         assert(x == 3.25);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fso("test.dat");
         std::wifstream fs = std::move(fso);
@@ -36,6 +37,7 @@
         fs >> x;
         assert(x == 3.25);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp
index aef3014..9864376 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.cons/path.pass.cpp
@@ -48,6 +48,8 @@
   // std::ifstream(const fs::path&, std::ios_base::openmode) is tested in
   // test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
   // which creates writable files.
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wifstream fs(fs::path("test.dat"));
     double x = 0;
@@ -57,6 +59,7 @@
   // std::wifstream(const fs::path&, std::ios_base::openmode) is tested in
   // test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
   // which creates writable files.
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.cons/pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.cons/pointer.pass.cpp
index e667425..bd08804 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.cons/pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.cons/pointer.pass.cpp
@@ -31,6 +31,8 @@
     // std::ifstream(const char*, std::ios_base::openmode) is tested in
     // test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp
     // which creates writable files.
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs("test.dat");
         double x = 0;
@@ -40,6 +42,7 @@
     // std::wifstream(const char*, std::ios_base::openmode) is tested in
     // test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp
     // which creates writable files.
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.cons/string.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.cons/string.pass.cpp
index f0e9625..ae7976b 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.cons/string.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.cons/string.pass.cpp
@@ -31,6 +31,8 @@
     // std::ifstream(const std::string&, std::ios_base::openmode) is tested in
     // test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
     // which creates writable files.
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs(std::string("test.dat"));
         double x = 0;
@@ -40,6 +42,7 @@
     // std::wifstream(const std::string&, std::ios_base::openmode) is tested in
     // test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
     // which creates writable files.
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.members/close.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.members/close.pass.cpp
index 3641dfd..534e66e 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.members/close.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.members/close.pass.cpp
@@ -30,6 +30,7 @@
         fs.close();
         assert(!fs.is_open());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs;
         assert(!fs.is_open());
@@ -38,6 +39,7 @@
         fs.close();
         assert(!fs.is_open());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.members/open_path.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.members/open_path.pass.cpp
index 2bb46b8..67f741e 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.members/open_path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.members/open_path.pass.cpp
@@ -40,6 +40,7 @@
     fs >> c;
     assert(c == 'r');
   }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wifstream fs;
     assert(!fs.is_open());
@@ -52,6 +53,7 @@
     fs >> c;
     assert(c == L'r');
   }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.members/open_pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.members/open_pointer.pass.cpp
index 4626f96..ebd9909 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.members/open_pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.members/open_pointer.pass.cpp
@@ -34,6 +34,7 @@
         fs >> c;
         assert(c == 'r');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs;
         assert(!fs.is_open());
@@ -46,6 +47,7 @@
         fs >> c;
         assert(c == L'r');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.members/open_string.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.members/open_string.pass.cpp
index 35722d5..f50cc96 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.members/open_string.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.members/open_string.pass.cpp
@@ -34,6 +34,7 @@
         fs >> c;
         assert(c == 'r');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs;
         assert(!fs.is_open());
@@ -46,6 +47,7 @@
         fs >> c;
         assert(c == L'r');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ifstream.members/rdbuf.pass.cpp b/test/std/input.output/file.streams/fstreams/ifstream.members/rdbuf.pass.cpp
index aa6cbb2..c51a807 100644
--- a/test/std/input.output/file.streams/fstreams/ifstream.members/rdbuf.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ifstream.members/rdbuf.pass.cpp
@@ -27,11 +27,13 @@
         std::filebuf* fb = fs.rdbuf();
         assert(fb->sgetc() == 'r');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wifstream fs("test.dat");
         std::wfilebuf* fb = fs.rdbuf();
         assert(fb->sgetc() == L'r');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp
index 4917bbf..37cb0a6 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp
@@ -69,6 +69,8 @@
         assert(x == 3.25);
     }
     std::remove(temp2.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs1(temp1.c_str());
         std::wofstream fs2(temp2.c_str());
@@ -96,6 +98,7 @@
         assert(x == 3.25);
     }
     std::remove(temp2.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.assign/move_assign.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.assign/move_assign.pass.cpp
index 4db1e6c..71e57a1 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.assign/move_assign.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.assign/move_assign.pass.cpp
@@ -34,6 +34,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fso(temp.c_str());
         std::wofstream fs;
@@ -47,6 +49,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp
index 1ee265a..831d53c 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp
@@ -70,6 +70,8 @@
         assert(x == 3.25);
     }
     std::remove(temp2.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs1(temp1.c_str());
         std::wofstream fs2(temp2.c_str());
@@ -97,6 +99,7 @@
         assert(x == 3.25);
     }
     std::remove(temp2.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.cons/default.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.cons/default.pass.cpp
index 1b0ad82..3470133 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.cons/default.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.cons/default.pass.cpp
@@ -23,9 +23,11 @@
     {
         std::ofstream fs;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs;
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.cons/move.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.cons/move.pass.cpp
index 01676f0..a06ad43 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.cons/move.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.cons/move.pass.cpp
@@ -33,6 +33,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fso(temp.c_str());
         std::wofstream fs = std::move(fso);
@@ -45,6 +47,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp
index 5dc1f74..3a8be7f 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.cons/path.pass.cpp
@@ -53,6 +53,8 @@
     assert(x == 3.25);
   }
   std::remove(p.string().c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wofstream stream(p);
     stream << 3.25;
@@ -70,6 +72,7 @@
     assert(x == 3.25);
   }
   std::remove(p.string().c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp
index a00f763..b43f0ff 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.cons/pointer.pass.cpp
@@ -38,6 +38,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs(temp.c_str());
         fs << 3.25;
@@ -55,6 +57,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
index bd81f19..4c0823e 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.cons/string.pass.cpp
@@ -38,6 +38,8 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs(temp);
         fs << 3.25;
@@ -55,6 +57,7 @@
         assert(x == 3.25);
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.members/close.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.members/close.pass.cpp
index 21c362a..bcab4b3 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.members/close.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.members/close.pass.cpp
@@ -30,6 +30,8 @@
         assert(!fs.is_open());
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs;
         assert(!fs.is_open());
@@ -39,6 +41,7 @@
         assert(!fs.is_open());
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.members/open_path.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.members/open_path.pass.cpp
index 2c8fa8a..36f81df 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.members/open_path.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.members/open_path.pass.cpp
@@ -46,6 +46,8 @@
     assert(c == 'a');
   }
   std::remove(p.string().c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wofstream fs;
     assert(!fs.is_open());
@@ -63,6 +65,7 @@
     assert(c == L'a');
   }
   std::remove(p.string().c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp
index eb39065..6b9d157 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.members/open_pointer.pass.cpp
@@ -38,6 +38,8 @@
         assert(c == 'a');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs;
         assert(!fs.is_open());
@@ -55,6 +57,7 @@
         assert(c == L'a');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.members/open_string.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.members/open_string.pass.cpp
index e817bbe..61bd22b 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.members/open_string.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.members/open_string.pass.cpp
@@ -38,6 +38,8 @@
         assert(c == 'a');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs;
         assert(!fs.is_open());
@@ -55,6 +57,7 @@
         assert(c == L'a');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/file.streams/fstreams/ofstream.members/rdbuf.pass.cpp b/test/std/input.output/file.streams/fstreams/ofstream.members/rdbuf.pass.cpp
index dab7e32..6af8665 100644
--- a/test/std/input.output/file.streams/fstreams/ofstream.members/rdbuf.pass.cpp
+++ b/test/std/input.output/file.streams/fstreams/ofstream.members/rdbuf.pass.cpp
@@ -27,12 +27,15 @@
         assert(fb->sputc('r') == 'r');
     }
     std::remove(temp.c_str());
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wofstream fs(temp.c_str());
         std::wfilebuf* fb = fs.rdbuf();
         assert(fb->sputc(L'r') == L'r');
     }
     std::remove(temp.c_str());
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
index 5157161..799c89c 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.append.pass.cpp
@@ -386,14 +386,18 @@
       assert(&Res == &LHS);
     }
     doAppendSourceTest<char>    (TC);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     doAppendSourceTest<wchar_t> (TC);
+#endif
     doAppendSourceTest<char16_t>(TC);
     doAppendSourceTest<char32_t>(TC);
   }
   for (auto const & TC : LongLHSCases) {
     (void)TC;
     LIBCPP_ONLY(doAppendSourceAllocTest<char>(TC));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     LIBCPP_ONLY(doAppendSourceAllocTest<wchar_t>(TC));
+#endif
   }
   test_sfinae();
 
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.assign/source.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.assign/source.pass.cpp
index def6c43..235c3c6 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.assign/source.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.assign/source.pass.cpp
@@ -236,7 +236,9 @@
 int main(int, char**) {
   for (auto const& MS : PathList) {
     RunTestCase<char>(MS);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     RunTestCase<wchar_t>(MS);
+#endif
     RunTestCase<char16_t>(MS);
     RunTestCase<char32_t>(MS);
     RunStringMoveTest(MS);
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.charconv.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.charconv.pass.cpp
index 4f9dc26..f8e8da4 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.charconv.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.charconv.pass.cpp
@@ -39,11 +39,6 @@
 #include "test_macros.h"
 #include "filesystem_test_helper.h"
 
-// libstdc++ doesn't define conversions from/to wchar_t outside of windows.
-#if defined(__GLIBCXX__) && !defined(_WIN32)
-#  define HAS_NO_WCHAR
-#endif
-
 // Test conversion with strings that fit within the latin1 charset, that fit
 // within one code point in UTF-16, and that can be expressible in certain
 // one-byte code pages.
@@ -57,7 +52,7 @@
 #else
   const char u8str[] = { char(0xc3), char(0xa5), char(0xc3), char(0xa4), char(0xc3), char(0xb6), 0x00 };
 #endif
-#ifndef HAS_NO_WCHAR
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   const wchar_t wstr[] = { 0xe5, 0xe4, 0xf6, 0x00 };
 #endif
 
@@ -112,7 +107,7 @@
     assert(p.string<char8_t>() == u8str);
   }
 #endif
-#ifndef HAS_NO_WCHAR
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   // Test conversion to/from wchar_t.
   {
     const fs::path p(u16str);
@@ -132,7 +127,7 @@
     assert(p.u32string() == u32str);
     assert(p.string<wchar_t>() == wstr);
   }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 #ifndef _WIN32
   // Test conversion to/from regular char-based string. On POSIX, this
   // is implied to convert to/from UTF-8.
@@ -226,14 +221,13 @@
     assert(p.u16string() == u16str);
     assert(p.u32string() == u32str);
   }
-#if !defined(HAS_NO_WCHAR) && defined(__SIZEOF_WCHAR_T__)
-#if __SIZEOF_WCHAR_T__ == 2
+#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && defined(__SIZEOF_WCHAR_T__)
+# if __SIZEOF_WCHAR_T__ == 2
   const wchar_t wstr[] = { 0xd801, 0xdc37, 0x00 };
-#else
+# else
   const wchar_t wstr[] = { 0x10437, 0x00 };
-#endif
+# endif
   // Test conversion to/from wchar_t.
-  // libstdc++ doesn't define conversions from/to wchar_t outside of windows.
   {
     const fs::path p = fs::u8path(str);
     assert(p.wstring() == wstr);
@@ -253,7 +247,7 @@
     assert(p.u32string() == u32str);
     assert(p.wstring() == wstr);
   }
-#endif
+#endif // !defined(TEST_HAS_NO_WIDE_CHARACTERS) && defined(__SIZEOF_WCHAR_T__)
 }
 
 // Test appending paths in different encodings.
@@ -273,14 +267,13 @@
     p /= u32str;
     assert(p.u32string() == u32ref);
   }
-#if !defined(HAS_NO_WCHAR) && defined(__SIZEOF_WCHAR_T__)
-#if __SIZEOF_WCHAR_T__ == 2
+#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && defined(__SIZEOF_WCHAR_T__)
+# if __SIZEOF_WCHAR_T__ == 2
   const wchar_t wstr[] = { 0xd801, 0xdc37, 0x00 };
-#else
+# else
   const wchar_t wstr[] = { 0x10437, 0x00 };
-#endif
+# endif
   // Test conversion from wchar_t.
-  // libstdc++ doesn't define conversions from/to wchar_t outside of windows.
   {
     fs::path p = fs::path(u16str) / wstr / u32str;
     assert(p.u32string() == u32ref);
@@ -291,7 +284,7 @@
     p /= u32str;
     assert(p.u32string() == u32ref);
   }
-#endif
+#endif // !defined(TEST_HAS_NO_WIDE_CHARACTERS) && defined(__SIZEOF_WCHAR_T__)
 }
 
 static void test_concat()
@@ -308,14 +301,13 @@
     p = fs::u8path(str).concat(u16str).concat(u32str);
     assert(p.u32string() == u32ref);
   }
-#if !defined(HAS_NO_WCHAR) && defined(__SIZEOF_WCHAR_T__)
-#if __SIZEOF_WCHAR_T__ == 2
+#if !defined(TEST_HAS_NO_WIDE_CHARACTERS) && defined(__SIZEOF_WCHAR_T__)
+# if __SIZEOF_WCHAR_T__ == 2
   const wchar_t wstr[] = { 0xd801, 0xdc37, 0x00 };
-#else
+# else
   const wchar_t wstr[] = { 0x10437, 0x00 };
-#endif
+# endif
   // Test conversion from wchar_t.
-  // libstdc++ doesn't define conversions from/to wchar_t outside of windows.
   {
     fs::path p = fs::path(u16str);
     p += wstr;
@@ -324,7 +316,7 @@
     p = fs::path(u16str).concat(wstr).concat(u32str);
     assert(p.u32string() == u32ref);
   }
-#endif
+#endif // !defined(TEST_HAS_NO_WIDE_CHARACTERS) && defined(__SIZEOF_WCHAR_T__)
 }
 
 static void test_append_concat_narrow()
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.concat.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.concat.pass.cpp
index 6212e1d..3442e30 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.concat.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.concat.pass.cpp
@@ -361,7 +361,9 @@
       assert(&Ref == &LHS);
     }
     doConcatSourceTest<char>    (TC);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     doConcatSourceTest<wchar_t> (TC);
+#endif
     doConcatSourceTest<char16_t>(TC);
     doConcatSourceTest<char32_t>(TC);
   }
@@ -392,11 +394,15 @@
       assert(LHS == E);
     }
     LIBCPP_ONLY(doConcatSourceAllocTest<char>(TC));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     LIBCPP_ONLY(doConcatSourceAllocTest<wchar_t>(TC));
+#endif
   }
   for (auto const& TC : CharTestCases) {
     doConcatECharTest<char>(TC);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     doConcatECharTest<wchar_t>(TC);
+#endif
     doConcatECharTest<char16_t>(TC);
     doConcatECharTest<char32_t>(TC);
   }
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.construct/source.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.construct/source.pass.cpp
index f689769..64cebeb 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.construct/source.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.construct/source.pass.cpp
@@ -129,7 +129,9 @@
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
     RunTestCase<char8_t>(MS);
 #endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     RunTestCase<wchar_t>(MS);
+#endif
     RunTestCase<char16_t>(MS);
     RunTestCase<char32_t>(MS);
   }
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/generic_string_alloc.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/generic_string_alloc.pass.cpp
index 8034e22..7d8893a 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/generic_string_alloc.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/generic_string_alloc.pass.cpp
@@ -62,7 +62,9 @@
 int main(int, char**)
 {
   doAllocTest<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   doAllocTest<wchar_t>();
+#endif
   doAllocTest<char16_t>();
   doAllocTest<char32_t>();
 #if TEST_STD_VER > 17 && defined(__cpp_lib_char8_t)
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/named_overloads.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/named_overloads.pass.cpp
index d899159..bc547e5 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/named_overloads.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.generic.obs/named_overloads.pass.cpp
@@ -62,10 +62,12 @@
     assert(s == (const char*)MS);
 #endif
   }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wstring s = p.generic_wstring();
     assert(s == (const wchar_t*)MS);
   }
+#endif
   {
     std::u16string s = p.generic_u16string();
     assert(s == (const char16_t*)MS);
diff --git a/test/std/input.output/filesystems/class.path/path.member/path.native.obs/named_overloads.pass.cpp b/test/std/input.output/filesystems/class.path/path.member/path.native.obs/named_overloads.pass.cpp
index 05075a3..6611da4 100644
--- a/test/std/input.output/filesystems/class.path/path.member/path.native.obs/named_overloads.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.member/path.native.obs/named_overloads.pass.cpp
@@ -56,10 +56,12 @@
     assert(s == (const char*)MS);
 #endif
   }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   {
     std::wstring s = p.wstring();
     assert(s == (const wchar_t*)MS);
   }
+#endif
   {
     std::u16string s = p.u16string();
     assert(s == (const char16_t*)MS);
diff --git a/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp b/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
index 7c60ae2..5729671 100644
--- a/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
+++ b/test/std/input.output/filesystems/class.path/path.nonmember/path.io.pass.cpp
@@ -36,8 +36,6 @@
 MultiStringType InStr =  MKSTR("abcdefg/\"hijklmnop\"/qrstuvwxyz/123456789");
 MultiStringType OutStr = MKSTR("\"abcdefg/\\\"hijklmnop\\\"/qrstuvwxyz/123456789\"");
 
-
-
 template <class CharT>
 void doIOTest() {
   using namespace fs;
@@ -83,15 +81,19 @@
 struct is_istreamable : decltype(impl::is_istreamable_imp<Stream, Tp>(0)) {};
 
 void test_LWG2989() {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   static_assert(!is_ostreamable<decltype(std::cout), std::wstring>::value, "");
   static_assert(!is_ostreamable<decltype(std::wcout), std::string>::value, "");
   static_assert(!is_istreamable<decltype(std::cin), std::wstring>::value, "");
   static_assert(!is_istreamable<decltype(std::wcin), std::string>::value, "");
+#endif
 }
 
 int main(int, char**) {
   doIOTest<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   doIOTest<wchar_t>();
+#endif
   //doIOTest<char16_t>();
   //doIOTest<char32_t>();
   test_LWG2989();
diff --git a/test/std/input.output/iostream.format/ext.manip/get_money.pass.cpp b/test/std/input.output/iostream.format/ext.manip/get_money.pass.cpp
index a2934b2..e6cce94 100644
--- a/test/std/input.output/iostream.format/ext.manip/get_money.pass.cpp
+++ b/test/std/input.output/iostream.format/ext.manip/get_money.pass.cpp
@@ -59,6 +59,7 @@
         is >> std::get_money(x, true);
         assert(x == -123456789);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  -$1,234,567.89");
         std::wistream is(&sb);
@@ -75,6 +76,7 @@
         is >> std::get_money(x, true);
         assert(x == -123456789);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/ext.manip/get_time.pass.cpp b/test/std/input.output/iostream.format/ext.manip/get_time.pass.cpp
index 7fd353c..addf53f 100644
--- a/test/std/input.output/iostream.format/ext.manip/get_time.pass.cpp
+++ b/test/std/input.output/iostream.format/ext.manip/get_time.pass.cpp
@@ -57,6 +57,7 @@
         assert(is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  Sat Dec 31 23:55:59 2061");
         std::wistream is(&sb);
@@ -73,6 +74,7 @@
         assert(is.eof());
         assert(!is.fail());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/ext.manip/put_money.pass.cpp b/test/std/input.output/iostream.format/ext.manip/put_money.pass.cpp
index acb4552..1678412 100644
--- a/test/std/input.output/iostream.format/ext.manip/put_money.pass.cpp
+++ b/test/std/input.output/iostream.format/ext.manip/put_money.pass.cpp
@@ -73,6 +73,7 @@
         os << std::put_money(x, true);
         assert(sb.str() == "-USD 1,234,567.89");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
@@ -91,6 +92,7 @@
         os << std::put_money(x, true);
         assert(sb.str() == L"-USD 1,234,567.89");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/ext.manip/put_time.pass.cpp b/test/std/input.output/iostream.format/ext.manip/put_time.pass.cpp
index 6208967..7de93be 100644
--- a/test/std/input.output/iostream.format/ext.manip/put_time.pass.cpp
+++ b/test/std/input.output/iostream.format/ext.manip/put_time.pass.cpp
@@ -69,6 +69,7 @@
         os << std::put_time(&t, "%a %b %d %H:%M:%S %Y");
         assert(sb.str() == "Sat Dec 31 23:55:59 2061");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
@@ -84,6 +85,7 @@
         os << std::put_time(&t, L"%a %b %d %H:%M:%S %Y");
         assert(sb.str() == L"Sat Dec 31 23:55:59 2061");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/member_swap.pass.cpp b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/member_swap.pass.cpp
index 00e44f9..a1fbc7d 100644
--- a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/member_swap.pass.cpp
@@ -60,6 +60,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb1;
         testbuf<wchar_t> sb2;
@@ -83,6 +84,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/move_assign.pass.cpp b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/move_assign.pass.cpp
index fb1f524..b8b2f01 100644
--- a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/move_assign.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.assign/move_assign.pass.cpp
@@ -63,6 +63,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb1;
         testbuf<wchar_t> sb2;
@@ -86,6 +87,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/move.pass.cpp b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/move.pass.cpp
index 2a4e1a6..c1761fc 100644
--- a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/move.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/move.pass.cpp
@@ -56,6 +56,7 @@
         assert(is.precision() == 6);
         assert(is.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         test_iostream<wchar_t> is1(&sb);
@@ -72,6 +73,7 @@
         assert(is.precision() == 6);
         assert(is.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/streambuf.pass.cpp b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/streambuf.pass.cpp
index 012737f..e30560e 100644
--- a/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/streambuf.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/iostreamclass/iostream.cons/streambuf.pass.cpp
@@ -40,6 +40,7 @@
         assert(is.getloc().name() == "C");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_iostream<wchar_t> is(&sb);
@@ -53,6 +54,7 @@
         assert(is.getloc().name() == "C");
         assert(is.gcount() == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/bool.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/bool.pass.cpp
index ea354a4..fa14790 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/bool.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/bool.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 1 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/double.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/double.pass.cpp
index a3f977b..85d13b3 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/double.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/double.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -123.5 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/float.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/float.pass.cpp
index 2d68dfd..44ba89a 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/float.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/float.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -123.5 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/int.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/int.pass.cpp
index 563b8d2..5ab4515 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/int.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/int.pass.cpp
@@ -70,6 +70,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -1234567890123456 ");
         std::wistream is(&sb);
@@ -79,6 +80,7 @@
         assert(!is.eof());
         assert( is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long.pass.cpp
index 5d00260..4af8578 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -123 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_double.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_double.pass.cpp
index ed198d5..e7d7074 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_double.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_double.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -123.5 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_long.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_long.pass.cpp
index d6ccc11..e13237c 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_long.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/long_long.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -123 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/pointer.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/pointer.pass.cpp
index 9b9fab8..f3b5bba 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/pointer.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/pointer.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 1 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
     {
         testbuf<char> sb("12345678");
         std::istream is(&sb);
@@ -87,6 +89,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"12345678");
         std::wistream is(&sb);
@@ -96,6 +99,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/short.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/short.pass.cpp
index dbecc33..4f9c1a1 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/short.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/short.pass.cpp
@@ -70,6 +70,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" -1234567890 ");
         std::wistream is(&sb);
@@ -79,6 +80,7 @@
         assert(!is.eof());
         assert( is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_int.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_int.pass.cpp
index d0ad521..64bafa1 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_int.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_int.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long.pass.cpp
index 984c188..764ca34 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long_long.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long_long.pass.cpp
index a67ae60..25dface 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long_long.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_long_long.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_short.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_short.pass.cpp
index 7157c88..e01cd3d 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_short.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream.formatted.arithmetic/unsigned_short.pass.cpp
@@ -69,6 +69,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123 ");
         std::wistream is(&sb);
@@ -78,6 +79,7 @@
         assert(!is.eof());
         assert(!is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/chart.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/chart.pass.cpp
index 15f26fc..ca7df06 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/chart.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/chart.pass.cpp
@@ -67,6 +67,7 @@
         assert(!is.fail());
         assert(c == 'c');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"   abc");
         std::wistream is(&sb);
@@ -84,6 +85,7 @@
         assert(!is.fail());
         assert(c == L'c');
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
@@ -103,6 +105,7 @@
         assert(is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -121,6 +124,7 @@
         assert(is.eof());
         assert(threw);
     }
+#endif
     {
         testbuf<char> sb;
         std::basic_istream<char> is(&sb);
@@ -139,6 +143,7 @@
         assert(is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -157,6 +162,7 @@
         assert(is.eof());
         assert(threw);
     }
+#endif
 #endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/streambuf.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/streambuf.pass.cpp
index d71f295..ff96d12 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/streambuf.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/streambuf.pass.cpp
@@ -86,6 +86,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -102,6 +103,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#endif
 
     {
         testbuf<char> sb;
@@ -119,6 +121,7 @@
         assert( is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -135,6 +138,7 @@
         assert( is.eof());
         assert( is.fail());
     }
+#endif
 
     {
         testbuf<char> sb;
@@ -151,6 +155,7 @@
         assert(!is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -167,6 +172,7 @@
         assert( is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/wchar_t_pointer.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/wchar_t_pointer.pass.cpp
index 117a0ba..736849b 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/wchar_t_pointer.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.formatted/istream_extractors/wchar_t_pointer.pass.cpp
@@ -61,6 +61,7 @@
         assert(std::string(s) == "abc");
     }
 #endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"   abcdefghijk    ");
         std::wistream is(&sb);
@@ -93,6 +94,7 @@
         assert(std::wstring(s) == L"abc");
     }
 #endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<char> sb("   abcdefghijk");
         std::istream is(&sb);
@@ -135,6 +137,7 @@
         assert(is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -154,6 +157,7 @@
         assert(is.eof());
         assert(threw);
     }
+#endif
     {
         testbuf<char> sb;
         std::basic_istream<char> is(&sb);
@@ -173,6 +177,7 @@
         assert(is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -192,6 +197,7 @@
         assert(is.eof());
         assert(threw);
     }
+#endif
 #endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
diff --git a/test/std/input.output/iostream.format/input.streams/istream.manip/ws.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.manip/ws.pass.cpp
index 0eaf58b..96c3b74 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.manip/ws.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.manip/ws.pass.cpp
@@ -49,6 +49,7 @@
         assert(is.good());
         assert(is.peek() == '1');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"   123");
         std::wistream is(&sb);
@@ -56,6 +57,7 @@
         assert(is.good());
         assert(is.peek() == L'1');
     }
+#endif
     {
         testbuf<char> sb("  ");
         std::istream is(&sb);
@@ -66,6 +68,7 @@
         assert(is.eof());
         assert(is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  ");
         std::wistream is(&sb);
@@ -76,6 +79,7 @@
         assert(is.eof());
         assert(is.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb("  ");
@@ -94,6 +98,7 @@
         assert( is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  ");
         std::basic_istream<wchar_t> is(&sb);
@@ -111,7 +116,8 @@
         assert( is.eof());
         assert(threw);
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp
index a2fe4e8..23ad80e 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.rvalue/rvalue.pass.cpp
@@ -63,6 +63,7 @@
         assert(&result == &is);
         assert(i.value == 123);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"   123");
         Int i = {0};
@@ -71,6 +72,7 @@
         assert(&result == &is);
         assert(i.value == 123);
     }
+#endif
     {
         // test perfect forwarding
         assert(called == false);
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp
index 91ae104..18a29da 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get.pass.cpp
@@ -75,6 +75,7 @@
         assert(c == 'c');
         assert(is.gcount() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" abc");
         std::wistream is(&sb);
@@ -99,6 +100,7 @@
         assert(c == L'c');
         assert(is.gcount() == 1);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb("rrrrrrrrr");
@@ -121,6 +123,7 @@
         assert( is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"rrrrrrrrr");
         std::basic_istream<wchar_t> is(&sb);
@@ -143,6 +146,7 @@
         assert(threw);
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_chart.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_chart.pass.cpp
index fb3c2d0..7dd808e 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_chart.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_chart.pass.cpp
@@ -77,6 +77,7 @@
         assert(c == 'c');
         assert(is.gcount() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" abc");
         std::wistream is(&sb);
@@ -102,6 +103,7 @@
         assert(c == L'c');
         assert(is.gcount() == 1);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb("rrrrrrrrr");
@@ -125,6 +127,7 @@
         assert( is.eof());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"rrrrrrrrr");
         std::basic_istream<wchar_t> is(&sb);
@@ -147,7 +150,8 @@
         assert( is.eof());
         assert(threw);
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size.pass.cpp
index b3af36e..76e860f 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size.pass.cpp
@@ -79,6 +79,7 @@
         assert(std::string(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  \n    \n ");
         std::wistream is(&sb);
@@ -113,6 +114,7 @@
         assert(std::wstring(s) == L"");
         assert(is.gcount() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -132,6 +134,7 @@
         assert(std::string(s) == " ");
         assert(is.gcount() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -150,6 +153,7 @@
         assert(std::wstring(s) == L" ");
         assert(is.gcount() == 1);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         testbuf<char> sb;
@@ -169,6 +173,7 @@
         assert(std::basic_string<char>(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -187,7 +192,8 @@
         assert(std::basic_string<wchar_t>(s) == L"");
         assert(is.gcount() == 0);
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_HAS_NO_EXCEPTIONS
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size_chart.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size_chart.pass.cpp
index 11b820e..38b5163 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size_chart.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_pointer_size_chart.pass.cpp
@@ -79,6 +79,7 @@
         assert(std::string(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  *    * ");
         std::wistream is(&sb);
@@ -113,6 +114,7 @@
         assert(std::wstring(s) == L"");
         assert(is.gcount() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -132,6 +134,7 @@
         assert(std::basic_string<char>(s) == " ");
         assert(is.gcount() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -150,6 +153,7 @@
         assert(std::basic_string<wchar_t>(s) == L" ");
         assert(is.gcount() == 1);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         testbuf<char> sb;
@@ -169,6 +173,7 @@
         assert(std::basic_string<char>(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -187,7 +192,8 @@
         assert(std::basic_string<wchar_t>(s) == L"");
         assert(is.gcount() == 0);
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_HAS_NO_EXCEPTIONS
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf.pass.cpp
index 8067792..a6c6687 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf.pass.cpp
@@ -73,6 +73,7 @@
         assert(!is.fail());
         assert(is.gcount() == 3);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"testing\n...");
         std::wistream is(&sb);
@@ -88,6 +89,7 @@
         assert(!is.fail());
         assert(is.gcount() == 3);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -105,6 +107,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -121,6 +124,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#endif
 
     {
         testbuf<char> sb;
@@ -138,6 +142,7 @@
         assert( is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -155,6 +160,7 @@
         assert( is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf_chart.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf_chart.pass.cpp
index dceb06a..27d9ed8 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf_chart.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/get_streambuf_chart.pass.cpp
@@ -73,6 +73,7 @@
         assert(!is.fail());
         assert(is.gcount() == 3);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"testing*...");
         std::wistream is(&sb);
@@ -88,6 +89,7 @@
         assert(!is.fail());
         assert(is.gcount() == 3);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -105,6 +107,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -121,6 +124,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         testbuf<char> sb;
@@ -138,6 +142,7 @@
         assert( is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -154,7 +159,8 @@
         assert( is.eof());
         assert( is.fail());
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size.pass.cpp
index 44fa595..6e0d8b0 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size.pass.cpp
@@ -71,6 +71,7 @@
         assert(std::string(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  \n    \n ");
         std::wistream is(&sb);
@@ -97,6 +98,7 @@
         assert(std::wstring(s) == L"");
         assert(is.gcount() == 0);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -116,6 +118,7 @@
         assert(std::basic_string<char>(s) == " ");
         assert(is.gcount() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -134,6 +137,7 @@
         assert(std::basic_string<wchar_t>(s) == L" ");
         assert(is.gcount() == 1);
     }
+#endif
 
     {
         testbuf<char> sb;
@@ -153,6 +157,7 @@
         assert(std::basic_string<char>(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -172,6 +177,7 @@
         assert(is.gcount() == 0);
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size_chart.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size_chart.pass.cpp
index 72bc2a4..d07e74c 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size_chart.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/getline_pointer_size_chart.pass.cpp
@@ -71,6 +71,7 @@
         assert(std::string(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"  *    * ");
         std::wistream is(&sb);
@@ -97,6 +98,7 @@
         assert(std::wstring(s) == L"");
         assert(is.gcount() == 0);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -116,6 +118,7 @@
         assert(std::basic_string<char>(s) == " ");
         assert(is.gcount() == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -134,6 +137,7 @@
         assert(std::basic_string<wchar_t>(s) == L" ");
         assert(is.gcount() == 1);
     }
+#endif
 
     {
         testbuf<char> sb;
@@ -153,6 +157,7 @@
         assert(std::basic_string<char>(s) == "");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -172,6 +177,7 @@
         assert(is.gcount() == 0);
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/ignore.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/ignore.pass.cpp
index 0d0b4a8..0f1edcd 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/ignore.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/ignore.pass.cpp
@@ -60,6 +60,7 @@
         assert(!is.fail());
         assert(is.gcount() == 6);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 1\n2345\n6");
         std::wistream is(&sb);
@@ -76,6 +77,7 @@
         assert(!is.fail());
         assert(is.gcount() == 6);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb(" ");
@@ -92,6 +94,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" ");
         std::basic_istream<wchar_t> is(&sb);
@@ -108,6 +111,7 @@
         assert(!is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/peek.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/peek.pass.cpp
index be9600c..2ca7016 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/peek.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/peek.pass.cpp
@@ -55,6 +55,7 @@
         assert(!is.fail());
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 1\n2345\n6");
         std::wistream is(&sb);
@@ -68,6 +69,7 @@
         assert(!is.fail());
         assert(is.gcount() == 0);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
@@ -84,6 +86,7 @@
         assert( is.eof());
         assert(!is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -100,6 +103,7 @@
         assert(!is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/putback.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/putback.pass.cpp
index 588c0a6..cb57b89 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/putback.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/putback.pass.cpp
@@ -64,6 +64,7 @@
         assert(is.bad());
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
@@ -87,6 +88,7 @@
         assert(is.bad());
         assert(is.gcount() == 0);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
@@ -103,6 +105,7 @@
         assert(!is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -119,6 +122,7 @@
         assert( is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/read.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/read.pass.cpp
index 2e6c2a2..5f8c455 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/read.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/read.pass.cpp
@@ -61,6 +61,7 @@
         assert( is.fail());
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
@@ -80,6 +81,7 @@
         assert( is.fail());
         assert(is.gcount() == 0);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
@@ -97,6 +99,7 @@
         assert( is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -114,6 +117,7 @@
         assert( is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/readsome.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/readsome.pass.cpp
index e2fe378..3c523bb 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/readsome.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/readsome.pass.cpp
@@ -62,6 +62,7 @@
         assert(std::string(s, 1) == "0");
         assert(is.readsome(s, 5) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 1234567890");
         std::wistream is(&sb);
@@ -83,6 +84,7 @@
         assert(std::wstring(s, 1) == L"0");
         assert(is.readsome(s, 5) == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg.pass.cpp
index fc442d4..7bbbf94 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg.pass.cpp
@@ -56,6 +56,7 @@
         is.seekg(-1);
         assert(is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
@@ -64,6 +65,7 @@
         is.seekg(-1);
         assert(is.fail());
     }
+#endif
     {
         testbuf<char> sb(" 123456789");
         std::istream is(&sb);
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg_off.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg_off.pass.cpp
index d9412bf..a5aaf21 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg_off.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/seekg_off.pass.cpp
@@ -64,6 +64,7 @@
         assert(is.fail());
         assert(seekoff_called == 2);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
@@ -74,6 +75,7 @@
         assert(is.fail());
         assert(seekoff_called == 4);
     }
+#endif
     {
         testbuf<char> sb(" 123456789");
         std::istream is(&sb);
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
index bc808fb..ec1195d 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/sync.pass.cpp
@@ -91,12 +91,14 @@
         assert(is.sync() == 0);
         assert(sync_called == 1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
         assert(is.sync() == 0);
         assert(sync_called == 2);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         throwing_testbuf<char> sb(" 123456789");
@@ -113,6 +115,7 @@
         assert( is.fail());
         assert(threw);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         throwing_testbuf<wchar_t> sb(L" 123456789");
         std::basic_istream<wchar_t> is(&sb);
@@ -129,6 +132,7 @@
         assert(threw);
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/tellg.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/tellg.pass.cpp
index 32a7787..816e400 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/tellg.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/tellg.pass.cpp
@@ -56,11 +56,13 @@
         std::istream is(&sb);
         assert(is.tellg() == 5);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
         assert(is.tellg() == 5);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream.unformatted/unget.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream.unformatted/unget.pass.cpp
index b48ff86..eddfaa8 100644
--- a/test/std/input.output/iostream.format/input.streams/istream.unformatted/unget.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream.unformatted/unget.pass.cpp
@@ -60,6 +60,7 @@
         assert(is.bad());
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L" 123456789");
         std::wistream is(&sb);
@@ -79,6 +80,7 @@
         assert(is.bad());
         assert(is.gcount() == 0);
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         testbuf<char> sb;
@@ -95,6 +97,7 @@
         assert(!is.eof());
         assert( is.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -111,6 +114,7 @@
         assert( is.fail());
     }
 #endif
+#endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream/istream.assign/member_swap.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream/istream.assign/member_swap.pass.cpp
index 0e6cdbb..64ddcf2 100644
--- a/test/std/input.output/iostream.format/input.streams/istream/istream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream/istream.assign/member_swap.pass.cpp
@@ -60,6 +60,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb1;
         testbuf<wchar_t> sb2;
@@ -83,6 +84,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream/istream.assign/move_assign.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream/istream.assign/move_assign.pass.cpp
index 7899c63..fd79726 100644
--- a/test/std/input.output/iostream.format/input.streams/istream/istream.assign/move_assign.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream/istream.assign/move_assign.pass.cpp
@@ -63,6 +63,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb1;
         testbuf<wchar_t> sb2;
@@ -86,6 +87,7 @@
         assert(is2.precision() == 6);
         assert(is2.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream/istream.cons/move.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream/istream.cons/move.pass.cpp
index fb071ba..4f46ff5 100644
--- a/test/std/input.output/iostream.format/input.streams/istream/istream.cons/move.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream/istream.cons/move.pass.cpp
@@ -54,6 +54,7 @@
         assert(is.precision() == 6);
         assert(is.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         test_istream<wchar_t> is1(&sb);
@@ -70,6 +71,7 @@
         assert(is.precision() == 6);
         assert(is.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream/istream.cons/streambuf.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream/istream.cons/streambuf.pass.cpp
index 669c1c9..b2b428e 100644
--- a/test/std/input.output/iostream.format/input.streams/istream/istream.cons/streambuf.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream/istream.cons/streambuf.pass.cpp
@@ -40,6 +40,7 @@
         assert(is.getloc().name() == "C");
         assert(is.gcount() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -53,6 +54,7 @@
         assert(is.getloc().name() == "C");
         assert(is.gcount() == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/input.streams/istream/istream_sentry/ctor.pass.cpp b/test/std/input.output/iostream.format/input.streams/istream/istream_sentry/ctor.pass.cpp
index f4e8437..fa094d7 100644
--- a/test/std/input.output/iostream.format/input.streams/istream/istream_sentry/ctor.pass.cpp
+++ b/test/std/input.output/iostream.format/input.streams/istream/istream_sentry/ctor.pass.cpp
@@ -62,14 +62,6 @@
         assert(sync_called == 0);
     }
     {
-        std::wistream is((testbuf<wchar_t>*)0);
-        std::wistream::sentry sen(is, true);
-        assert(!(bool)sen);
-        assert(!is.good());
-        assert(is.gcount() == 0);
-        assert(sync_called == 0);
-    }
-    {
         testbuf<char> sb("   123");
         std::istream is(&sb);
         std::istream::sentry sen(is, true);
@@ -80,16 +72,6 @@
         assert(sb.gptr() == sb.eback());
     }
     {
-        testbuf<wchar_t> sb(L"   123");
-        std::wistream is(&sb);
-        std::wistream::sentry sen(is, true);
-        assert((bool)sen);
-        assert(is.good());
-        assert(is.gcount() == 0);
-        assert(sync_called == 0);
-        assert(sb.gptr() == sb.eback());
-    }
-    {
         testbuf<char> sb("   123");
         std::istream is(&sb);
         std::istream::sentry sen(is);
@@ -99,15 +81,6 @@
         assert(sb.gptr() == sb.eback() + 3);
     }
     {
-        testbuf<wchar_t> sb(L"   123");
-        std::wistream is(&sb);
-        std::wistream::sentry sen(is);
-        assert((bool)sen);
-        assert(is.good());
-        assert(sync_called == 0);
-        assert(sb.gptr() == sb.eback() + 3);
-    }
-    {
         testbuf<char> sb("      ");
         std::istream is(&sb);
         std::istream::sentry sen(is);
@@ -127,5 +100,35 @@
         assert(sb.gptr() == sb.eback());
     }
 
-  return 0;
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        std::wistream is((testbuf<wchar_t>*)0);
+        std::wistream::sentry sen(is, true);
+        assert(!(bool)sen);
+        assert(!is.good());
+        assert(is.gcount() == 0);
+        assert(sync_called == 0);
+    }
+    {
+        testbuf<wchar_t> sb(L"   123");
+        std::wistream is(&sb);
+        std::wistream::sentry sen(is, true);
+        assert((bool)sen);
+        assert(is.good());
+        assert(is.gcount() == 0);
+        assert(sync_called == 0);
+        assert(sb.gptr() == sb.eback());
+    }
+    {
+        testbuf<wchar_t> sb(L"   123");
+        std::wistream is(&sb);
+        std::wistream::sentry sen(is);
+        assert((bool)sen);
+        assert(is.good());
+        assert(sync_called == 0);
+        assert(sb.gptr() == sb.eback() + 3);
+    }
+#endif
+
+    return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.assign/member_swap.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.assign/member_swap.pass.cpp
index 0a82796..032d2cf 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.assign/member_swap.pass.cpp
@@ -60,6 +60,7 @@
         assert(os2.precision() == 6);
         assert(os2.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb1;
         testbuf<wchar_t> sb2;
@@ -83,6 +84,7 @@
         assert(os2.precision() == 6);
         assert(os2.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.assign/move_assign.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.assign/move_assign.pass.cpp
index 8fcb0c2..dbac838 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.assign/move_assign.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.assign/move_assign.pass.cpp
@@ -63,6 +63,7 @@
         assert(os2.precision() == 6);
         assert(os2.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb1;
         testbuf<wchar_t> sb2;
@@ -86,6 +87,7 @@
         assert(os2.precision() == 6);
         assert(os2.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.cons/move.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.cons/move.pass.cpp
index 73991b3..d2de7b0 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.cons/move.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.cons/move.pass.cpp
@@ -54,6 +54,7 @@
         assert(os.precision() == 6);
         assert(os.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         test_ostream<wchar_t> os1(&sb);
@@ -68,6 +69,7 @@
         assert(os.precision() == 6);
         assert(os.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.cons/streambuf.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.cons/streambuf.pass.cpp
index d3c8375..1c38a68 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.cons/streambuf.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.cons/streambuf.pass.cpp
@@ -39,6 +39,7 @@
         assert(os.precision() == 6);
         assert(os.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::basic_ostream<wchar_t> os(&sb);
@@ -51,6 +52,7 @@
         assert(os.precision() == 6);
         assert(os.getloc().name() == "C");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT.pass.cpp
index a04a80c..6adf30f 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT.pass.cpp
@@ -14,6 +14,8 @@
 // template<class charT, class traits>
 //   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out, charT c);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <ostream>
 #include <cassert>
 
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT_pointer.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT_pointer.pass.cpp
index 95615a9..1ce962c 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT_pointer.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/CharT_pointer.pass.cpp
@@ -14,6 +14,8 @@
 // template<class charT, class traits>
 //   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out, const charT* s);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <ostream>
 #include <cassert>
 
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide.pass.cpp
index 7d97726..c1e18ea 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide.pass.cpp
@@ -14,6 +14,8 @@
 // template<class charT, class traits>
 //   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out, char c);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <ostream>
 #include <cassert>
 
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide_pointer.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide_pointer.pass.cpp
index 0587f6f..98c0153 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide_pointer.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.formatted/ostream.inserters.character/char_to_wide_pointer.pass.cpp
@@ -14,6 +14,8 @@
 // template<class charT, class traits>
 //   basic_ostream<charT,traits>& operator<<(basic_ostream<charT,traits>& out, const char* s);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <ostream>
 #include <cassert>
 
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.manip/endl.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.manip/endl.pass.cpp
index 71f9e8d..bedbe6c 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.manip/endl.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.manip/endl.pass.cpp
@@ -70,6 +70,7 @@
         assert(sync_called == 1);
         assert(os.good());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
@@ -78,6 +79,7 @@
         assert(sync_called == 2);
         assert(os.good());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.manip/ends.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.manip/ends.pass.cpp
index 94135f7..e4c0cd6 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.manip/ends.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.manip/ends.pass.cpp
@@ -61,6 +61,7 @@
         assert(sb.str().back() == 0);
         assert(os.good());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
@@ -69,6 +70,7 @@
         assert(sb.str().back() == 0);
         assert(os.good());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.manip/flush.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.manip/flush.pass.cpp
index 6fcba87..20d541e 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.manip/flush.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.manip/flush.pass.cpp
@@ -49,6 +49,7 @@
         assert(sync_called == 1);
         assert(os.good());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
@@ -56,6 +57,7 @@
         assert(sync_called == 2);
         assert(os.good());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.rvalue/rvalue.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.rvalue/rvalue.pass.cpp
index d71855a..8ef9b6c 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.rvalue/rvalue.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.rvalue/rvalue.pass.cpp
@@ -67,6 +67,7 @@
         assert(&result == &os);
         assert(sb.str() == "123");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
@@ -75,6 +76,7 @@
         assert(&result == &os);
         assert(sb.str() == L"123");
     }
+#endif
 
     return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.unformatted/put.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.unformatted/put.pass.cpp
index 08a7018..e52a1a4 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.unformatted/put.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.unformatted/put.pass.cpp
@@ -53,6 +53,21 @@
 int main(int, char**)
 {
     {
+        std::ostream os((std::streambuf*)0);
+        char c = 'a';
+        os.put(c);
+        assert(os.bad());
+    }
+    {
+        testbuf<char> sb;
+        std::ostream os(&sb);
+        char c = 'a';
+        os.put(c);
+        assert(sb.str() == "a");
+        assert(os.good());
+    }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
         std::wostream os((std::wstreambuf*)0);
         wchar_t c = L'a';
         os.put(c);
@@ -66,14 +81,7 @@
         assert(sb.str() == L"a");
         assert(os.good());
     }
-    {
-        testbuf<char> sb;
-        std::ostream os(&sb);
-        char c = 'a';
-        os.put(c);
-        assert(sb.str() == "a");
-        assert(os.good());
-    }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/output.streams/ostream.unformatted/write.pass.cpp b/test/std/input.output/iostream.format/output.streams/ostream.unformatted/write.pass.cpp
index c81c770..b0f3889 100644
--- a/test/std/input.output/iostream.format/output.streams/ostream.unformatted/write.pass.cpp
+++ b/test/std/input.output/iostream.format/output.streams/ostream.unformatted/write.pass.cpp
@@ -53,6 +53,21 @@
 int main(int, char**)
 {
     {
+        std::ostream os((std::streambuf*)0);
+        const char s[] = "123456790";
+        os.write(s, sizeof(s)/sizeof(s[0])-1);
+        assert(os.bad());
+    }
+    {
+        testbuf<char> sb;
+        std::ostream os(&sb);
+        const char s[] = "123456790";
+        os.write(s, sizeof(s)/sizeof(s[0])-1);
+        assert(sb.str() == s);
+        assert(os.good());
+    }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
         std::wostream os((std::wstreambuf*)0);
         const wchar_t s[] = L"123456790";
         os.write(s, sizeof(s)/sizeof(s[0])-1);
@@ -66,14 +81,7 @@
         assert(os.good());
         assert(sb.str() == s);
     }
-    {
-        testbuf<char> sb;
-        std::ostream os(&sb);
-        const char s[] = "123456790";
-        os.write(s, sizeof(s)/sizeof(s[0])-1);
-        assert(sb.str() == s);
-        assert(os.good());
-    }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/quoted.manip/quoted.pass.cpp b/test/std/input.output/iostream.format/quoted.manip/quoted.pass.cpp
index 854e271..ef43339 100644
--- a/test/std/input.output/iostream.format/quoted.manip/quoted.pass.cpp
+++ b/test/std/input.output/iostream.format/quoted.manip/quoted.pass.cpp
@@ -132,10 +132,12 @@
     round_trip_d  (  "", 'q' );
     round_trip_e  (  "", 'q' );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     round_trip    ( L"" );
     round_trip_ws ( L"" );
     round_trip_d  ( L"", 'q' );
     round_trip_e  ( L"", 'q' );
+#endif
 
     round_trip    (  "Hi" );
     round_trip_ws (  "Hi" );
@@ -144,34 +146,47 @@
     assert ( quote ( "Hi", '!' ) == "!Hi!" );
     assert ( quote ( "Hi!", '!' ) == R"(!Hi\!!)" );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     round_trip    ( L"Hi" );
     round_trip_ws ( L"Hi" );
     round_trip_d  ( L"Hi", '!' );
     round_trip_e  ( L"Hi", '!' );
     assert ( quote ( L"Hi", '!' )  == L"!Hi!" );
     assert ( quote ( L"Hi!", '!' ) == LR"(!Hi\!!)" );
+#endif
 
     round_trip    (  "Hi Mom" );
     round_trip_ws (  "Hi Mom" );
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     round_trip    ( L"Hi Mom" );
     round_trip_ws ( L"Hi Mom" );
+#endif
 
     assert ( quote (  "" )  ==  "\"\"" );
-    assert ( quote ( L"" )  == L"\"\"" );
     assert ( quote (  "a" ) ==  "\"a\"" );
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert ( quote ( L"" )  == L"\"\"" );
     assert ( quote ( L"a" ) == L"\"a\"" );
+#endif
 
-//  missing end quote - must not hang
+    // missing end quote - must not hang
     assert ( unquote (  "\"abc" ) ==  "abc" );
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     assert ( unquote ( L"\"abc" ) == L"abc" );
+#endif
 
     assert ( unquote (  "abc" ) == "abc" ); // no delimiter
-    assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
     assert ( unquote (  "abc def" ) ==  "abc" ); // no delimiter
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
     assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter
+#endif
 
     assert ( unquote (  "" ) ==  "" ); // nothing there
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     assert ( unquote ( L"" ) == L"" ); // nothing there
+#endif
+
     test_padding ();
 
     return 0;
diff --git a/test/std/input.output/iostream.format/quoted.manip/quoted_char.verify.cpp b/test/std/input.output/iostream.format/quoted.manip/quoted_char.verify.cpp
index 9340edb..29a084e 100644
--- a/test/std/input.output/iostream.format/quoted.manip/quoted_char.verify.cpp
+++ b/test/std/input.output/iostream.format/quoted.manip/quoted_char.verify.cpp
@@ -11,6 +11,7 @@
 // quoted
 
 // UNSUPPORTED: c++03, c++11
+// XFAIL: libcpp-has-no-wide-characters
 
 #include <iomanip>
 #include <sstream>
diff --git a/test/std/input.output/iostream.format/std.manip/resetiosflags.pass.cpp b/test/std/input.output/iostream.format/std.manip/resetiosflags.pass.cpp
index 1603d9f..a61357e 100644
--- a/test/std/input.output/iostream.format/std.manip/resetiosflags.pass.cpp
+++ b/test/std/input.output/iostream.format/std.manip/resetiosflags.pass.cpp
@@ -40,6 +40,7 @@
         os << std::resetiosflags(std::ios_base::skipws);
         assert(!(os.flags() & std::ios_base::skipws));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -54,6 +55,7 @@
         os << std::resetiosflags(std::ios_base::skipws);
         assert(!(os.flags() & std::ios_base::skipws));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/std.manip/setbase.pass.cpp b/test/std/input.output/iostream.format/std.manip/setbase.pass.cpp
index be5edf8..0e8b13c 100644
--- a/test/std/input.output/iostream.format/std.manip/setbase.pass.cpp
+++ b/test/std/input.output/iostream.format/std.manip/setbase.pass.cpp
@@ -50,6 +50,7 @@
         os << std::setbase(15);
         assert((os.flags() & std::ios_base::basefield) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -74,6 +75,7 @@
         os << std::setbase(15);
         assert((os.flags() & std::ios_base::basefield) == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/std.manip/setfill.pass.cpp b/test/std/input.output/iostream.format/std.manip/setfill.pass.cpp
index 68002b9..3413743 100644
--- a/test/std/input.output/iostream.format/std.manip/setfill.pass.cpp
+++ b/test/std/input.output/iostream.format/std.manip/setfill.pass.cpp
@@ -31,12 +31,14 @@
         os << std::setfill('*');
         assert(os.fill() == '*');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wostream os(&sb);
         os << std::setfill(L'*');
         assert(os.fill() == L'*');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/std.manip/setiosflags.pass.cpp b/test/std/input.output/iostream.format/std.manip/setiosflags.pass.cpp
index 8b249f4..9ed8b9f 100644
--- a/test/std/input.output/iostream.format/std.manip/setiosflags.pass.cpp
+++ b/test/std/input.output/iostream.format/std.manip/setiosflags.pass.cpp
@@ -40,6 +40,7 @@
         os << std::setiosflags(std::ios_base::oct);
         assert(os.flags() & std::ios_base::oct);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -54,6 +55,7 @@
         os << std::setiosflags(std::ios_base::oct);
         assert(os.flags() & std::ios_base::oct);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/std.manip/setprecision.pass.cpp b/test/std/input.output/iostream.format/std.manip/setprecision.pass.cpp
index 7063cf3..0fa289b 100644
--- a/test/std/input.output/iostream.format/std.manip/setprecision.pass.cpp
+++ b/test/std/input.output/iostream.format/std.manip/setprecision.pass.cpp
@@ -38,6 +38,7 @@
         os << std::setprecision(10);
         assert(os.precision() == 10);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -50,6 +51,7 @@
         os << std::setprecision(10);
         assert(os.precision() == 10);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.format/std.manip/setw.pass.cpp b/test/std/input.output/iostream.format/std.manip/setw.pass.cpp
index 346d5f4..565dadd 100644
--- a/test/std/input.output/iostream.format/std.manip/setw.pass.cpp
+++ b/test/std/input.output/iostream.format/std.manip/setw.pass.cpp
@@ -8,7 +8,7 @@
 
 // <iomanip>
 
-// T6 setw(int n);
+// <unspecified> setw(int n);
 
 #include <iomanip>
 #include <istream>
@@ -38,6 +38,7 @@
         os << std::setw(10);
         assert(os.width() == 10);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb;
         std::wistream is(&sb);
@@ -50,6 +51,7 @@
         os << std::setw(10);
         assert(os.width() == 10);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.forward/iosfwd.pass.cpp b/test/std/input.output/iostream.forward/iosfwd.pass.cpp
index 3bf880a..b6ef60d 100644
--- a/test/std/input.output/iostream.forward/iosfwd.pass.cpp
+++ b/test/std/input.output/iostream.forward/iosfwd.pass.cpp
@@ -9,10 +9,13 @@
 // <iosfwd>
 
 #include <iosfwd>
-#include <cwchar>  // for mbstate_t
 
 #include "test_macros.h"
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar>
+#endif
+
 template <class Ptr> void test()
 {
     Ptr p = 0;
@@ -22,71 +25,105 @@
 int main(int, char**)
 {
     test<std::char_traits<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::char_traits<wchar_t>*       >();
+#endif
     test<std::char_traits<unsigned short>*>();
 
     test<std::basic_ios<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_ios<wchar_t>*       >();
+#endif
     test<std::basic_ios<unsigned short>*>();
 
     test<std::basic_streambuf<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_streambuf<wchar_t>*       >();
+#endif
     test<std::basic_streambuf<unsigned short>*>();
 
     test<std::basic_istream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_istream<wchar_t>*       >();
+#endif
     test<std::basic_istream<unsigned short>*>();
 
     test<std::basic_ostream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_ostream<wchar_t>*       >();
+#endif
     test<std::basic_ostream<unsigned short>*>();
 
     test<std::basic_iostream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_iostream<wchar_t>*       >();
+#endif
     test<std::basic_iostream<unsigned short>*>();
 
     test<std::basic_stringbuf<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_stringbuf<wchar_t>*       >();
+#endif
     test<std::basic_stringbuf<unsigned short>*>();
 
     test<std::basic_istringstream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_istringstream<wchar_t>*       >();
+#endif
     test<std::basic_istringstream<unsigned short>*>();
 
     test<std::basic_ostringstream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_ostringstream<wchar_t>*       >();
+#endif
     test<std::basic_ostringstream<unsigned short>*>();
 
     test<std::basic_stringstream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_stringstream<wchar_t>*       >();
+#endif
     test<std::basic_stringstream<unsigned short>*>();
 
     test<std::basic_filebuf<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_filebuf<wchar_t>*       >();
+#endif
     test<std::basic_filebuf<unsigned short>*>();
 
     test<std::basic_ifstream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_ifstream<wchar_t>*       >();
+#endif
     test<std::basic_ifstream<unsigned short>*>();
 
     test<std::basic_ofstream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_ofstream<wchar_t>*       >();
+#endif
     test<std::basic_ofstream<unsigned short>*>();
 
     test<std::basic_fstream<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::basic_fstream<wchar_t>*       >();
+#endif
     test<std::basic_fstream<unsigned short>*>();
 
     test<std::istreambuf_iterator<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::istreambuf_iterator<wchar_t>*       >();
+#endif
     test<std::istreambuf_iterator<unsigned short>*>();
 
     test<std::ostreambuf_iterator<char>*          >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::ostreambuf_iterator<wchar_t>*       >();
+#endif
     test<std::ostreambuf_iterator<unsigned short>*>();
 
     test<std::ios* >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wios*>();
+#endif
 
     test<std::streambuf*>();
     test<std::istream*  >();
@@ -103,6 +140,7 @@
     test<std::ofstream*>();
     test<std::fstream* >();
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wstreambuf*>();
     test<std::wistream*  >();
     test<std::wostream*  >();
@@ -117,10 +155,13 @@
     test<std::wifstream*>();
     test<std::wofstream*>();
     test<std::wfstream* >();
+#endif
 
     test<std::fpos<std::mbstate_t>*>();
     test<std::streampos*           >();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wstreampos*          >();
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/iostream.objects/init.pass.cpp b/test/std/input.output/iostream.objects/init.pass.cpp
index e53228a..293d105 100644
--- a/test/std/input.output/iostream.objects/init.pass.cpp
+++ b/test/std/input.output/iostream.objects/init.pass.cpp
@@ -25,37 +25,24 @@
 #include <cstring>
 #include <iostream>
 
+#include "test_macros.h"
+
 struct Checker {
     char *cerr_mem_dump;
     char *cin_mem_dump;
     char *cout_mem_dump;
     char *clog_mem_dump;
 
-    char *wcerr_mem_dump;
-    char *wcin_mem_dump;
-    char *wcout_mem_dump;
-    char *wclog_mem_dump;
-
     Checker()
         : cerr_mem_dump(new char[sizeof(std::cerr)])
         , cin_mem_dump(new char[sizeof(std::cin)])
         , cout_mem_dump(new char[sizeof(std::cout)])
         , clog_mem_dump(new char[sizeof(std::clog)])
-
-        , wcerr_mem_dump(new char[sizeof(std::wcerr)])
-        , wcin_mem_dump(new char[sizeof(std::wcin)])
-        , wcout_mem_dump(new char[sizeof(std::wcout)])
-        , wclog_mem_dump(new char[sizeof(std::wclog)])
      {
         std::memcpy(cerr_mem_dump, (char*)&std::cerr, sizeof(std::cerr));
         std::memcpy(cin_mem_dump, (char*)&std::cin, sizeof(std::cin));
         std::memcpy(cout_mem_dump, (char*)&std::cout, sizeof(std::cout));
         std::memcpy(clog_mem_dump, (char*)&std::clog, sizeof(std::clog));
-
-        std::memcpy(wcerr_mem_dump, (char*)&std::wcerr, sizeof(std::wcerr));
-        std::memcpy(wcin_mem_dump, (char*)&std::wcin, sizeof(std::wcin));
-        std::memcpy(wcout_mem_dump, (char*)&std::wcout, sizeof(std::wcout));
-        std::memcpy(wclog_mem_dump, (char*)&std::wclog, sizeof(std::wclog));
     }
 
     ~Checker() {
@@ -63,7 +50,30 @@
         delete[] cin_mem_dump;
         delete[] cout_mem_dump;
         delete[] clog_mem_dump;
+    }
+};
+static Checker check;
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+struct WideChecker {
+    char *wcerr_mem_dump;
+    char *wcin_mem_dump;
+    char *wcout_mem_dump;
+    char *wclog_mem_dump;
+
+    WideChecker()
+        : wcerr_mem_dump(new char[sizeof(std::wcerr)])
+        , wcin_mem_dump(new char[sizeof(std::wcin)])
+        , wcout_mem_dump(new char[sizeof(std::wcout)])
+        , wclog_mem_dump(new char[sizeof(std::wclog)])
+     {
+        std::memcpy(wcerr_mem_dump, (char*)&std::wcerr, sizeof(std::wcerr));
+        std::memcpy(wcin_mem_dump, (char*)&std::wcin, sizeof(std::wcin));
+        std::memcpy(wcout_mem_dump, (char*)&std::wcout, sizeof(std::wcout));
+        std::memcpy(wclog_mem_dump, (char*)&std::wclog, sizeof(std::wclog));
+    }
+
+    ~WideChecker() {
         delete[] wcerr_mem_dump;
         delete[] wcin_mem_dump;
         delete[] wcout_mem_dump;
@@ -71,7 +81,8 @@
     }
 };
 
-static Checker check;
+static WideChecker wide_check;
+#endif
 
 int main(int, char**) {
     assert(std::memcmp(check.cerr_mem_dump, (char const*)&std::cerr, sizeof(std::cerr)) == 0);
@@ -79,9 +90,11 @@
     assert(std::memcmp(check.cout_mem_dump, (char const*)&std::cout, sizeof(std::cout)) == 0);
     assert(std::memcmp(check.clog_mem_dump, (char const*)&std::clog, sizeof(std::clog)) == 0);
 
-    assert(std::memcmp(check.wcerr_mem_dump, (char const*)&std::wcerr, sizeof(std::wcerr)) == 0);
-    assert(std::memcmp(check.wcin_mem_dump, (char const*)&std::wcin, sizeof(std::wcin)) == 0);
-    assert(std::memcmp(check.wcout_mem_dump, (char const*)&std::wcout, sizeof(std::wcout)) == 0);
-    assert(std::memcmp(check.wclog_mem_dump, (char const*)&std::wclog, sizeof(std::wclog)) == 0);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::memcmp(wide_check.wcerr_mem_dump, (char const*)&std::wcerr, sizeof(std::wcerr)) == 0);
+    assert(std::memcmp(wide_check.wcin_mem_dump, (char const*)&std::wcin, sizeof(std::wcin)) == 0);
+    assert(std::memcmp(wide_check.wcout_mem_dump, (char const*)&std::wcout, sizeof(std::wcout)) == 0);
+    assert(std::memcmp(wide_check.wclog_mem_dump, (char const*)&std::wclog, sizeof(std::wclog)) == 0);
+#endif
     return 0;
 }
diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp
index 7e8e570..8ff1666 100644
--- a/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp
+++ b/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.sh.cpp
@@ -10,6 +10,7 @@
 
 // istream wcerr;
 
+// XFAIL: libcpp-has-no-wide-characters
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
 // FILE_DEPENDENCIES: ../check-stderr.sh
diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp
index aee8d79..af7107c 100644
--- a/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp
+++ b/test/std/input.output/iostream.objects/wide.stream.objects/wcin.sh.cpp
@@ -10,6 +10,8 @@
 
 // istream wcin;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // FILE_DEPENDENCIES: ../send-stdin.sh
 // RUN: %{build}
 // RUN: %{exec} bash send-stdin.sh "%t.exe" "1234"
diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp
index 07c6a25..1a5b200 100644
--- a/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp
+++ b/test/std/input.output/iostream.objects/wide.stream.objects/wclog.sh.cpp
@@ -10,6 +10,7 @@
 
 // istream wclog;
 
+// XFAIL: libcpp-has-no-wide-characters
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
 // FILE_DEPENDENCIES: ../check-stderr.sh
diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp
index 5dd8345..3d4af97 100644
--- a/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp
+++ b/test/std/input.output/iostream.objects/wide.stream.objects/wcout.sh.cpp
@@ -10,6 +10,7 @@
 
 // istream wcout;
 
+// XFAIL: libcpp-has-no-wide-characters
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
 // FILE_DEPENDENCIES: ../check-stdout.sh
diff --git a/test/std/input.output/iostreams.base/ios/basic.ios.members/narrow.pass.cpp b/test/std/input.output/iostreams.base/ios/basic.ios.members/narrow.pass.cpp
index 5b0c903..fbc3ae8 100644
--- a/test/std/input.output/iostreams.base/ios/basic.ios.members/narrow.pass.cpp
+++ b/test/std/input.output/iostreams.base/ios/basic.ios.members/narrow.pass.cpp
@@ -12,6 +12,8 @@
 
 // char narrow(char_type c, char dfault) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <ios>
 #include <cassert>
 
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.cons/copy.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.cons/copy.pass.cpp
index 9c47c07..5806751 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.cons/copy.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.cons/copy.pass.cpp
@@ -57,16 +57,13 @@
         test<char> t2 = t;
     }
     {
-        test<wchar_t> t;
-        test<wchar_t> t2 = t;
-    }
-    {
         char g1, g2, g3, p1, p3;
         test<char> t;
         t.setg(&g1, &g2, &g3);
         t.setp(&p1, &p3);
         test<char> t2 = t;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         wchar_t g1, g2, g3, p1, p3;
         test<wchar_t> t;
@@ -74,15 +71,22 @@
         t.setp(&p1, &p3);
         test<wchar_t> t2 = t;
     }
+    {
+        test<wchar_t> t;
+        test<wchar_t> t2 = t;
+    }
+#endif
     std::locale::global(std::locale(LOCALE_en_US_UTF_8));
     {
         test<char> t;
         test<char> t2 = t;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         test<wchar_t> t2 = t;
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.cons/default.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.cons/default.pass.cpp
index eaa1a9b..df9df90 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.cons/default.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.cons/default.pass.cpp
@@ -42,19 +42,24 @@
         test<char> t;
         assert(t.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         assert(t.getloc().name() == "C");
     }
+#endif
+
     std::locale::global(std::locale(LOCALE_en_US_UTF_8));
     {
         test<char> t;
         assert(t.getloc().name() == LOCALE_en_US_UTF_8);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         assert(t.getloc().name() == LOCALE_en_US_UTF_8);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/assign.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/assign.pass.cpp
index e16094b..8a976e7 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/assign.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/assign.pass.cpp
@@ -59,11 +59,6 @@
         t2 = t;
     }
     {
-        test<wchar_t> t;
-        test<wchar_t> t2;
-        t2 = t;
-    }
-    {
         char g1, g2, g3, p1, p3;
         test<char> t;
         t.setg(&g1, &g2, &g3);
@@ -71,6 +66,12 @@
         test<char> t2;
         t2 = t;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        test<wchar_t> t;
+        test<wchar_t> t2;
+        t2 = t;
+    }
     {
         wchar_t g1, g2, g3, p1, p3;
         test<wchar_t> t;
@@ -79,17 +80,20 @@
         test<wchar_t> t2;
         t2 = t;
     }
+#endif
     std::locale::global(std::locale(LOCALE_en_US_UTF_8));
     {
         test<char> t;
         test<char> t2;
         t2 = t;
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         test<wchar_t> t2;
         t2 = t;
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/swap.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/swap.pass.cpp
index d96a60a..c575c2c 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/swap.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.assign/swap.pass.cpp
@@ -68,11 +68,6 @@
         t2.swap(t);
     }
     {
-        test<wchar_t> t;
-        test<wchar_t> t2;
-        t2.swap(t);
-    }
-    {
         char g1, g2, g3, p1, p3;
         test<char> t;
         t.setg(&g1, &g2, &g3);
@@ -80,6 +75,12 @@
         test<char> t2;
         t2.swap(t);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        test<wchar_t> t;
+        test<wchar_t> t2;
+        t2.swap(t);
+    }
     {
         wchar_t g1, g2, g3, p1, p3;
         test<wchar_t> t;
@@ -88,17 +89,20 @@
         test<wchar_t> t2;
         t2.swap(t);
     }
+#endif
     std::locale::global(std::locale(LOCALE_en_US_UTF_8));
     {
         test<char> t;
         test<char> t2;
         t2.swap(t);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         test<wchar_t> t2;
         t2.swap(t);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/gbump.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/gbump.pass.cpp
index 2091a9d..f02fe42 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/gbump.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/gbump.pass.cpp
@@ -51,12 +51,14 @@
         t.setg(in, in+1, in+sizeof(in)/sizeof(in[0]));
         t.gbump(2);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         wchar_t in[] = L"ABCDE";
         t.setg(in, in+1, in+sizeof(in)/sizeof(in[0]));
         t.gbump(3);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/setg.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/setg.pass.cpp
index 8f01ac9..ee6dc78 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/setg.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.get.area/setg.pass.cpp
@@ -42,11 +42,13 @@
         char in[] = "ABC";
         t.setg(in, in+1, in+sizeof(in)/sizeof(in[0]));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         wchar_t in[] = L"ABC";
         t.setg(in, in+1, in+sizeof(in)/sizeof(in[0]));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/pbump.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/pbump.pass.cpp
index 346951f..6acd179 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/pbump.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/pbump.pass.cpp
@@ -52,6 +52,7 @@
         t.pbump(2);
         t.pbump(1);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         wchar_t in[] = L"ABCDE";
@@ -59,6 +60,7 @@
         t.pbump(3);
         t.pbump(1);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/setp.pass.cpp b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/setp.pass.cpp
index 201a65d..acbc000 100644
--- a/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/setp.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/streambuf.protected/streambuf.put.area/setp.pass.cpp
@@ -42,11 +42,13 @@
         char in[] = "ABC";
         t.setp(in, in+sizeof(in)/sizeof(in[0]));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         test<wchar_t> t;
         wchar_t in[] = L"ABC";
         t.setp(in, in+sizeof(in)/sizeof(in[0]));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/stream.buffers/streambuf/types.pass.cpp b/test/std/input.output/stream.buffers/streambuf/types.pass.cpp
index a80c23e..3dd8a3e 100644
--- a/test/std/input.output/stream.buffers/streambuf/types.pass.cpp
+++ b/test/std/input.output/stream.buffers/streambuf/types.pass.cpp
@@ -32,11 +32,13 @@
     static_assert((std::is_same<std::streambuf::pos_type, std::char_traits<char>::pos_type>::value), "");
     static_assert((std::is_same<std::streambuf::off_type, std::char_traits<char>::off_type>::value), "");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert((std::is_same<std::wstreambuf::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::wstreambuf::traits_type, std::char_traits<wchar_t> >::value), "");
     static_assert((std::is_same<std::wstreambuf::int_type, std::char_traits<wchar_t>::int_type>::value), "");
     static_assert((std::is_same<std::wstreambuf::pos_type, std::char_traits<wchar_t>::pos_type>::value), "");
     static_assert((std::is_same<std::wstreambuf::off_type, std::char_traits<wchar_t>::off_type>::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.assign/member_swap.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.assign/member_swap.pass.cpp
index e17bf5a..724fe8e 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.assign/member_swap.pass.cpp
@@ -37,6 +37,7 @@
         ss0 >> i;
         assert(i == 321);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss0(L" 123 456");
         std::wistringstream ss(L" 789 321");
@@ -54,6 +55,7 @@
         ss0 >> i;
         assert(i == 321);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp
index 93c8313..3fc0967 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.assign/move.pass.cpp
@@ -51,6 +51,7 @@
         s1 >> s;
         assert(s == "Dddddddddddddddddd");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss0(L" 123 456");
         std::wistringstream ss;
@@ -82,6 +83,7 @@
         s1 >> s;
         assert(s == L"Dddddddddddddddddd");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.assign/nonmember_swap.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.assign/nonmember_swap.pass.cpp
index d16b73f..be46bb1 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.assign/nonmember_swap.pass.cpp
@@ -40,6 +40,7 @@
         ss0 >> i;
         assert(i == 321);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss0(L" 123 456");
         std::wistringstream ss(L" 789 321");
@@ -57,6 +58,7 @@
         ss0 >> i;
         assert(i == 321);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.cons/default.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.cons/default.pass.cpp
index 22a823e..056c724 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.cons/default.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.cons/default.pass.cpp
@@ -43,6 +43,7 @@
         assert(ss.good());
         assert(ss.str() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss;
         assert(ss.rdbuf() != 0);
@@ -55,10 +56,13 @@
         assert(ss.good());
         assert(ss.str() == L"");
     }
+#endif
 
 #if TEST_STD_VER >= 11
     test<std::istringstream>();
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     test<std::wistringstream>();
+#   endif
 #endif
 
     return 0;
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.cons/move.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.cons/move.pass.cpp
index 650284d..45ad2d2 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.cons/move.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.cons/move.pass.cpp
@@ -32,6 +32,7 @@
         ss >> i;
         assert(i == 456);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss0(L" 123 456");
         std::wistringstream ss(std::move(ss0));
@@ -44,6 +45,7 @@
         ss >> i;
         assert(i == 456);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.cons/string.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.cons/string.pass.cpp
index a667869..9b0593f 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.cons/string.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.cons/string.pass.cpp
@@ -43,6 +43,7 @@
         ss >> i;
         assert(i == 456);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss(L" 123 456");
         assert(ss.rdbuf() != 0);
@@ -65,6 +66,7 @@
         ss >> i;
         assert(i == 456);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/istringstream/istringstream.members/str.pass.cpp b/test/std/input.output/string.streams/istringstream/istringstream.members/str.pass.cpp
index 4948f80..5ab126a 100644
--- a/test/std/input.output/string.streams/istringstream/istringstream.members/str.pass.cpp
+++ b/test/std/input.output/string.streams/istringstream/istringstream.members/str.pass.cpp
@@ -37,6 +37,7 @@
         ss >> i;
         assert(i == 789);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream ss(L" 123 456");
         assert(ss.rdbuf() != 0);
@@ -54,6 +55,7 @@
         ss >> i;
         assert(i == 789);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.assign/member_swap.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.assign/member_swap.pass.cpp
index 5991f87..33161fe 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.assign/member_swap.pass.cpp
@@ -33,6 +33,7 @@
         ss0 << i << ' ' << 567;
         assert(ss0.str() == "234 567");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss0(L" 123 456");
         std::wostringstream ss;
@@ -46,6 +47,7 @@
         ss0 << i << ' ' << 567;
         assert(ss0.str() == L"234 567");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.assign/move.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.assign/move.pass.cpp
index 8be3a43..bd5f9cb 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.assign/move.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.assign/move.pass.cpp
@@ -31,6 +31,7 @@
         ss << i << ' ' << 567;
         assert(ss.str() == "234 5676");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss0(L" 123 456");
         std::wostringstream ss;
@@ -42,6 +43,7 @@
         ss << i << ' ' << 567;
         assert(ss.str() == L"234 5676");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.assign/nonmember_swap.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.assign/nonmember_swap.pass.cpp
index f387c74..227623c 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.assign/nonmember_swap.pass.cpp
@@ -33,6 +33,7 @@
         ss0 << i << ' ' << 567;
         assert(ss0.str() == "234 567");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss0(L" 123 456");
         std::wostringstream ss;
@@ -46,6 +47,7 @@
         ss0 << i << ' ' << 567;
         assert(ss0.str() == L"234 567");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.cons/default.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.cons/default.pass.cpp
index 5ce6336..feac144 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.cons/default.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.cons/default.pass.cpp
@@ -43,6 +43,7 @@
         assert(ss.good());
         assert(ss.str() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss;
         assert(ss.rdbuf() != 0);
@@ -55,10 +56,13 @@
         assert(ss.good());
         assert(ss.str() == L"");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 #if TEST_STD_VER >= 11
     test<std::ostringstream>();
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     test<std::wostringstream>();
+#   endif
 #endif
 
     return 0;
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.cons/move.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.cons/move.pass.cpp
index 6823bb6..6a63cd6 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.cons/move.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.cons/move.pass.cpp
@@ -30,6 +30,7 @@
         ss << i << ' ' << 567;
         assert(ss.str() == "234 5676");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss0(L" 123 456");
         std::wostringstream ss(std::move(ss0));
@@ -40,6 +41,7 @@
         ss << i << ' ' << 567;
         assert(ss.str() == L"234 5676");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.cons/string.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.cons/string.pass.cpp
index 5ff91b4..af3c320 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.cons/string.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.cons/string.pass.cpp
@@ -39,6 +39,7 @@
         ss << i << ' ' << 567;
         assert(ss.str() == "234 5676");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss(L" 123 456");
         assert(ss.rdbuf() != 0);
@@ -57,6 +58,7 @@
         ss << i << ' ' << 567;
         assert(ss.str() == L"234 5676");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.pass.cpp b/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.pass.cpp
index e141d4f..63f6b5e 100644
--- a/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.pass.cpp
+++ b/test/std/input.output/string.streams/ostringstream/ostringstream.members/str.pass.cpp
@@ -35,6 +35,7 @@
         ss << "abc";
         assert(ss.str() == "abc9");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream ss(L" 123 456");
         assert(ss.rdbuf() != 0);
@@ -50,6 +51,7 @@
         ss << L"abc";
         assert(ss.str() == L"abc9");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.assign/member_swap.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.assign/member_swap.pass.cpp
index d63f077..edb977a 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.assign/member_swap.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.assign/member_swap.pass.cpp
@@ -41,6 +41,7 @@
         assert(buf.str() == "testing");
         assert(buf1.str() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf buf1(L"testing");
         std::wstringbuf buf;
@@ -62,6 +63,7 @@
         assert(buf.str() == L"testing");
         assert(buf1.str() == L"");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.assign/move.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.assign/move.pass.cpp
index bdb3bca..27b9579 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.assign/move.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.assign/move.pass.cpp
@@ -38,6 +38,7 @@
         buf = move(buf1);
         assert(buf.str() == "testing");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf buf1(L"testing");
         std::wstringbuf buf;
@@ -56,6 +57,7 @@
         buf = move(buf1);
         assert(buf.str() == L"testing");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.assign/nonmember_swap.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.assign/nonmember_swap.pass.cpp
index 70324da..6ac1381 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.assign/nonmember_swap.pass.cpp
@@ -43,6 +43,7 @@
         assert(buf.str() == "testing");
         assert(buf1.str() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf buf1(L"testing");
         std::wstringbuf buf;
@@ -64,6 +65,7 @@
         assert(buf.str() == L"testing");
         assert(buf1.str() == L"");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp
index 8e87a88..6451d44 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/default.pass.cpp
@@ -45,17 +45,19 @@
         assert(buf.str() == "");
     }
     {
-        std::wstringbuf buf;
-        assert(buf.str() == L"");
-    }
-    {
         testbuf<char> buf;
         buf.check();
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        std::wstringbuf buf;
+        assert(buf.str() == L"");
+    }
     {
         testbuf<wchar_t> buf;
         buf.check();
     }
+#endif
 
 #if TEST_STD_VER >= 11
     {
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/move.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/move.pass.cpp
index af1eb38..c4846c0 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/move.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/move.pass.cpp
@@ -35,6 +35,7 @@
         std::stringbuf buf(std::move(buf1));
         assert(buf.str() == "testing");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf buf1(L"testing");
         std::wstringbuf buf(std::move(buf1));
@@ -50,6 +51,7 @@
         std::wstringbuf buf(std::move(buf1));
         assert(buf.str() == L"testing");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/string.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/string.pass.cpp
index 409d293..92e02a5 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.cons/string.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.cons/string.pass.cpp
@@ -33,6 +33,7 @@
         std::stringbuf buf("testing", std::ios_base::out);
         assert(buf.str() == "testing");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf buf(L"testing");
         assert(buf.str() == L"testing");
@@ -45,6 +46,7 @@
         std::wstringbuf buf(L"testing", std::ios_base::out);
         assert(buf.str() == L"testing");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp
index f536ba2..18a2337 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.members/str.pass.cpp
@@ -26,12 +26,14 @@
         buf.str("another test");
         assert(buf.str() == "another test");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf buf(L"testing");
         assert(buf.str() == L"testing");
         buf.str(L"another test");
         assert(buf.str() == L"another test");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/overflow.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/overflow.pass.cpp
index 84110d3..990f918 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/overflow.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/overflow.pass.cpp
@@ -68,6 +68,7 @@
         assert(sb.sputc('1') == '1');
         assert(sb.str() == "12345678901");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"abc");
         assert(sb.sputc(L'1') == L'1');
@@ -93,6 +94,7 @@
         assert(sb.sputc(L'1') == L'1');
         assert(sb.str() == L"12345678901");
     }
+#endif
     {
         testbuf<char> sb("abc", std::ios_base::app | std::ios_base::out);
         assert(sb.sputc('1') == '1');
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/pbackfail.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/pbackfail.pass.cpp
index 4429329..9a7d30e 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/pbackfail.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/pbackfail.pass.cpp
@@ -68,6 +68,7 @@
         assert(sb.pbackfail(std::char_traits<char>::eof()) == std::char_traits<char>::eof());
         assert(sb.str() == "133");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"123", std::ios_base::in);
         assert(sb.sgetc() == L'1');
@@ -95,6 +96,7 @@
         assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) == std::char_traits<wchar_t>::eof());
         assert(sb.str() == L"133");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekoff.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekoff.pass.cpp
index a778d03..2bd5585 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekoff.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekoff.pass.cpp
@@ -105,6 +105,7 @@
         assert(sb.sputc('c') == 'c');
         assert(sb.str() == "0123456c89");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf sb(L"0123456789", std::ios_base::in);
         assert(sb.pubseekoff(3, std::ios_base::beg, std::ios_base::out) == -1);
@@ -165,6 +166,7 @@
         assert(sb.sputc(L'c') == L'c');
         assert(sb.str() == L"0123456c89");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekpos.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekpos.pass.cpp
index 1980292..68bebf5 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekpos.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/seekpos.pass.cpp
@@ -48,6 +48,7 @@
         assert(sb.sputc('3') == '3');
         assert(sb.str() == "0123456789");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf sb(L"0123456789", std::ios_base::in);
         assert(sb.pubseekpos(3, std::ios_base::out) == -1);
@@ -75,6 +76,7 @@
         assert(sb.sputc(L'3') == L'3');
         assert(sb.str() == L"0123456789");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/setbuf.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/setbuf.pass.cpp
index 0347ef3..2937cdf 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/setbuf.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/setbuf.pass.cpp
@@ -25,11 +25,13 @@
         assert(sb.pubsetbuf(0, 0) == &sb);
         assert(sb.str() == "0123456789");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringbuf sb(L"0123456789");
         assert(sb.pubsetbuf(0, 0) == &sb);
         assert(sb.str() == L"0123456789");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/underflow.pass.cpp b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/underflow.pass.cpp
index a3490e2..c743609 100644
--- a/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/underflow.pass.cpp
+++ b/test/std/input.output/string.streams/stringbuf/stringbuf.virtuals/underflow.pass.cpp
@@ -50,6 +50,7 @@
         assert(sb.underflow() == '4');
         assert(sb.underflow() == '4');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         testbuf<wchar_t> sb(L"123");
         sb.pbump(3);
@@ -68,6 +69,7 @@
         assert(sb.underflow() == L'4');
         assert(sb.underflow() == L'4');
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringstream.cons/default.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/default.pass.cpp
index f0c8750..095dbf9 100644
--- a/test/std/input.output/string.streams/stringstream.cons/default.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.cons/default.pass.cpp
@@ -43,6 +43,7 @@
         assert(ss.good());
         assert(ss.str() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss;
         assert(ss.rdbuf() != 0);
@@ -55,10 +56,13 @@
         assert(ss.good());
         assert(ss.str() == L"");
     }
+#endif
 
 #if TEST_STD_VER >= 11
     test<std::stringstream>();
+#   ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
     test<std::wstringstream>();
+#   endif
 #endif
 
     return 0;
diff --git a/test/std/input.output/string.streams/stringstream.cons/move.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/move.pass.cpp
index 642fd75..ec19c67 100644
--- a/test/std/input.output/string.streams/stringstream.cons/move.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.cons/move.pass.cpp
@@ -34,6 +34,7 @@
         ss << i << ' ' << 123;
         assert(ss.str() == "456 1236 ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss0(L" 123 456 ");
         std::wstringstream ss(std::move(ss0));
@@ -48,6 +49,7 @@
         ss << i << ' ' << 123;
         assert(ss.str() == L"456 1236 ");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp
index 55d95df..0fb8a02 100644
--- a/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.cons/string.pass.cpp
@@ -44,6 +44,7 @@
         ss << i << ' ' << 123;
         assert(ss.str() == "456 1236 ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss(L" 123 456 ");
         assert(ss.rdbuf() != 0);
@@ -57,13 +58,14 @@
         ss << i << ' ' << 123;
         assert(ss.str() == L"456 1236 ");
     }
+#endif
     { // This is https://llvm.org/PR33727
         typedef std::basic_string   <char, std::char_traits<char>, NoDefaultAllocator<char> > S;
         typedef std::basic_stringbuf<char, std::char_traits<char>, NoDefaultAllocator<char> > SB;
 
         S s(NoDefaultAllocator<char>(1));
         SB sb(s);
-    //  This test is not required by the standard, but *where else* could it get the allocator?
+        // This test is not required by the standard, but *where else* could it get the allocator?
         assert(sb.str().get_allocator() == s.get_allocator());
     }
 
diff --git a/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/member_swap.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/member_swap.pass.cpp
index ddd117e..1d5ff8b 100644
--- a/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/member_swap.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/member_swap.pass.cpp
@@ -37,6 +37,7 @@
         ss0 << i << ' ' << 123;
         assert(ss0.str() == "456 123");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss0(L" 123 456 ");
         std::wstringstream ss;
@@ -54,6 +55,7 @@
         ss0 << i << ' ' << 123;
         assert(ss0.str() == L"456 123");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/move.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/move.pass.cpp
index 91a685d..35c2197 100644
--- a/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/move.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/move.pass.cpp
@@ -35,6 +35,7 @@
         ss << i << ' ' << 123;
         assert(ss.str() == "456 1236 ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss0(L" 123 456 ");
         std::wstringstream ss;
@@ -50,6 +51,7 @@
         ss << i << ' ' << 123;
         assert(ss.str() == L"456 1236 ");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/nonmember_swap.pass.cpp b/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/nonmember_swap.pass.cpp
index 6304071..a882bec 100644
--- a/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/nonmember_swap.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.cons/stringstream.assign/nonmember_swap.pass.cpp
@@ -40,6 +40,7 @@
         ss0 << i << ' ' << 123;
         assert(ss0.str() == "456 123");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss0(L" 123 456 ");
         std::wstringstream ss;
@@ -57,6 +58,7 @@
         ss0 << i << ' ' << 123;
         assert(ss0.str() == L"456 123");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/input.output/string.streams/stringstream.members/str.pass.cpp b/test/std/input.output/string.streams/stringstream.members/str.pass.cpp
index 8645e57..05b233e 100644
--- a/test/std/input.output/string.streams/stringstream.members/str.pass.cpp
+++ b/test/std/input.output/string.streams/stringstream.members/str.pass.cpp
@@ -40,6 +40,7 @@
         ss << i << ' ' << 321;
         assert(ss.str() == "89 3219 ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstringstream ss(L" 123 456 ");
         assert(ss.rdbuf() != 0);
@@ -60,6 +61,7 @@
         ss << i << ' ' << 321;
         assert(ss.str() == L"89 3219 ");
     }
+#endif
     {
         std::stringstream ss;
         ss.write("\xd1", 1);
diff --git a/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp b/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp
index 6b7b1f9..33b16c1 100644
--- a/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp
+++ b/test/std/iterators/stream.iterators/istream.iterator/types.pass.cpp
@@ -65,6 +65,7 @@
     static_assert( std::is_trivially_destructible<I1>::value, "");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     typedef std::istream_iterator<unsigned, wchar_t> I2; // unsigned is trivially destructible
 #if TEST_STD_VER <= 14
@@ -82,6 +83,7 @@
     static_assert( std::is_trivially_copy_constructible<I2>::value, "");
     static_assert( std::is_trivially_destructible<I2>::value, "");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     typedef std::istream_iterator<std::string> I3; // string is NOT trivially destructible
     static_assert(!std::is_trivially_copy_constructible<I3>::value, "");
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp
index 9502e0d..ccda358 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp
@@ -32,6 +32,8 @@
         (void)it2;
 #endif
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::istreambuf_iterator<wchar_t> T;
         T it;
@@ -41,6 +43,7 @@
         (void)it2;
 #endif
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp
index 6b52cf5..db99f46 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp
@@ -30,6 +30,7 @@
         std::istreambuf_iterator<char> i(inf);
         assert(i != std::istreambuf_iterator<char>());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf;
         std::istreambuf_iterator<wchar_t> i(inf);
@@ -40,6 +41,7 @@
         std::istreambuf_iterator<wchar_t> i(inf);
         assert(i != std::istreambuf_iterator<wchar_t>());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp
index 4fd6506..4ad6c38 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp
@@ -27,6 +27,7 @@
         assert(i != std::istreambuf_iterator<char>());
         assert(*i == 'b');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf(L"abc");
         std::istreambuf_iterator<wchar_t> j(inf);
@@ -34,6 +35,7 @@
         assert(i != std::istreambuf_iterator<wchar_t>());
         assert(*i == L'b');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp
index e851379..bb83a55 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp
@@ -34,6 +34,7 @@
         std::istreambuf_iterator<char> i(inf.rdbuf());
         assert(i != std::istreambuf_iterator<char>());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::istreambuf_iterator<wchar_t> i(nullptr);
         assert(i == std::istreambuf_iterator<wchar_t>());
@@ -48,6 +49,7 @@
         std::istreambuf_iterator<wchar_t> i(inf.rdbuf());
         assert(i != std::istreambuf_iterator<wchar_t>());
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_equal/equal.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_equal/equal.pass.cpp
index 95db77e..ba6e2b4 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_equal/equal.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_equal/equal.pass.cpp
@@ -59,6 +59,7 @@
         assert( i5.equal(i4));
         assert( i5.equal(i5));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf1(L"abc");
         std::wistringstream inf2(L"def");
@@ -98,6 +99,7 @@
         assert( i5.equal(i4));
         assert( i5.equal(i5));
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git "a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op\041=/not_equal.pass.cpp" "b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op\041=/not_equal.pass.cpp"
index daf325c..2771911 100644
--- "a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op\041=/not_equal.pass.cpp"
+++ "b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op\041=/not_equal.pass.cpp"
@@ -61,6 +61,7 @@
         assert(!(i5 != i4));
         assert(!(i5 != i5));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf1(L"abc");
         std::wistringstream inf2(L"def");
@@ -100,6 +101,7 @@
         assert(!(i5 != i4));
         assert(!(i5 != i5));
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op++/dereference.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op++/dereference.pass.cpp
index 1309c69..431e8d8 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op++/dereference.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op++/dereference.pass.cpp
@@ -29,6 +29,7 @@
         ++i;
         assert(*i == 'c');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf(L"abc");
         std::istreambuf_iterator<wchar_t> i(inf);
@@ -38,6 +39,7 @@
         ++i;
         assert(*i == L'c');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op==/equal.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op==/equal.pass.cpp
index 1c0c88f..c0fbf68 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op==/equal.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op==/equal.pass.cpp
@@ -61,6 +61,7 @@
         assert( (i5 == i4));
         assert( (i5 == i5));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf1(L"abc");
         std::wistringstream inf2(L"def");
@@ -100,6 +101,7 @@
         assert( (i5 == i4));
         assert( (i5 == i5));
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/post_increment.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/post_increment.pass.cpp
index 7c52e1b..c325e45 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/post_increment.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/post_increment.pass.cpp
@@ -28,6 +28,7 @@
         assert(*i++ == 'c');
         assert(i == std::istreambuf_iterator<char>());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf(L"abc");
         std::istreambuf_iterator<wchar_t> i(inf);
@@ -36,6 +37,7 @@
         assert(*i++ == L'c');
         assert(i == std::istreambuf_iterator<wchar_t>());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/pre_increment.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/pre_increment.pass.cpp
index da11ca0..c2e28ed 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/pre_increment.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_op_astrk/pre_increment.pass.cpp
@@ -29,6 +29,7 @@
         assert(*++i == 'c');
         assert(++i == std::istreambuf_iterator<char>());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf(L"abc");
         std::istreambuf_iterator<wchar_t> i(inf);
@@ -37,6 +38,7 @@
         assert(*++i == L'c');
         assert(++i == std::istreambuf_iterator<wchar_t>());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp
index f385a40..b70dab2 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator_proxy/proxy.pass.cpp
@@ -33,11 +33,13 @@
         std::istreambuf_iterator<char> i(inf);
         assert(*i++ == 'a');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream inf(L"abc");
         std::istreambuf_iterator<wchar_t> i(inf);
         assert(*i++ == L'a');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp b/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp
index 257a266..278470e 100644
--- a/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp
+++ b/test/std/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp
@@ -58,6 +58,7 @@
     static_assert((std::is_trivially_destructible<I1>::value), "" );
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     typedef std::istreambuf_iterator<wchar_t> I2;
 #if TEST_STD_VER <= 14
@@ -78,6 +79,7 @@
     static_assert((std::is_trivially_copy_constructible<I2>::value), "" );
     static_assert((std::is_trivially_destructible<I2>::value), "" );
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delim.pass.cpp b/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delim.pass.cpp
index 766e989..f63aa88 100644
--- a/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delim.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delim.pass.cpp
@@ -33,11 +33,13 @@
         std::ostream_iterator<int> i(outf, ", ");
         assert(outf.good());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostream_iterator<double, wchar_t> i(outf, L", ");
         assert(outf.good());
     }
+#endif
     {
         StringStream outf;
         std::ostream_iterator<int, char, MyTraits> i(outf, ", ");
diff --git a/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp b/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp
index 5a2f2cc..fe140c3 100644
--- a/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp
@@ -40,6 +40,7 @@
         i = 2.4;
         assert(outf.str() == "2, ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostream_iterator<int, wchar_t> i(outf);
@@ -52,6 +53,7 @@
         i = 2.4;
         assert(outf.str() == L"2, ");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp b/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp
index 042feeb..b2f5b8c 100644
--- a/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostream.iterator/types.pass.cpp
@@ -54,6 +54,7 @@
     static_assert((std::is_same<I1::ostream_type, std::ostream>::value), "");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     typedef std::ostream_iterator<unsigned, wchar_t> I2;
 #if TEST_STD_VER <= 14
@@ -73,6 +74,7 @@
     static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), "");
     static_assert((std::is_same<I2::ostream_type, std::wostream>::value), "");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp
index 7be77cb..12d1756 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp
@@ -25,11 +25,13 @@
         std::ostreambuf_iterator<char> i(outf);
         assert(!i.failed());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostreambuf_iterator<wchar_t> i(outf);
         assert(!i.failed());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp
index 0fda71b..9d534e3 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp
@@ -25,11 +25,13 @@
         std::ostreambuf_iterator<char> i(outf.rdbuf());
         assert(!i.failed());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostreambuf_iterator<wchar_t> i(outf.rdbuf());
         assert(!i.failed());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp
index b33eb5b..401d9cb 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp
@@ -29,6 +29,7 @@
         i = 'b';
         assert(outf.str() == "ab");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostreambuf_iterator<wchar_t> i(outf);
@@ -37,6 +38,7 @@
         i = L'b';
         assert(outf.str() == L"ab");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp
index fcd88b9..671d452 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp
@@ -26,12 +26,14 @@
         std::ostreambuf_iterator<char>& iref = *i;
         assert(&iref == &i);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostreambuf_iterator<wchar_t> i(outf);
         std::ostreambuf_iterator<wchar_t>& iref = *i;
         assert(&iref == &i);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp
index d2714d1..54b6e4b 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp
@@ -35,12 +35,14 @@
         i = 'a';
         assert(i.failed());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         my_streambuf<wchar_t> buf;
         std::ostreambuf_iterator<wchar_t> i(&buf);
         i = L'a';
         assert(i.failed());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp
index 49f9458..88d4e27 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp
@@ -29,6 +29,7 @@
         std::ostreambuf_iterator<char>& iref2 = i++;
         assert(&iref2 == &i);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream outf;
         std::ostreambuf_iterator<wchar_t> i(outf);
@@ -37,6 +38,7 @@
         std::ostreambuf_iterator<wchar_t>& iref2 = i++;
         assert(&iref2 == &i);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp b/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp
index b1260aa..9562297 100644
--- a/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp
+++ b/test/std/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp
@@ -56,6 +56,7 @@
     static_assert((std::is_same<I1::ostream_type, std::ostream>::value), "");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     typedef std::ostreambuf_iterator<wchar_t> I2;
 #if TEST_STD_VER <= 14
@@ -76,6 +77,7 @@
     static_assert((std::is_same<I2::streambuf_type, std::wstreambuf>::value), "");
     static_assert((std::is_same<I2::ostream_type, std::wostream>::value), "");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/language.support/cstdint/cstdint.syn/cstdint.pass.cpp b/test/std/language.support/cstdint/cstdint.syn/cstdint.pass.cpp
index 00c09b7..682c382 100644
--- a/test/std/language.support/cstdint/cstdint.syn/cstdint.pass.cpp
+++ b/test/std/language.support/cstdint/cstdint.syn/cstdint.pass.cpp
@@ -10,9 +10,7 @@
 
 #include <cstdint>
 #include <cstddef>
-#include <cwchar>
 #include <csignal>
-#include <cwctype>
 #include <climits>
 #include <type_traits>
 #include <limits>
@@ -20,6 +18,11 @@
 
 #include "test_macros.h"
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar>
+#   include <cwctype>
+#endif
+
 int main(int, char**)
 {
     // typedef std::int8_t
@@ -239,6 +242,7 @@
     // SIZE_MAX
     assert(SIZE_MAX == std::numeric_limits<std::size_t>::max());
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     // WCHAR_MIN
     assert(WCHAR_MIN == std::numeric_limits<wchar_t>::min());
 
@@ -250,6 +254,7 @@
 
     // WINT_MAX
     assert(WINT_MAX == std::numeric_limits<std::wint_t>::max());
+#endif
 
 #ifndef INT8_C
 #error INT8_C not defined
diff --git a/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp b/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
index bc4f7a4..0169f2e 100644
--- a/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
+++ b/test/std/language.support/support.limits/limits/numeric.limits.members/lowest.pass.cpp
@@ -12,12 +12,15 @@
 
 #include <limits>
 #include <climits>
-#include <cwchar>
 #include <cfloat>
 #include <cassert>
 
 #include "test_macros.h"
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar>
+#endif
+
 template <class T>
 void
 test(T expected)
@@ -38,7 +41,9 @@
     test<char>(CHAR_MIN);
     test<signed char>(SCHAR_MIN);
     test<unsigned char>(0);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(WCHAR_MIN);
+#endif
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
     test<char8_t>(0);
 #endif
diff --git a/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp b/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
index d40ac23..dd68996 100644
--- a/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
+++ b/test/std/language.support/support.limits/limits/numeric.limits.members/max.pass.cpp
@@ -12,12 +12,15 @@
 
 #include <limits>
 #include <climits>
-#include <cwchar>
 #include <cfloat>
 #include <cassert>
 
 #include "test_macros.h"
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar>
+#endif
+
 template <class T>
 void
 test(T expected)
@@ -38,7 +41,9 @@
     test<char>(CHAR_MAX);
     test<signed char>(SCHAR_MAX);
     test<unsigned char>(UCHAR_MAX);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(WCHAR_MAX);
+#endif
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
     test<char8_t>(UCHAR_MAX); // ??
 #endif
diff --git a/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp b/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
index 25a59f3..525d7db 100644
--- a/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
+++ b/test/std/language.support/support.limits/limits/numeric.limits.members/min.pass.cpp
@@ -12,12 +12,15 @@
 
 #include <limits>
 #include <climits>
-#include <cwchar>
 #include <cfloat>
 #include <cassert>
 
 #include "test_macros.h"
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   include <cwchar>
+#endif
+
 template <class T>
 void
 test(T expected)
@@ -38,7 +41,9 @@
     test<char>(CHAR_MIN);
     test<signed char>(SCHAR_MIN);
     test<unsigned char>(0);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(WCHAR_MIN);
+#endif
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
     test<char8_t>(0);
 #endif
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
index 8d759ac..65baa2a 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate.byname/compare.pass.cpp
@@ -45,6 +45,7 @@
             assert(f.compare(s2.data(), s2.data() + s2.size(),
                              s3.data(), s3.data() + s3.size()) == 1);
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             const std::collate<wchar_t>& f = std::use_facet<std::collate<wchar_t> >(l);
             std::wstring s2(L"aaaaaaA");
@@ -52,6 +53,7 @@
             assert(f.compare(s2.data(), s2.data() + s2.size(),
                              s3.data(), s3.data() + s3.size()) == 1);
         }
+#endif
     }
     {
         std::locale l("C");
@@ -62,6 +64,7 @@
             assert(f.compare(s2.data(), s2.data() + s2.size(),
                              s3.data(), s3.data() + s3.size()) == 1);
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             const std::collate<wchar_t>& f = std::use_facet<std::collate<wchar_t> >(l);
             std::wstring s2(L"aaaaaaA");
@@ -69,6 +72,7 @@
             assert(f.compare(s2.data(), s2.data() + s2.size(),
                              s3.data(), s3.data() + s3.size()) == 1);
         }
+#endif
     }
 
   return 0;
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate.byname/hash.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate.byname/hash.pass.cpp
index 8be36e3..8375763 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate.byname/hash.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate.byname/hash.pass.cpp
@@ -36,6 +36,7 @@
         assert(f.hash(x1.data(), x1.data() + x1.size())
             != f.hash(x2.data(), x2.data() + x2.size()));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstring x1(L"1234");
         std::wstring x2(L"12345");
@@ -43,6 +44,7 @@
         assert(f.hash(x1.data(), x1.data() + x1.size())
             != f.hash(x2.data(), x2.data() + x2.size()));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp
index cab2f01..8d076fd 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate.byname/transform.pass.cpp
@@ -35,11 +35,13 @@
             const std::collate<char>& f = std::use_facet<std::collate<char> >(l);
             assert(f.transform(x.data(), x.data() + x.size()) != x);
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             std::wstring x(L"1234");
             const std::collate<wchar_t>& f = std::use_facet<std::collate<wchar_t> >(l);
             assert(f.transform(x.data(), x.data() + x.size()) != x);
         }
+#endif
     }
     {
         std::locale l("C");
@@ -48,11 +50,13 @@
             const std::collate<char>& f = std::use_facet<std::collate<char> >(l);
             assert(f.transform(x.data(), x.data() + x.size()) == x);
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             std::wstring x(L"1234");
             const std::collate<wchar_t>& f = std::use_facet<std::collate<wchar_t> >(l);
             assert(f.transform(x.data(), x.data() + x.size()) == x);
         }
+#endif
     }
 
   return 0;
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate.byname/types.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate.byname/types.pass.cpp
index 364783e..ba70804 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate.byname/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate.byname/types.pass.cpp
@@ -39,11 +39,13 @@
         assert(&std::use_facet<std::collate<char> >(l)
             == &std::use_facet<std::collate_byname<char> >(l));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         assert(std::has_facet<std::collate_byname<wchar_t> >(l));
         assert(&std::use_facet<std::collate<wchar_t> >(l)
             == &std::use_facet<std::collate_byname<wchar_t> >(l));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate/ctor.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate/ctor.pass.cpp
index eb8003e..024d61f 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate/ctor.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate/ctor.pass.cpp
@@ -50,6 +50,8 @@
         assert(my_facet<char>::count == 1);
     }
     assert(my_facet<char>::count == 0);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::locale l(std::locale::classic(), new my_facet<wchar_t>);
         assert(my_facet<wchar_t>::count == 1);
@@ -65,6 +67,7 @@
         assert(my_facet<wchar_t>::count == 1);
     }
     assert(my_facet<wchar_t>::count == 0);
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/compare.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/compare.pass.cpp
index 7e2833b..a3023cf 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/compare.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/compare.pass.cpp
@@ -37,6 +37,7 @@
         assert(f.compare(ib+1, ib+3, ia, ia+sa) == 1);
         assert(f.compare(ia, ia+3, ib, ib+3) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         const wchar_t ia[] = L"1234";
         const unsigned sa = sizeof(ia)/sizeof(ia[0]);
@@ -50,6 +51,7 @@
         assert(f.compare(ib+1, ib+3, ia, ia+sa) == 1);
         assert(f.compare(ia, ia+3, ib, ib+3) == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/hash.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/hash.pass.cpp
index 777ba4b..7a298c5 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/hash.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/hash.pass.cpp
@@ -33,6 +33,7 @@
         assert(f.hash(x1.data(), x1.data() + x1.size())
             != f.hash(x2.data(), x2.data() + x2.size()));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstring x1(L"1234");
         std::wstring x2(L"12345");
@@ -40,6 +41,7 @@
         assert(f.hash(x1.data(), x1.data() + x1.size())
             != f.hash(x2.data(), x2.data() + x2.size()));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/transform.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/transform.pass.cpp
index 0f1bf22..fdee9d7 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/transform.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate/locale.collate.members/transform.pass.cpp
@@ -26,11 +26,13 @@
         const std::collate<char>& f = std::use_facet<std::collate<char> >(l);
         assert(f.transform(x.data(), x.data() + x.size()) == x);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstring x(L"1234");
         const std::collate<wchar_t>& f = std::use_facet<std::collate<wchar_t> >(l);
         assert(f.transform(x.data(), x.data() + x.size()) == x);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.collate/locale.collate/types.pass.cpp b/test/std/localization/locale.categories/category.collate/locale.collate/types.pass.cpp
index 1742e6a..6990fff 100644
--- a/test/std/localization/locale.categories/category.collate/locale.collate/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.collate/locale.collate/types.pass.cpp
@@ -38,6 +38,7 @@
         static_assert((std::is_same<std::collate<char>::string_type, std::string>::value), "");
         static_assert((std::is_base_of<std::locale::facet, std::collate<char> >::value), "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         assert(std::has_facet<std::collate<wchar_t> >(l));
         const std::collate<wchar_t>& f = std::use_facet<std::collate<wchar_t> >(l);
@@ -49,6 +50,7 @@
         static_assert((std::is_same<std::collate<wchar_t>::string_type, std::wstring>::value), "");
         static_assert((std::is_base_of<std::locale::facet, std::collate<wchar_t> >::value), "");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_wchar_t.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_wchar_t.pass.cpp
index 8b1ae46..a5dd77b 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_wchar_t.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt.byname/ctor_wchar_t.pass.cpp
@@ -15,6 +15,8 @@
 // explicit codecvt_byname(const char* nm, size_t refs = 0);
 // explicit codecvt_byname(const string& nm, size_t refs = 0);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_wchar_t.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_wchar_t.pass.cpp
index c5abf8a..a10aa75 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_wchar_t.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/ctor_wchar_t.pass.cpp
@@ -12,6 +12,8 @@
 
 // explicit codecvt(size_t refs = 0);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_always_noconv.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_always_noconv.pass.cpp
index 10ea879..dde8385 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_always_noconv.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_always_noconv.pass.cpp
@@ -12,6 +12,8 @@
 
 // bool always_noconv() const throw();
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_encoding.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_encoding.pass.cpp
index e46754e..5a6a99d 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_encoding.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_encoding.pass.cpp
@@ -12,6 +12,8 @@
 
 // int encoding() const throw();
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_in.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_in.pass.cpp
index 832aedf..b3c6f71 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_in.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_in.pass.cpp
@@ -14,6 +14,8 @@
 //           const externT* from, const externT* from_end, const externT*& from_next,
 //           internT* to, internT* to_end, internT*& to_next) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_length.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_length.pass.cpp
index 536bab4..997712b 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_length.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_length.pass.cpp
@@ -12,6 +12,8 @@
 
 // int length(stateT& state, const externT* from, const externT* from_end, size_t max) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_max_length.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_max_length.pass.cpp
index 8e58726..2831e26 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_max_length.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_max_length.pass.cpp
@@ -12,6 +12,8 @@
 
 // int max_length() const throw();
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp
index 90caf5e..1fd7faf 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_out.pass.cpp
@@ -14,6 +14,8 @@
 //            const internT* from, const internT* from_end, const internT*& from_next,
 //            externT* to, externT* to_end, externT*& to_next) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_unshift.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_unshift.pass.cpp
index bc7246f..ad61fb6 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_unshift.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/locale.codecvt.members/wchar_t_unshift.pass.cpp
@@ -13,6 +13,8 @@
 // result unshift(stateT& state,
 //                externT* to, externT* to_end, externT*& to_next) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // This is pretty much just an "are you breathing" test
 
 #include <locale>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_wchar_t.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_wchar_t.pass.cpp
index da36774..e108491 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_wchar_t.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.codecvt/types_wchar_t.pass.cpp
@@ -20,6 +20,8 @@
 //     ...
 // };
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <type_traits>
 #include <cassert>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp
index d033ec9..04ab910 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_1.pass.cpp
@@ -14,6 +14,7 @@
 
 // REQUIRES: locale.en_US.UTF-8
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 #include <locale>
 #include <type_traits>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp
index 97ffeb2..4f163d7 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/is_many.pass.cpp
@@ -14,6 +14,7 @@
 
 // REQUIRES: locale.en_US.UTF-8
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 #include <locale>
 #include <string>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/mask.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/mask.pass.cpp
index d9ca398..6f2452e 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/mask.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/mask.pass.cpp
@@ -20,37 +20,42 @@
 
 int main(int, char**)
 {
+    std::locale l("C");
     {
-        std::locale l("C");
-        {
-            typedef std::ctype<wchar_t> WF;
-            const WF& wf = std::use_facet<WF>(l);
-            typedef std::ctype<char> CF;
-            const CF& cf = std::use_facet<CF>(l);
+        typedef std::ctype<char> CF;
+        const CF& cf = std::use_facet<CF>(l);
 
-            // The ctype masks in Newlib don't form a proper bitmask because
-            // the mask is only 8 bits wide, and there are more than 8 mask
-            // kinds. This means that the mask for alpha is (_U | _L), which
-            // is tricky to match in the do_is implementation because in
-            // [22.4.1.1.2 2] the standard specifies that the match code behaves
-            // like (m & M) != 0, but following this exactly would give false
-            // positives for characters that are both 'upper' and 'alpha', but
-            // not 'lower', for example.
-            assert( wf.is(WF::upper, L'A'));
-            assert( cf.is(CF::upper,  'A'));
-            assert(!wf.is(WF::lower, L'A'));
-            assert(!cf.is(CF::lower,  'A'));
-            assert( wf.is(WF::alpha, L'A'));
-            assert( cf.is(CF::alpha,  'A'));
+        // NOTE:
+        // The ctype masks in Newlib don't form a proper bitmask because
+        // the mask is only 8 bits wide, and there are more than 8 mask
+        // kinds. This means that the mask for alpha is (_U | _L), which
+        // is tricky to match in the do_is implementation because in
+        // [22.4.1.1.2 2] the standard specifies that the match code behaves
+        // like (m & M) != 0, but following this exactly would give false
+        // positives for characters that are both 'upper' and 'alpha', but
+        // not 'lower', for example.
+        assert( cf.is(CF::upper,  'A'));
+        assert(!cf.is(CF::lower,  'A'));
+        assert( cf.is(CF::alpha,  'A'));
 
-            assert(!wf.is(WF::upper, L'a'));
-            assert(!cf.is(CF::upper,  'a'));
-            assert( wf.is(WF::lower, L'a'));
-            assert( cf.is(CF::lower,  'a'));
-            assert( wf.is(WF::alpha, L'a'));
-            assert( cf.is(CF::alpha,  'a'));
-        }
+        assert(!cf.is(CF::upper,  'a'));
+        assert( cf.is(CF::lower,  'a'));
+        assert( cf.is(CF::alpha,  'a'));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        typedef std::ctype<wchar_t> WF;
+        const WF& wf = std::use_facet<WF>(l);
+
+        assert( wf.is(WF::upper, L'A'));
+        assert(!wf.is(WF::lower, L'A'));
+        assert( wf.is(WF::alpha, L'A'));
+
+        assert(!wf.is(WF::upper, L'a'));
+        assert( wf.is(WF::lower, L'a'));
+        assert( wf.is(WF::alpha, L'a'));
+    }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
index b819b62..2c2f9b6 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_1.pass.cpp
@@ -9,6 +9,7 @@
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_CA.ISO8859-1
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 // <locale>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
index 3f8e538..8cb1e22 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/narrow_many.pass.cpp
@@ -9,6 +9,7 @@
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_CA.ISO8859-1
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 // <locale>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp
index 2329d9b..24d0010 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_is.pass.cpp
@@ -14,6 +14,7 @@
 
 // REQUIRES: locale.en_US.UTF-8
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 #include <locale>
 #include <string>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp
index 39e1bd5..7e3c818 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/scan_not.pass.cpp
@@ -14,6 +14,7 @@
 
 // REQUIRES: locale.en_US.UTF-8
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 #include <locale>
 #include <string>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
index 702d84a..a85f89f 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_1.pass.cpp
@@ -55,6 +55,7 @@
             assert(f.tolower('\xFA') == '\xFA');
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::locale l;
         {
@@ -89,6 +90,7 @@
             assert(f.tolower(L'\xFA') == L'\xFA');
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
index 7965239..8363b57 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/tolower_many.pass.cpp
@@ -59,6 +59,7 @@
             assert(in[6] == '1');
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::locale l;
         {
@@ -95,6 +96,7 @@
             assert(in[6] == L'1');
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
index dd4f80d..503cb19 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_1.pass.cpp
@@ -57,6 +57,7 @@
             assert(f.toupper('\xFA') == '\xFA');
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::locale l;
         {
@@ -91,6 +92,7 @@
             assert(f.toupper(L'\xFA') == L'\xFA');
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
index d66b5f1..ffb3b7e 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/toupper_many.pass.cpp
@@ -59,6 +59,7 @@
             assert(in[6] == '1');
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::locale l;
         {
@@ -95,6 +96,7 @@
             assert(in[6] == L'1');
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/types.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/types.pass.cpp
index 9fb4c44..81760b8 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/types.pass.cpp
@@ -38,11 +38,13 @@
             assert(&std::use_facet<std::ctype<char> >(l)
                 == &std::use_facet<std::ctype_byname<char> >(l));
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             assert(std::has_facet<std::ctype_byname<wchar_t> >(l));
             assert(&std::use_facet<std::ctype<wchar_t> >(l)
                 == &std::use_facet<std::ctype_byname<wchar_t> >(l));
         }
+#endif
     }
     {
         std::locale l("C");
@@ -51,11 +53,13 @@
             assert(&std::use_facet<std::ctype<char> >(l)
                 == &std::use_facet<std::ctype_byname<char> >(l));
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             assert(std::has_facet<std::ctype_byname<wchar_t> >(l));
             assert(&std::use_facet<std::ctype<wchar_t> >(l)
                 == &std::use_facet<std::ctype_byname<wchar_t> >(l));
         }
+#endif
     }
 
   return 0;
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
index 2d096e9..f737feb 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_1.pass.cpp
@@ -8,6 +8,7 @@
 
 // REQUIRES: locale.en_US.UTF-8
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 // <locale>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
index 3550c54..d50639b 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype.byname/widen_many.pass.cpp
@@ -8,6 +8,7 @@
 
 // REQUIRES: locale.en_US.UTF-8
 // XFAIL: LIBCXX-WINDOWS-FIXME
+// XFAIL: libcpp-has-no-wide-characters
 
 // <locale>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/ctor.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/ctor.pass.cpp
index ab7d149..c43e9e6 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/ctor.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/ctor.pass.cpp
@@ -12,6 +12,8 @@
 
 // explicit ctype(size_t refs = 0);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_1.pass.cpp
index b5c897b..df7981a 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_1.pass.cpp
@@ -12,6 +12,8 @@
 
 // bool is(mask m, charT c) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_many.pass.cpp
index 6f0da92..f95e58e 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/is_many.pass.cpp
@@ -12,6 +12,8 @@
 
 // const charT* do_is(const charT* low, const charT* high, mask* vec) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_1.pass.cpp
index d973214..6477247 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_1.pass.cpp
@@ -12,6 +12,8 @@
 
 // char narrow(charT c, char dfault) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_many.pass.cpp
index 9709620..db5f8ae 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/narrow_many.pass.cpp
@@ -12,6 +12,8 @@
 
 // const charT* narrow(const charT* low, const charT*, char dfault, char* to) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_is.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_is.pass.cpp
index 95921a4..864c20f 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_is.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_is.pass.cpp
@@ -12,6 +12,8 @@
 
 // const charT* scan_is(mask m, const charT* low, const charT* high) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_not.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_not.pass.cpp
index 6e778d3..41362cf 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_not.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/scan_not.pass.cpp
@@ -12,6 +12,8 @@
 
 // const charT* scan_not(mask m, const charT* low, const charT* high) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_1.pass.cpp
index e8fbb51..50628ad 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_1.pass.cpp
@@ -12,6 +12,8 @@
 
 // charT tolower(charT) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_many.pass.cpp
index 29a4dcd..d93d51d 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/tolower_many.pass.cpp
@@ -12,6 +12,8 @@
 
 // const charT* tolower(charT* low, const charT* high) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <cassert>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_1.pass.cpp
index 15e036f..3905161 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_1.pass.cpp
@@ -12,6 +12,8 @@
 
 // charT toupper(charT) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_many.pass.cpp
index 431b01a..70bb0fd 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/toupper_many.pass.cpp
@@ -12,6 +12,8 @@
 
 // const charT* toupper(charT* low, const charT* high) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <cassert>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_1.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_1.pass.cpp
index 03d753e..7cdc832 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_1.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_1.pass.cpp
@@ -12,6 +12,8 @@
 
 // charT widen(char c) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_many.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_many.pass.cpp
index de3027f..eb600d7 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_many.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/locale.ctype.members/widen_many.pass.cpp
@@ -12,6 +12,8 @@
 
 // const char* widen(const char* low, const char* high, charT* to) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <string>
 #include <vector>
diff --git a/test/std/localization/locale.categories/category.ctype/locale.ctype/types.pass.cpp b/test/std/localization/locale.categories/category.ctype/locale.ctype/types.pass.cpp
index 4dd30bb..a1e7ced 100644
--- a/test/std/localization/locale.categories/category.ctype/locale.ctype/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.ctype/locale.ctype/types.pass.cpp
@@ -17,6 +17,8 @@
 //     typedef CharT char_type;
 // };
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <type_traits>
 #include <cassert>
diff --git a/test/std/localization/locale.categories/category.messages/locale.messages/types.pass.cpp b/test/std/localization/locale.categories/category.messages/locale.messages/types.pass.cpp
index 58b7854..58348de 100644
--- a/test/std/localization/locale.categories/category.messages/locale.messages/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.messages/locale.messages/types.pass.cpp
@@ -26,12 +26,15 @@
 {
     static_assert((std::is_base_of<std::locale::facet, std::messages<char> >::value), "");
     static_assert((std::is_base_of<std::messages_base, std::messages<char> >::value), "");
+    static_assert((std::is_same<std::messages<char>::char_type, char>::value), "");
+    static_assert((std::is_same<std::messages<char>::string_type, std::string>::value), "");
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert((std::is_base_of<std::locale::facet, std::messages<wchar_t> >::value), "");
     static_assert((std::is_base_of<std::messages_base, std::messages<wchar_t> >::value), "");
-    static_assert((std::is_same<std::messages<char>::char_type, char>::value), "");
     static_assert((std::is_same<std::messages<wchar_t>::char_type, wchar_t>::value), "");
-    static_assert((std::is_same<std::messages<char>::string_type, std::string>::value), "");
     static_assert((std::is_same<std::messages<wchar_t>::string_type, std::wstring>::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp
index 24167bb..df51cd9 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_en_US.pass.cpp
@@ -35,6 +35,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_get<wchar_t, cpp17_input_iterator<const wchar_t*> > Fw;
 
 class my_facetw
@@ -44,6 +45,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -53,10 +55,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
     {
         const my_facet f(1);
         // char, national
@@ -389,6 +393,7 @@
             assert(err == std::ios_base::failbit);
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         const my_facetw f(1);
         // wchar_t, national
@@ -721,6 +726,7 @@
             assert(err == std::ios_base::failbit);
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     {
       // test for err
       const my_facet f(1);
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp
index 20bcfdd..591d7f4 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_fr_FR.pass.cpp
@@ -41,6 +41,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_get<wchar_t, cpp17_input_iterator<const wchar_t*> > Fw;
 
 class my_facetw
@@ -77,6 +78,7 @@
   return in;
 #endif
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -86,10 +88,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
     {
         const my_facet f(1);
         // char, national
@@ -423,6 +427,7 @@
             assert(ex == 123456789);
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         const my_facetw f(1);
         // wchar_t, national
@@ -755,6 +760,7 @@
             assert(ex == 123456789);
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
index 5963aee..ff33764 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_ru_RU.pass.cpp
@@ -58,6 +58,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_get<wchar_t, cpp17_input_iterator<const wchar_t*> > Fw;
 
 class my_facetw
@@ -67,6 +68,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -76,10 +78,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
     {
         const my_facet f(1);
         // char, national
@@ -422,6 +426,7 @@
             assert(ex == -123456789);
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         const my_facetw f(1);
         // wchar_t, national
@@ -764,6 +769,7 @@
             assert(ex == -123456789);
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
index 8cf77b4..3e59cfd 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_long_double_zh_CN.pass.cpp
@@ -42,6 +42,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_get<wchar_t, cpp17_input_iterator<const wchar_t*> > Fw;
 
 class my_facetw
@@ -51,6 +52,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -60,10 +62,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
     {
         const my_facet f(1);
         // char, national
@@ -396,6 +400,7 @@
             assert(err == std::ios_base::failbit);
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         const my_facetw f(1);
         // wchar_t, national
@@ -728,6 +733,7 @@
             assert(err == std::ios_base::failbit);
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp
index 08119ec..4e0c059 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.get/locale.money.get.members/get_string_en_US.pass.cpp
@@ -35,6 +35,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_get<wchar_t, cpp17_input_iterator<const wchar_t*> > Fw;
 
 class my_facetw
@@ -44,6 +45,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -53,10 +55,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
     {
         const my_facet f(1);
         // char, national
@@ -393,6 +397,7 @@
             assert(ex == "");
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         const my_facetw f(1);
         // wchar_t, national
@@ -729,6 +734,7 @@
             assert(ex == L"");
         }
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     {
       // test for err
       const my_facet f(1);
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.get/types.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.get/types.pass.cpp
index ed4baad..5459f9e 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.get/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.get/types.pass.cpp
@@ -25,13 +25,16 @@
 int main(int, char**)
 {
     static_assert((std::is_base_of<std::locale::facet, std::money_get<char> >::value), "");
-    static_assert((std::is_base_of<std::locale::facet, std::money_get<wchar_t> >::value), "");
     static_assert((std::is_same<std::money_get<char>::char_type, char>::value), "");
-    static_assert((std::is_same<std::money_get<wchar_t>::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::money_get<char>::iter_type, std::istreambuf_iterator<char> >::value), "");
-    static_assert((std::is_same<std::money_get<wchar_t>::iter_type, std::istreambuf_iterator<wchar_t> >::value), "");
     static_assert((std::is_same<std::money_get<char>::string_type, std::string>::value), "");
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    static_assert((std::is_base_of<std::locale::facet, std::money_get<wchar_t> >::value), "");
+    static_assert((std::is_same<std::money_get<wchar_t>::char_type, wchar_t>::value), "");
+    static_assert((std::is_same<std::money_get<wchar_t>::iter_type, std::istreambuf_iterator<wchar_t> >::value), "");
     static_assert((std::is_same<std::money_get<wchar_t>::string_type, std::wstring>::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp
index bf47e14..d74f25b 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_en_US.pass.cpp
@@ -35,6 +35,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
 
 class my_facetw
@@ -44,6 +45,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -53,10 +55,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
 {
     const my_facet f(1);
     // char, national
@@ -273,8 +277,8 @@
         assert(ios.width() == 0);
     }
 }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 {
-
     const my_facetw f(1);
     // wchar_t, national
     noshowbase(ios);
@@ -492,6 +496,7 @@
         assert(ios.width() == 0);
     }
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp
index 6b23343..e20cb97 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_fr_FR.pass.cpp
@@ -41,6 +41,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
 
 class my_facetw
@@ -79,6 +80,7 @@
   return in;
 #endif
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -88,10 +90,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
 {
     const my_facet f(1);
     // char, national
@@ -308,6 +312,7 @@
         assert(ios.width() == 0);
     }
 }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 {
     const my_facetw f(1);
     // wchar_t, national
@@ -526,6 +531,7 @@
         assert(ios.width() == 0);
     }
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
index 1d73718..81b2b39 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_ru_RU.pass.cpp
@@ -58,6 +58,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
 
 class my_facetw
@@ -67,6 +68,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -76,10 +78,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
 {
     const my_facet f(1);
     // char, national
@@ -116,7 +120,7 @@
         std::string ex(str, iter.base());
         assert(ex == "-1 234 567,89 ");
     }
-#endif
+#endif // APPLE_FIXME
     {   // zero, showbase
         long double v = 0;
         showbase(ios);
@@ -262,7 +266,7 @@
         std::string ex(str, iter.base());
         assert(ex == "-1 234 567,89 RUB ");
     }
-#endif
+#endif // APPLE_FIXME
     {   // negative, showbase, left
         long double v = -123456789;
         showbase(ios);
@@ -300,8 +304,9 @@
         assert(ex == "  -1 234 567,89 RUB ");
         assert(ios.width() == 0);
     }
-#endif
+#endif // APPLE_FIXME
 }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 {
     const my_facetw f(1);
     // wchar_t, national
@@ -340,7 +345,7 @@
         std::wstring ex(str, iter.base());
         assert(ex == L"-1 234 567,89 ");
     }
-#endif
+#endif // APPLE_FIXME
     {   // zero, showbase
         long double v = 0;
         showbase(ios);
@@ -486,7 +491,7 @@
         std::wstring ex(str, iter.base());
         assert(ex == L"-1 234 567,89 RUB ");
     }
-#endif
+#endif // APPLE_FIXME
     {   // negative, showbase, left
         long double v = -123456789;
         showbase(ios);
@@ -524,8 +529,9 @@
         assert(ex == L"  -1 234 567,89 RUB ");
         assert(ios.width() == 0);
     }
-#endif
+#endif // APPLE_FIXME
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
index 0e5254c..a19b17c 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_long_double_zh_CN.pass.cpp
@@ -42,6 +42,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
 
 class my_facetw
@@ -51,6 +52,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -60,10 +62,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
 {
     const my_facet f(1);
     // char, national
@@ -280,6 +284,7 @@
         assert(ios.width() == 0);
     }
 }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 {
     const my_facetw f(1);
     // wchar_t, national
@@ -498,6 +503,7 @@
         assert(ios.width() == 0);
     }
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp
index a060250..1f300ef 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.put/locale.money.put.members/put_string_en_US.pass.cpp
@@ -36,6 +36,7 @@
         : Fn(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 typedef std::money_put<wchar_t, output_iterator<wchar_t*> > Fw;
 
 class my_facetw
@@ -45,6 +46,7 @@
     explicit my_facetw(std::size_t refs = 0)
         : Fw(refs) {}
 };
+#endif
 
 int main(int, char**)
 {
@@ -54,10 +56,12 @@
                           new std::moneypunct_byname<char, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<char, true>(loc_name)));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, false>(loc_name)));
     ios.imbue(std::locale(ios.getloc(),
                           new std::moneypunct_byname<wchar_t, true>(loc_name)));
+#endif
 {
     const my_facet f(1);
     // char, national
@@ -274,8 +278,8 @@
         assert(ios.width() == 0);
     }
 }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 {
-
     const my_facetw f(1);
     // wchar_t, national
     noshowbase(ios);
@@ -493,6 +497,7 @@
         assert(ios.width() == 0);
     }
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.money.put/types.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.money.put/types.pass.cpp
index 4ac5487..a79ce5c 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.money.put/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.money.put/types.pass.cpp
@@ -25,13 +25,16 @@
 int main(int, char**)
 {
     static_assert((std::is_base_of<std::locale::facet, std::money_put<char> >::value), "");
-    static_assert((std::is_base_of<std::locale::facet, std::money_put<wchar_t> >::value), "");
     static_assert((std::is_same<std::money_put<char>::char_type, char>::value), "");
-    static_assert((std::is_same<std::money_put<wchar_t>::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::money_put<char>::iter_type, std::ostreambuf_iterator<char> >::value), "");
-    static_assert((std::is_same<std::money_put<wchar_t>::iter_type, std::ostreambuf_iterator<wchar_t> >::value), "");
     static_assert((std::is_same<std::money_put<char>::string_type, std::string>::value), "");
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    static_assert((std::is_base_of<std::locale::facet, std::money_put<wchar_t> >::value), "");
+    static_assert((std::is_same<std::money_put<wchar_t>::char_type, wchar_t>::value), "");
+    static_assert((std::is_same<std::money_put<wchar_t>::iter_type, std::ostreambuf_iterator<wchar_t> >::value), "");
     static_assert((std::is_same<std::money_put<wchar_t>::string_type, std::wstring>::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp
index df0d538..99c5097 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp
@@ -47,6 +47,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -62,6 +63,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -73,6 +75,7 @@
         Fnt f("C", 1);
         assert(f.curr_symbol() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.curr_symbol() == std::wstring());
@@ -81,6 +84,7 @@
         Fwt f("C", 1);
         assert(f.curr_symbol() == std::wstring());
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -90,6 +94,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.curr_symbol() == "USD ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.curr_symbol() == L"$");
@@ -98,6 +103,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.curr_symbol() == L"USD ");
     }
+#endif
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -107,6 +113,7 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.curr_symbol() == " EUR");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.curr_symbol() == L" \u20ac");
@@ -115,6 +122,7 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.curr_symbol() == L" EUR");
     }
+#endif
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -134,6 +142,7 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.curr_symbol() == " RUB");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
 #if defined(_CS_GNU_LIBC_VERSION)
@@ -150,6 +159,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.curr_symbol() == L" RUB");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -159,6 +169,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.curr_symbol() == "CNY ");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.curr_symbol() == L"\xFFE5");
@@ -167,6 +178,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.curr_symbol() == L"CNY ");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
index 783e4ec..2d44963 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/decimal_point.pass.cpp
@@ -40,6 +40,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -55,6 +56,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -66,6 +68,7 @@
         Fnt f("C", 1);
         assert(f.decimal_point() == std::numeric_limits<char>::max());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.decimal_point() == std::numeric_limits<wchar_t>::max());
@@ -74,6 +77,7 @@
         Fwt f("C", 1);
         assert(f.decimal_point() == std::numeric_limits<wchar_t>::max());
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -83,6 +87,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.decimal_point() == '.');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.decimal_point() == L'.');
@@ -91,6 +96,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.decimal_point() == L'.');
     }
+#endif
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -100,6 +106,7 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.decimal_point() == ',');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.decimal_point() == L',');
@@ -108,14 +115,20 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.decimal_point() == L',');
     }
+#endif
+
 // GLIBC 2.23 uses '.' as the decimal point while other C libraries use ','
 // GLIBC 2.27 corrects this
 #if defined(_CS_GNU_LIBC_VERSION)
     const char sep = glibc_version_less_than("2.27") ? '.' : ',';
+#   ifndef TEST_HAS_NO_WIDE_CHARACTERS
     const wchar_t wsep = glibc_version_less_than("2.27") ? L'.' : L',';
+#   endif
 #else
     const char sep = ',';
+#   ifndef TEST_HAS_NO_WIDE_CHARACTERS
     const wchar_t wsep = L',';
+#   endif
 #endif
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -125,6 +138,7 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.decimal_point() == sep);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.decimal_point() == wsep);
@@ -133,6 +147,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.decimal_point() == wsep);
     }
+#endif
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -142,6 +157,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.decimal_point() == '.');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.decimal_point() == L'.');
@@ -150,6 +166,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.decimal_point() == L'.');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/frac_digits.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/frac_digits.pass.cpp
index d022afe..b490ed4 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/frac_digits.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/frac_digits.pass.cpp
@@ -40,6 +40,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -55,6 +56,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -66,6 +68,7 @@
         Fnt f("C", 1);
         assert(f.frac_digits() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.frac_digits() == 0);
@@ -74,6 +77,7 @@
         Fwt f("C", 1);
         assert(f.frac_digits() == 0);
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -83,6 +87,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.frac_digits() == 2);
@@ -91,6 +96,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#endif
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -100,6 +106,7 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.frac_digits() == 2);
@@ -108,6 +115,7 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#endif
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -117,6 +125,7 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.frac_digits() == 2);
@@ -125,6 +134,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#endif
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -134,6 +144,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.frac_digits() == 2);
@@ -142,6 +153,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.frac_digits() == 2);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp
index 53e54c2..3dae97f 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/grouping.pass.cpp
@@ -47,6 +47,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -62,6 +63,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -76,6 +78,7 @@
         Fnt f("C", 1);
         assert(f.grouping() == s || f.grouping() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.grouping() == s || f.grouping() == "");
@@ -84,6 +87,7 @@
         Fwt f("C", 1);
         assert(f.grouping() == s || f.grouping() == "");
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -93,6 +97,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.grouping() == "\3\3");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.grouping() == "\3\3");
@@ -101,6 +106,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.grouping() == "\3\3");
     }
+#endif
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -110,6 +116,7 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.grouping() == "\3");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.grouping() == "\3");
@@ -118,6 +125,7 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.grouping() == "\3");
     }
+#endif
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -127,6 +135,7 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.grouping() == "\3\3");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.grouping() == "\3\3");
@@ -135,6 +144,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.grouping() == "\3\3");
     }
+#endif
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -144,6 +154,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.grouping() == "\3");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.grouping() == "\3");
@@ -152,6 +163,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.grouping() == "\3");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
index 5cb4216..8b85dc0 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/neg_format.pass.cpp
@@ -47,6 +47,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -62,6 +63,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -81,6 +83,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         std::money_base::pattern p = f.neg_format();
@@ -97,6 +100,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -114,6 +118,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
@@ -130,6 +135,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -147,6 +153,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
@@ -163,6 +170,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -180,6 +188,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
@@ -196,6 +205,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -213,6 +223,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.neg_format();
@@ -229,6 +240,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/negative_sign.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/negative_sign.pass.cpp
index 19ae001..11904d3 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/negative_sign.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/negative_sign.pass.cpp
@@ -42,6 +42,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -57,6 +58,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -68,6 +70,7 @@
         Fnt f("C", 1);
         assert(f.negative_sign() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.negative_sign() == std::wstring());
@@ -76,6 +79,7 @@
         Fwt f("C", 1);
         assert(f.negative_sign() == std::wstring());
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -85,6 +89,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.negative_sign() == "-");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.negative_sign() == L"-");
@@ -93,6 +98,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.negative_sign() == L"-");
     }
+#endif
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -102,6 +108,7 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.negative_sign() == "-");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.negative_sign() == L"-");
@@ -110,6 +117,7 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.negative_sign() == L"-");
     }
+#endif
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -119,6 +127,7 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.negative_sign() == "-");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.negative_sign() == L"-");
@@ -127,6 +136,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.negative_sign() == L"-");
     }
+#endif
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -136,6 +146,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.negative_sign() == "-");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.negative_sign() == L"-");
@@ -144,6 +155,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.negative_sign() == L"-");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp
index 225c246..900d55f 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/pos_format.pass.cpp
@@ -47,6 +47,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -62,6 +63,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -81,6 +83,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         std::money_base::pattern p = f.pos_format();
@@ -97,6 +100,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -114,6 +118,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
@@ -130,6 +135,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -147,6 +153,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
@@ -163,6 +170,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -180,6 +188,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
@@ -196,6 +205,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::symbol);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -213,6 +223,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         std::money_base::pattern p = f.pos_format();
@@ -229,6 +240,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/positive_sign.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/positive_sign.pass.cpp
index 7aac27b..088a09c 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/positive_sign.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/positive_sign.pass.cpp
@@ -40,6 +40,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -55,6 +56,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -66,6 +68,7 @@
         Fnt f("C", 1);
         assert(f.positive_sign() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.positive_sign() == std::wstring());
@@ -74,6 +77,7 @@
         Fwt f("C", 1);
         assert(f.positive_sign() == std::wstring());
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -83,6 +87,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.positive_sign() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.positive_sign() == L"");
@@ -91,6 +96,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.positive_sign() == L"");
     }
+#endif
 
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
@@ -100,6 +106,7 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.positive_sign() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.positive_sign() == L"");
@@ -108,6 +115,7 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.positive_sign() == L"");
     }
+#endif
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
@@ -117,6 +125,7 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.positive_sign() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.positive_sign() == L"");
@@ -125,6 +134,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.positive_sign() == L"");
     }
+#endif
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -134,6 +144,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.positive_sign() == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.positive_sign() == L"");
@@ -142,6 +153,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.positive_sign() == L"");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
index e360124..7e8c0f0 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/thousands_sep.pass.cpp
@@ -45,6 +45,7 @@
         : std::moneypunct_byname<char, true>(nm, refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct_byname<wchar_t, false>
 {
@@ -60,6 +61,7 @@
     explicit Fwt(const std::string& nm, std::size_t refs = 0)
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -71,6 +73,7 @@
         Fnt f("C", 1);
         assert(f.thousands_sep() == std::numeric_limits<char>::max());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f("C", 1);
         assert(f.thousands_sep() == std::numeric_limits<wchar_t>::max());
@@ -79,6 +82,7 @@
         Fwt f("C", 1);
         assert(f.thousands_sep() == std::numeric_limits<wchar_t>::max());
     }
+#endif
 
     {
         Fnf f(LOCALE_en_US_UTF_8, 1);
@@ -88,6 +92,7 @@
         Fnt f(LOCALE_en_US_UTF_8, 1);
         assert(f.thousands_sep() == ',');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_en_US_UTF_8, 1);
         assert(f.thousands_sep() == L',');
@@ -96,6 +101,7 @@
         Fwt f(LOCALE_en_US_UTF_8, 1);
         assert(f.thousands_sep() == L',');
     }
+#endif
     {
         Fnf f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.thousands_sep() == ' ');
@@ -104,7 +110,8 @@
         Fnt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.thousands_sep() == ' ');
     }
-// The below tests work around GLIBC's use of U202F as mon_thousands_sep.
+    // The below tests work around GLIBC's use of U202F as mon_thousands_sep.
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 #if defined(_CS_GNU_LIBC_VERSION)
     const wchar_t fr_sep = glibc_version_less_than("2.27") ? L' ' : L'\u202F';
 #else
@@ -118,19 +125,8 @@
         Fwt f(LOCALE_fr_FR_UTF_8, 1);
         assert(f.thousands_sep() == fr_sep);
     }
-// The below tests work around GLIBC's use of U00A0 as mon_thousands_sep
-// and U002E as mon_decimal_point.
-// TODO: Fix thousands_sep for 'char'.
-// related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16006
-#if defined(_CS_GNU_LIBC_VERSION)
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     const char sep = ' ';
-    // FIXME libc++ specifically works around \u00A0 by translating it into
-    // a regular space.
-    const wchar_t wsep = glibc_version_less_than("2.27") ? L'\u00A0' : L'\u202F';
-#else
-    const char sep = ' ';
-    const wchar_t wsep = L' ';
-#endif
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.thousands_sep() == sep);
@@ -139,6 +135,18 @@
         Fnt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.thousands_sep() == sep);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    // The below tests work around GLIBC's use of U00A0 as mon_thousands_sep
+    // and U002E as mon_decimal_point.
+    // TODO: Fix thousands_sep for 'char'.
+    // related to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=16006
+#   if defined(_CS_GNU_LIBC_VERSION)
+    // FIXME libc++ specifically works around \u00A0 by translating it into
+    // a regular space.
+    const wchar_t wsep = glibc_version_less_than("2.27") ? L'\u00A0' : L'\u202F';
+#   else
+    const wchar_t wsep = L' ';
+#   endif
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.thousands_sep() == wsep);
@@ -147,6 +155,7 @@
         Fwt f(LOCALE_ru_RU_UTF_8, 1);
         assert(f.thousands_sep() == wsep);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
     {
         Fnf f(LOCALE_zh_CN_UTF_8, 1);
@@ -156,6 +165,7 @@
         Fnt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.thousands_sep() == ',');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.thousands_sep() == L',');
@@ -164,6 +174,7 @@
         Fwt f(LOCALE_zh_CN_UTF_8, 1);
         assert(f.thousands_sep() == L',');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/curr_symbol.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/curr_symbol.pass.cpp
index 9786fc2..51b4a16 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/curr_symbol.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/curr_symbol.pass.cpp
@@ -39,6 +39,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -54,6 +55,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -65,6 +67,7 @@
         Fnt f(1);
         assert(f.curr_symbol() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.curr_symbol() == std::wstring());
@@ -73,6 +76,7 @@
         Fwt f(1);
         assert(f.curr_symbol() == std::wstring());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/decimal_point.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/decimal_point.pass.cpp
index 6af4826..5109c66 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/decimal_point.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/decimal_point.pass.cpp
@@ -39,6 +39,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -54,6 +55,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -65,6 +67,7 @@
         Fnt f(1);
         assert(f.decimal_point() == std::numeric_limits<char>::max());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.decimal_point() == std::numeric_limits<wchar_t>::max());
@@ -73,6 +76,7 @@
         Fwt f(1);
         assert(f.decimal_point() == std::numeric_limits<wchar_t>::max());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/frac_digits.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/frac_digits.pass.cpp
index 5b1404a..07c1f41 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/frac_digits.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/frac_digits.pass.cpp
@@ -39,6 +39,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -54,6 +55,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -65,6 +67,7 @@
         Fnt f(1);
         assert(f.frac_digits() == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.frac_digits() == 0);
@@ -73,6 +76,7 @@
         Fwt f(1);
         assert(f.frac_digits() == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/grouping.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/grouping.pass.cpp
index c4423e5..19b1dc8 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/grouping.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/grouping.pass.cpp
@@ -39,6 +39,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -54,6 +55,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -65,6 +67,7 @@
         Fnt f(1);
         assert(f.grouping() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.grouping() == std::string());
@@ -73,6 +76,7 @@
         Fwt f(1);
         assert(f.grouping() == std::string());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/neg_format.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/neg_format.pass.cpp
index 69f1245..4b3ac56 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/neg_format.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/neg_format.pass.cpp
@@ -36,6 +36,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -51,6 +52,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -70,6 +72,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         std::money_base::pattern p = f.neg_format();
@@ -86,6 +89,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/negative_sign.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/negative_sign.pass.cpp
index 6dab0b3..f102bd5 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/negative_sign.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/negative_sign.pass.cpp
@@ -40,6 +40,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -55,6 +56,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -66,6 +68,7 @@
         Fnt f(1);
         assert(f.negative_sign() == "-");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.negative_sign() == L"-");
@@ -74,6 +77,7 @@
         Fwt f(1);
         assert(f.negative_sign() == L"-");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/pos_format.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/pos_format.pass.cpp
index 4df85b4..b64dac6 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/pos_format.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/pos_format.pass.cpp
@@ -36,6 +36,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -51,6 +52,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -70,6 +72,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         std::money_base::pattern p = f.pos_format();
@@ -86,6 +89,7 @@
         assert(p.field[2] == std::money_base::none);
         assert(p.field[3] == std::money_base::value);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/positive_sign.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/positive_sign.pass.cpp
index d6db0e9..df413f0 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/positive_sign.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/positive_sign.pass.cpp
@@ -39,6 +39,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -54,6 +55,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -65,6 +67,7 @@
         Fnt f(1);
         assert(f.positive_sign() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.positive_sign() == std::wstring());
@@ -73,6 +76,7 @@
         Fwt f(1);
         assert(f.positive_sign() == std::wstring());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/thousands_sep.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/thousands_sep.pass.cpp
index 2cb8b9c..57600b5 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/thousands_sep.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/locale.moneypunct.members/thousands_sep.pass.cpp
@@ -39,6 +39,7 @@
         : std::moneypunct<char, true>(refs) {}
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 class Fwf
     : public std::moneypunct<wchar_t, false>
 {
@@ -54,6 +55,7 @@
     explicit Fwt(std::size_t refs = 0)
         : std::moneypunct<wchar_t, true>(refs) {}
 };
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -65,6 +67,7 @@
         Fnt f(1);
         assert(f.thousands_sep() == std::numeric_limits<char>::max());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         Fwf f(1);
         assert(f.thousands_sep() == std::numeric_limits<wchar_t>::max());
@@ -73,6 +76,7 @@
         Fwt f(1);
         assert(f.thousands_sep() == std::numeric_limits<wchar_t>::max());
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/types.pass.cpp b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/types.pass.cpp
index 9efd7fc..7768cb7 100644
--- a/test/std/localization/locale.categories/category.monetary/locale.moneypunct/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.monetary/locale.moneypunct/types.pass.cpp
@@ -29,18 +29,20 @@
 int main(int, char**)
 {
     static_assert((std::is_base_of<std::locale::facet, std::moneypunct<char> >::value), "");
-    static_assert((std::is_base_of<std::locale::facet, std::moneypunct<wchar_t> >::value), "");
     static_assert((std::is_base_of<std::money_base, std::moneypunct<char> >::value), "");
-    static_assert((std::is_base_of<std::money_base, std::moneypunct<wchar_t> >::value), "");
     static_assert((std::is_same<std::moneypunct<char>::char_type, char>::value), "");
-    static_assert((std::is_same<std::moneypunct<wchar_t>::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::moneypunct<char>::string_type, std::string>::value), "");
-    static_assert((std::is_same<std::moneypunct<wchar_t>::string_type, std::wstring>::value), "");
-
     test(std::moneypunct<char, false>::intl);
     test(std::moneypunct<char, true>::intl);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    static_assert((std::is_base_of<std::locale::facet, std::moneypunct<wchar_t> >::value), "");
+    static_assert((std::is_base_of<std::money_base, std::moneypunct<wchar_t> >::value), "");
+    static_assert((std::is_same<std::moneypunct<wchar_t>::char_type, wchar_t>::value), "");
+    static_assert((std::is_same<std::moneypunct<wchar_t>::string_type, std::wstring>::value), "");
     test(std::moneypunct<wchar_t, false>::intl);
     test(std::moneypunct<wchar_t, true>::intl);
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.numeric/locale.nm.put/types.pass.cpp b/test/std/localization/locale.categories/category.numeric/locale.nm.put/types.pass.cpp
index a2617dd..aef9494 100644
--- a/test/std/localization/locale.categories/category.numeric/locale.nm.put/types.pass.cpp
+++ b/test/std/localization/locale.categories/category.numeric/locale.nm.put/types.pass.cpp
@@ -25,11 +25,14 @@
 int main(int, char**)
 {
     static_assert((std::is_base_of<std::locale::facet, std::num_put<char> >::value), "");
-    static_assert((std::is_base_of<std::locale::facet, std::num_put<wchar_t> >::value), "");
     static_assert((std::is_same<std::num_put<char>::char_type, char>::value), "");
-    static_assert((std::is_same<std::num_put<wchar_t>::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::num_put<char>::iter_type, std::ostreambuf_iterator<char> >::value), "");
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    static_assert((std::is_base_of<std::locale::facet, std::num_put<wchar_t> >::value), "");
+    static_assert((std::is_same<std::num_put<wchar_t>::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::num_put<wchar_t>::iter_type, std::ostreambuf_iterator<wchar_t> >::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/date_order_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/date_order_wide.pass.cpp
index 22248ea..1560125 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/date_order_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/date_order_wide.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
index 0cb95a6..69dd389 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_date_wide.pass.cpp
@@ -9,6 +9,8 @@
 // NetBSD does not support LC_TIME at the moment
 // XFAIL: netbsd
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp
index 4771468..bd8b7b9 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_monthname_wide.pass.cpp
@@ -9,6 +9,7 @@
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.zh_CN.UTF-8
+// XFAIL: libcpp-has-no-wide-characters
 
 // <locale>
 
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
index d3315d6..c762f97 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_one_wide.pass.cpp
@@ -11,6 +11,8 @@
 
 // XFAIL: LIBCXX-WINDOWS-FIXME
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_time_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_time_wide.pass.cpp
index 849b358..dc83f30 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_time_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_time_wide.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
index 9ff73e9..d96e4c2 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_weekday_wide.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_year_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_year_wide.pass.cpp
index 85c4a3f..465e0ad 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_year_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get.byname/get_year_wide.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // REQUIRES: locale.en_US.UTF-8
 // REQUIRES: locale.fr_FR.UTF-8
 // REQUIRES: locale.ru_RU.UTF-8
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_date_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_date_wide.pass.cpp
index ea0432b..9109740 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_date_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_date_wide.pass.cpp
@@ -14,6 +14,8 @@
 // get_date(iter_type s, iter_type end, ios_base& str,
 //          ios_base::iostate& err, tm* t) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 #include <ios>
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_monthname_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_monthname_wide.pass.cpp
index 08c851b..261bb68 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_monthname_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_monthname_wide.pass.cpp
@@ -14,6 +14,8 @@
 // get_monthname(iter_type s, iter_type end, ios_base& str,
 //               ios_base::iostate& err, tm* t) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 #include "test_macros.h"
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_time_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_time_wide.pass.cpp
index 9107ef8..5ff5404 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_time_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_time_wide.pass.cpp
@@ -14,6 +14,8 @@
 // get_time(iter_type s, iter_type end, ios_base& str,
 //          ios_base::iostate& err, tm* t) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 #include "test_macros.h"
diff --git a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_weekday_wide.pass.cpp b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_weekday_wide.pass.cpp
index 0092984..0a1399e 100644
--- a/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_weekday_wide.pass.cpp
+++ b/test/std/localization/locale.categories/category.time/locale.time.get/locale.time.get.members/get_weekday_wide.pass.cpp
@@ -14,6 +14,8 @@
 // get_weekday(iter_type s, iter_type end, ios_base& str,
 //             ios_base::iostate& err, tm* t) const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <cassert>
 #include "test_macros.h"
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/decimal_point.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/decimal_point.pass.cpp
index b93d1c4..9d074a7 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/decimal_point.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/decimal_point.pass.cpp
@@ -30,11 +30,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.decimal_point() == '.');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.decimal_point() == L'.');
         }
+#endif
     }
     {
         std::locale l(LOCALE_en_US_UTF_8);
@@ -43,11 +45,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.decimal_point() == '.');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.decimal_point() == L'.');
         }
+#endif
     }
     {
         std::locale l(LOCALE_fr_FR_UTF_8);
@@ -56,11 +60,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.decimal_point() == ',');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.decimal_point() == L',');
         }
+#endif
     }
 
   return 0;
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
index 3bd1c85..b9c4145 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/grouping.pass.cpp
@@ -35,11 +35,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.grouping() == "");
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.grouping() == "");
         }
+#endif
     }
     {
         std::locale l(LOCALE_en_US_UTF_8);
@@ -48,11 +50,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.grouping() == "\3\3");
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.grouping() == "\3\3");
         }
+#endif
     }
     {
         std::locale l(LOCALE_fr_FR_UTF_8);
@@ -66,11 +70,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.grouping() ==  group);
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.grouping() == group);
         }
+#endif
     }
 
   return 0;
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
index 627bc6a..009fbc7 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct.byname/thousands_sep.pass.cpp
@@ -36,11 +36,13 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.thousands_sep() == ',');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.thousands_sep() == L',');
         }
+#endif
     }
     {
         std::locale l(LOCALE_en_US_UTF_8);
@@ -49,32 +51,39 @@
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.thousands_sep() == ',');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.thousands_sep() == L',');
         }
+#endif
     }
     {
+        // The below tests work around GLIBC's use of U202F as LC_NUMERIC thousands_sep.
         std::locale l(LOCALE_fr_FR_UTF_8);
-// The below tests work around GLIBC's use of U202F as LC_NUMERIC thousands_sep.
-#if defined(_CS_GNU_LIBC_VERSION)
-        const char sep = ' ';
-        const wchar_t wsep = glibc_version_less_than("2.27") ? L' ' : L'\u202f';
-#else
-        const char sep = ',';
-        const wchar_t wsep = L',';
-#endif
         {
+#if defined(_CS_GNU_LIBC_VERSION)
+            const char sep = ' ';
+#else
+            const char sep = ',';
+#endif
             typedef char C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.thousands_sep() == sep);
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
+#if defined(_CS_GNU_LIBC_VERSION)
+            const wchar_t wsep = glibc_version_less_than("2.27") ? L' ' : L'\u202f';
+#else
+            const wchar_t wsep = L',';
+#endif
             typedef wchar_t C;
             const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
             assert(np.thousands_sep() == wsep);
         }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     }
 
     return 0;
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/ctor.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/ctor.pass.cpp
index a48ba0e..28e0d4e 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/ctor.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/ctor.pass.cpp
@@ -49,6 +49,8 @@
         assert(my_facet<char>::count == 1);
     }
     assert(my_facet<char>::count == 0);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::locale l(std::locale::classic(), new my_facet<wchar_t>);
         assert(my_facet<wchar_t>::count == 1);
@@ -64,6 +66,7 @@
         assert(my_facet<wchar_t>::count == 1);
     }
     assert(my_facet<wchar_t>::count == 0);
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/decimal_point.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/decimal_point.pass.cpp
index 0c25943..78212c3 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/decimal_point.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/decimal_point.pass.cpp
@@ -25,11 +25,13 @@
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.decimal_point() == '.');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t C;
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.decimal_point() == L'.');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/falsename.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/falsename.pass.cpp
index c238604..e3ee165 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/falsename.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/falsename.pass.cpp
@@ -25,11 +25,13 @@
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.falsename() == std::string("false"));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t C;
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.falsename() == std::wstring(L"false"));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/grouping.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/grouping.pass.cpp
index ee84fcb..6c7f766 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/grouping.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/grouping.pass.cpp
@@ -25,11 +25,13 @@
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.grouping() == std::string());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t C;
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.grouping() == std::string());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/thousands_sep.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/thousands_sep.pass.cpp
index 92a32ed..fb5331a 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/thousands_sep.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/thousands_sep.pass.cpp
@@ -25,11 +25,13 @@
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.thousands_sep() == ',');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t C;
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.thousands_sep() == L',');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/truename.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/truename.pass.cpp
index e89c95c..0f08a67 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/truename.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/facet.numpunct.members/truename.pass.cpp
@@ -25,11 +25,13 @@
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.truename() == std::string("true"));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t C;
         const std::numpunct<C>& np = std::use_facet<std::numpunct<C> >(l);
         assert(np.truename() == std::wstring(L"true"));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/types.pass.cpp b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/types.pass.cpp
index eb59310..3837172 100644
--- a/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/types.pass.cpp
+++ b/test/std/localization/locale.categories/facet.numpunct/locale.numpunct/types.pass.cpp
@@ -37,6 +37,7 @@
         static_assert((std::is_same<std::numpunct<char>::string_type, std::string>::value), "");
         static_assert((std::is_base_of<std::locale::facet, std::numpunct<char> >::value), "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         assert(std::has_facet<std::numpunct<wchar_t> >(l));
         const std::numpunct<wchar_t>& f = std::use_facet<std::numpunct<wchar_t> >(l);
@@ -48,6 +49,7 @@
         static_assert((std::is_same<std::numpunct<wchar_t>::string_type, std::wstring>::value), "");
         static_assert((std::is_base_of<std::locale::facet, std::numpunct<wchar_t> >::value), "");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16.pass.cpp
index 40f8ae2..47b9ea4 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf16.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16.pass.cpp
@@ -16,6 +16,8 @@
 //     // unspecified
 // };
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // Not a portable test
 
 #include <codecvt>
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16_always_noconv.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16_always_noconv.pass.cpp
index 7788fad..e9a1e7a 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf16_always_noconv.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16_always_noconv.pass.cpp
@@ -25,12 +25,14 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf16<wchar_t> C;
         C c;
         bool r = c.always_noconv();
         assert(r == false);
     }
+#endif
     {
         typedef std::codecvt_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16_encoding.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16_encoding.pass.cpp
index c968cf6..2407644 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf16_encoding.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16_encoding.pass.cpp
@@ -25,12 +25,14 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf16<wchar_t> C;
         C c;
         int r = c.encoding();
         assert(r == 0);
     }
+#endif
     {
         typedef std::codecvt_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16_max_length.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16_max_length.pass.cpp
index c392fda..6f31d74 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf16_max_length.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16_max_length.pass.cpp
@@ -69,7 +69,9 @@
 }
 
 int main(int, char**) {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   TestHelper<wchar_t>::test();
+#endif
   TestHelper<char16_t>::test();
   TestHelper<char32_t>::test();
   return 0;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16_out.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16_out.pass.cpp
index f99f8f4..da94fb6 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf16_out.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16_out.pass.cpp
@@ -350,7 +350,9 @@
 
 int main(int, char**) {
   TestHelper<char32_t>::test();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   TestHelper<wchar_t>::test();
+#endif
 
   return 0;
 }
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf16_unshift.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf16_unshift.pass.cpp
index 261363f..0a7adaf 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf16_unshift.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf16_unshift.pass.cpp
@@ -27,6 +27,7 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf16<wchar_t> C;
         C c;
@@ -36,6 +37,7 @@
         std::codecvt_base::result r = c.unshift(m, n, n+4, np);
         assert(r == std::codecvt_base::noconv);
     }
+#endif
     {
         typedef std::codecvt_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8.pass.cpp
index 08f98fa..e281f1a 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8.pass.cpp
@@ -16,6 +16,8 @@
 //     // unspecified
 // };
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // Not a portable test
 
 #include <codecvt>
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_always_noconv.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_always_noconv.pass.cpp
index 2235e7b..23f29df 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_always_noconv.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_always_noconv.pass.cpp
@@ -25,12 +25,14 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8<wchar_t> C;
         C c;
         bool r = c.always_noconv();
         assert(r == false);
     }
+#endif
     {
         typedef std::codecvt_utf8<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_encoding.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_encoding.pass.cpp
index 70862e4..eddf665 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_encoding.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_encoding.pass.cpp
@@ -25,12 +25,14 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8<wchar_t> C;
         C c;
         int r = c.encoding();
         assert(r == 0);
     }
+#endif
     {
         typedef std::codecvt_utf8<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_length.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_length.pass.cpp
index 5e2cf83..bd4aa1d 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_length.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_length.pass.cpp
@@ -190,7 +190,9 @@
 }
 
 int main(int, char**) {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   TestHelper<wchar_t>::test();
+#endif
   TestHelper<char32_t>::test();
   TestHelper<char16_t>::test();
   return 0;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_max_length.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_max_length.pass.cpp
index 8da24a2..8afb5bc 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_max_length.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_max_length.pass.cpp
@@ -69,7 +69,9 @@
 }
 
 int main(int, char**) {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   TestHelper<wchar_t>::test();
+#endif
   TestHelper<char16_t>::test();
   TestHelper<char32_t>::test();
   return 0;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_out.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_out.pass.cpp
index 96089fb..99dc219 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_out.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_out.pass.cpp
@@ -321,7 +321,9 @@
 }
 
 int main(int, char**) {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   TestHelper<wchar_t>::test();
+#endif
   TestHelper<char32_t>::test();
   TestHelper<char16_t>::test();
 
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_unshift.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_unshift.pass.cpp
index 6aa021a..239dbfc 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_unshift.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_unshift.pass.cpp
@@ -27,6 +27,7 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8<wchar_t> C;
         C c;
@@ -36,6 +37,7 @@
         std::codecvt_base::result r = c.unshift(m, n, n+4, np);
         assert(r == std::codecvt_base::noconv);
     }
+#endif
     {
         typedef std::codecvt_utf8<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_always_noconv.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_always_noconv.pass.cpp
index 6b65978..7aa5591 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_always_noconv.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_always_noconv.pass.cpp
@@ -25,12 +25,14 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<wchar_t> C;
         C c;
         bool r = c.always_noconv();
         assert(r == false);
     }
+#endif
     {
         typedef std::codecvt_utf8_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_encoding.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_encoding.pass.cpp
index 3b4fa34..3e8aa3a 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_encoding.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_encoding.pass.cpp
@@ -25,12 +25,14 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<wchar_t> C;
         C c;
         int r = c.encoding();
         assert(r == 0);
     }
+#endif
     {
         typedef std::codecvt_utf8_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_in.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_in.pass.cpp
index 2ec13bb..8b23533 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_in.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_in.pass.cpp
@@ -237,7 +237,7 @@
 }
 
 int main(int, char**) {
-#ifndef _WIN32
+#if !defined(_WIN32) && !defined(TEST_HAS_NO_WIDE_CHARACTERS)
   TestHelper<wchar_t>::test();
 #endif
   TestHelper<char32_t>::test();
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_length.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_length.pass.cpp
index 2dc4ce5..3847fad 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_length.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_length.pass.cpp
@@ -26,6 +26,7 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<wchar_t> C;
         C c;
@@ -95,6 +96,7 @@
         r = c.length(m, n, n+1, 2);
         assert(r == 1);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<char32_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_max_length.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_max_length.pass.cpp
index 6459b2e..f7f7ce3 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_max_length.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_max_length.pass.cpp
@@ -25,6 +25,7 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<wchar_t> C;
         C c;
@@ -37,6 +38,7 @@
         int r = c.max_length();
         assert(r == 7);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_out.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_out.pass.cpp
index 4b3f02d..895db46 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_out.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_out.pass.cpp
@@ -302,7 +302,7 @@
 }
 
 int main(int, char**) {
-#ifndef _WIN32
+#if !defined(_WIN32) && !defined(TEST_HAS_NO_WIDE_CHARACTERS)
   TestHelper<wchar_t>::test();
 #endif
   TestHelper<char32_t>::test();
diff --git a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_unshift.pass.cpp b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_unshift.pass.cpp
index ccecf79..c362397 100644
--- a/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_unshift.pass.cpp
+++ b/test/std/localization/locale.stdcvt/codecvt_utf8_utf16_unshift.pass.cpp
@@ -27,6 +27,7 @@
 
 int main(int, char**)
 {
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::codecvt_utf8_utf16<wchar_t> C;
         C c;
@@ -36,6 +37,7 @@
         std::codecvt_base::result r = c.unshift(m, n, n+4, np);
         assert(r == std::codecvt_base::noconv);
     }
+#endif
     {
         typedef std::codecvt_utf8_utf16<char16_t> C;
         C c;
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp
index d70804e..bc179f4 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/ctor.pass.cpp
@@ -18,6 +18,8 @@
 // explicit wbuffer_convert(streambuf* bytebuf, Codecvt* pcvt = new Codecvt,
 //                          state_type state = state_type()); // C++20
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <sstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp
index b29fce5..27ced20 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/overflow.pass.cpp
@@ -14,6 +14,8 @@
 
 // This test is not entirely portable
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <fstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
index 264a67e..b07b5ee 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/pbackfail.pass.cpp
@@ -16,6 +16,8 @@
 
 // This test is not entirely portable
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <fstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp
index 1d6e343..72c7c8c 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/rdbuf.pass.cpp
@@ -12,6 +12,8 @@
 
 // streambuf *rdbuf(streambuf *bytebuf);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <sstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp
index 33fc9f2..8a3ca75 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/seekoff.pass.cpp
@@ -17,6 +17,8 @@
 
 // This test is not entirely portable
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <fstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp
index 84a0fdc..8736da7 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/state.pass.cpp
@@ -12,6 +12,8 @@
 
 // state_type state() const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <sstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp
index 2d5564a..0f4a49b 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/test.pass.cpp
@@ -10,6 +10,8 @@
 
 // wbuffer_convert<Codecvt, Elem, Tr>
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <fstream>
 #include <locale>
 #include <codecvt>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
index 6642488..a198a95 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.buffer/underflow.pass.cpp
@@ -16,6 +16,8 @@
 
 // This test is not entirely portable
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <fstream>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp
index 955bbb0..5ce5561 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/converted.pass.cpp
@@ -12,6 +12,8 @@
 
 // size_t converted() const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp
index bc39fd7..d4b1912 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt.pass.cpp
@@ -15,6 +15,8 @@
 // wstring_convert() : wstring_convert(new Codecvt) {}    // C++20
 // explicit wstring_convert(Codecvt* pcvt);               // C++20
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp
index 292777a..c5a3dd8 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_codecvt_state.pass.cpp
@@ -12,6 +12,8 @@
 
 // wstring_convert(Codecvt* pcvt, state_type state);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp
index fb7ce01..df386df 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_copy.pass.cpp
@@ -17,6 +17,8 @@
 // wstring_convert(wstring_convert const&) = delete;
 // wstring_convert& operator=(wstring_convert const&) = delete;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp
index e284c13..5ad3dbe 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/ctor_err_string.pass.cpp
@@ -13,6 +13,8 @@
 // wstring_convert(const byte_string& byte_err,
 //                 const wide_string& wide_err = wide_string());
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp
index deb4b96..bd0191d 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/from_bytes.pass.cpp
@@ -15,6 +15,8 @@
 // wide_string from_bytes(const byte_string& str);
 // wide_string from_bytes(const char* first, const char* last);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp
index f6dcd06..1602b1a 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/state.pass.cpp
@@ -12,6 +12,8 @@
 
 // state_type state() const;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp
index 849b990..5ccaca0 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/to_bytes.pass.cpp
@@ -15,6 +15,8 @@
 // byte_string to_bytes(const wide_string& wstr);
 // byte_string to_bytes(const Elem* first, const Elem* last);
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 #include <cassert>
diff --git a/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp b/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp
index a73739e..88c4bcc 100644
--- a/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp
+++ b/test/std/localization/locales/locale.convenience/conversions/conversions.string/types.pass.cpp
@@ -19,6 +19,8 @@
 //     typedef typename Codecvt::state_type                      state_type;
 //     typedef typename wide_string::traits_type::int_type       int_type;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <locale>
 #include <codecvt>
 
diff --git a/test/std/localization/locales/locale/locale.cons/assign.pass.cpp b/test/std/localization/locales/locale/locale.cons/assign.pass.cpp
index 94e2d26..e897cc5 100644
--- a/test/std/localization/locales/locale/locale.cons/assign.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/assign.pass.cpp
@@ -30,43 +30,42 @@
 #include "platform_support.h" // locale name macros
 
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp b/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp
index 42b99d3..cda9fe3 100644
--- a/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/char_pointer.pass.cpp
@@ -33,44 +33,42 @@
 
 #include "test_macros.h"
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
 
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/copy.pass.cpp b/test/std/localization/locales/locale/locale.cons/copy.pass.cpp
index 012086a..58cc544 100644
--- a/test/std/localization/locales/locale/locale.cons/copy.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/copy.pass.cpp
@@ -28,43 +28,42 @@
 #include "test_macros.h"
 #include "platform_support.h" // locale name macros
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/default.pass.cpp b/test/std/localization/locales/locale/locale.cons/default.pass.cpp
index c7a6759..1f5b0b5 100644
--- a/test/std/localization/locales/locale/locale.cons/default.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/default.pass.cpp
@@ -27,43 +27,42 @@
 #include "platform_support.h" // locale name macros
 #include "count_new.h"
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp b/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp
index 694af88..c5760b6 100644
--- a/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/locale_char_pointer_cat.pass.cpp
@@ -30,43 +30,42 @@
 #include "test_macros.h"
 #include "platform_support.h" // locale name macros
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp b/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp
index 1ae3f59..7243e11 100644
--- a/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/locale_facetptr.pass.cpp
@@ -29,43 +29,42 @@
 #include "platform_support.h" // locale name macros
 
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 struct my_facet
diff --git a/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp b/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp
index 0988908..1c5bfe2 100644
--- a/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/locale_locale_cat.pass.cpp
@@ -30,43 +30,42 @@
 #include "test_macros.h"
 #include "platform_support.h" // locale name macros
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp b/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp
index 5745f8a..9ab8d0f 100644
--- a/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/locale_string_cat.pass.cpp
@@ -30,44 +30,42 @@
 #include "test_macros.h"
 #include "platform_support.h" // locale name macros
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
 
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.cons/string.pass.cpp b/test/std/localization/locales/locale/locale.cons/string.pass.cpp
index 733c7e9..4e51125 100644
--- a/test/std/localization/locales/locale/locale.cons/string.pass.cpp
+++ b/test/std/localization/locales/locale/locale.cons/string.pass.cpp
@@ -29,43 +29,42 @@
 #include "test_macros.h"
 #include "platform_support.h" // locale name macros
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.members/combine.pass.cpp b/test/std/localization/locales/locale/locale.members/combine.pass.cpp
index 5914bb7..27a533a 100644
--- a/test/std/localization/locales/locale/locale.members/combine.pass.cpp
+++ b/test/std/localization/locales/locale/locale.members/combine.pass.cpp
@@ -26,43 +26,42 @@
 
 #include "test_macros.h"
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 struct my_facet
diff --git a/test/std/localization/locales/locale/locale.operators/compare.pass.cpp b/test/std/localization/locales/locale/locale.operators/compare.pass.cpp
index f912dc6..a93aa18 100644
--- a/test/std/localization/locales/locale/locale.operators/compare.pass.cpp
+++ b/test/std/localization/locales/locale/locale.operators/compare.pass.cpp
@@ -29,11 +29,13 @@
             std::string s3("BaaaaaA");
             assert(l(s3, s2));
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             std::wstring s2(L"aaaaaaA");
             std::wstring s3(L"BaaaaaA");
             assert(l(s3, s2));
         }
+#endif
     }
 
   return 0;
diff --git a/test/std/localization/locales/locale/locale.statics/classic.pass.cpp b/test/std/localization/locales/locale/locale.statics/classic.pass.cpp
index f32c243..d7bffbd 100644
--- a/test/std/localization/locales/locale/locale.statics/classic.pass.cpp
+++ b/test/std/localization/locales/locale/locale.statics/classic.pass.cpp
@@ -23,43 +23,42 @@
 
 #include "test_macros.h"
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/localization/locales/locale/locale.statics/global.pass.cpp b/test/std/localization/locales/locale/locale.statics/global.pass.cpp
index 458fe08..314d4ab 100644
--- a/test/std/localization/locales/locale/locale.statics/global.pass.cpp
+++ b/test/std/localization/locales/locale/locale.statics/global.pass.cpp
@@ -26,43 +26,42 @@
 #include "test_macros.h"
 #include "platform_support.h" // locale name macros
 
+template<class CharT>
+void check_for(const std::locale& loc)
+{
+    assert(std::has_facet<std::collate<CharT> >(loc));
+
+    assert(std::has_facet<std::ctype<CharT> >(loc));
+
+    assert((std::has_facet<std::codecvt<CharT, char, std::mbstate_t> >(loc)));
+
+    assert(std::has_facet<std::moneypunct<CharT> >(loc));
+    assert(std::has_facet<std::money_get<CharT> >(loc));
+    assert(std::has_facet<std::money_put<CharT> >(loc));
+
+    assert(std::has_facet<std::numpunct<CharT> >(loc));
+    assert(std::has_facet<std::num_get<CharT> >(loc));
+    assert(std::has_facet<std::num_put<CharT> >(loc));
+
+    assert(std::has_facet<std::time_get<CharT> >(loc));
+    assert(std::has_facet<std::time_put<CharT> >(loc));
+
+    assert(std::has_facet<std::messages<CharT> >(loc));
+}
+
 void check(const std::locale& loc)
 {
-    assert(std::has_facet<std::collate<char> >(loc));
-    assert(std::has_facet<std::collate<wchar_t> >(loc));
+    check_for<char>(loc);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    check_for<wchar_t>(loc);
+#endif
 
-    assert(std::has_facet<std::ctype<char> >(loc));
-    assert(std::has_facet<std::ctype<wchar_t> >(loc));
-    assert((std::has_facet<std::codecvt<char, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char16_t, char, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char, std::mbstate_t> >(loc)));
 #if TEST_STD_VER > 17
     assert((std::has_facet<std::codecvt<char16_t, char8_t, std::mbstate_t> >(loc)));
     assert((std::has_facet<std::codecvt<char32_t, char8_t, std::mbstate_t> >(loc)));
 #endif
-    assert((std::has_facet<std::codecvt<wchar_t, char, std::mbstate_t> >(loc)));
-
-    assert((std::has_facet<std::moneypunct<char> >(loc)));
-    assert((std::has_facet<std::moneypunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_get<char> >(loc)));
-    assert((std::has_facet<std::money_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::money_put<char> >(loc)));
-    assert((std::has_facet<std::money_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::numpunct<char> >(loc)));
-    assert((std::has_facet<std::numpunct<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_get<char> >(loc)));
-    assert((std::has_facet<std::num_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::num_put<char> >(loc)));
-    assert((std::has_facet<std::num_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::time_get<char> >(loc)));
-    assert((std::has_facet<std::time_get<wchar_t> >(loc)));
-    assert((std::has_facet<std::time_put<char> >(loc)));
-    assert((std::has_facet<std::time_put<wchar_t> >(loc)));
-
-    assert((std::has_facet<std::messages<char> >(loc)));
-    assert((std::has_facet<std::messages<wchar_t> >(loc)));
 }
 
 int main(int, char**)
diff --git a/test/std/namespace/addressable_functions.sh.cpp b/test/std/namespace/addressable_functions.sh.cpp
index de44ba4..d149a6b 100644
--- a/test/std/namespace/addressable_functions.sh.cpp
+++ b/test/std/namespace/addressable_functions.sh.cpp
@@ -28,25 +28,32 @@
 #include <string>
 #include <utility>
 
+#include "test_macros.h"
 
 typedef std::ios_base& (FormatFlagFunction)(std::ios_base&);
 typedef std::basic_ostream<char>& (OstreamManipFunction)(std::basic_ostream<char>&);
-typedef std::basic_ostream<wchar_t>& (WOstreamManipFunction)(std::basic_ostream<wchar_t>&);
 typedef std::basic_istream<char>& (IstreamManipFunction)(std::basic_istream<char>&);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+typedef std::basic_ostream<wchar_t>& (WOstreamManipFunction)(std::basic_ostream<wchar_t>&);
 typedef std::basic_istream<wchar_t>& (WIstreamManipFunction)(std::basic_istream<wchar_t>&);
+#endif
 
 extern FormatFlagFunction* get_formatflag_tu1(std::string);
 extern FormatFlagFunction* get_formatflag_tu2(std::string);
 
 extern OstreamManipFunction* get_ostreammanip_tu1(std::string);
 extern OstreamManipFunction* get_ostreammanip_tu2(std::string);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 extern WOstreamManipFunction* get_wostreammanip_tu1(std::string);
 extern WOstreamManipFunction* get_wostreammanip_tu2(std::string);
+#endif
 
 extern IstreamManipFunction* get_istreammanip_tu1(std::string);
 extern IstreamManipFunction* get_istreammanip_tu2(std::string);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 extern WIstreamManipFunction* get_wistreammanip_tu1(std::string);
 extern WIstreamManipFunction* get_wistreammanip_tu2(std::string);
+#endif
 
 #ifdef TU1
 FormatFlagFunction* get_formatflag_tu1(std::string func)
@@ -107,11 +114,12 @@
 }
 
 // [ostream.manip] (wchar_t)
-#ifdef TU1
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   ifdef TU1
 WOstreamManipFunction* get_wostreammanip_tu1(std::string func)
-#else
+#   else
 WOstreamManipFunction* get_wostreammanip_tu2(std::string func)
-#endif
+#   endif
 {
     std::map<std::string, WOstreamManipFunction*> all_funcs;
     typedef std::char_traits<wchar_t> Traits;
@@ -120,6 +128,7 @@
     all_funcs.insert(std::make_pair("flush", &std::flush<wchar_t, Traits>));
     return all_funcs.at(func);
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 // [istream.manip] (char)
 #ifdef TU1
@@ -135,18 +144,19 @@
 }
 
 // [istream.manip] (wchar_t)
-#ifdef TU1
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+#   ifdef TU1
 WIstreamManipFunction* get_wistreammanip_tu1(std::string func)
-#else
+#   else
 WIstreamManipFunction* get_wistreammanip_tu2(std::string func)
-#endif
+#   endif
 {
     std::map<std::string, WIstreamManipFunction*> all_funcs;
     typedef std::char_traits<wchar_t> Traits;
     all_funcs.insert(std::make_pair("ws", &std::ws<wchar_t, Traits>));
     return all_funcs.at(func);
 }
-
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 #ifdef TU2
     int main(int, char**) {
@@ -179,13 +189,17 @@
         assert(get_ostreammanip_tu1("ends") == get_ostreammanip_tu2("ends"));
         assert(get_ostreammanip_tu1("flush") == get_ostreammanip_tu2("flush"));
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         assert(get_wostreammanip_tu1("endl") == get_wostreammanip_tu2("endl"));
         assert(get_wostreammanip_tu1("ends") == get_wostreammanip_tu2("ends"));
         assert(get_wostreammanip_tu1("flush") == get_wostreammanip_tu2("flush"));
+#endif
 
         assert(get_istreammanip_tu1("ws") == get_istreammanip_tu2("ws"));
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         assert(get_wistreammanip_tu1("ws") == get_wistreammanip_tu2("ws"));
+#endif
 
         return 0;
     }
diff --git a/test/std/ranges/range.utility/range.subrange/ctad.compile.pass.cpp b/test/std/ranges/range.utility/range.subrange/ctad.compile.pass.cpp
index 8ab3aa7..a473fbe 100644
--- a/test/std/ranges/range.utility/range.subrange/ctad.compile.pass.cpp
+++ b/test/std/ranges/range.utility/range.subrange/ctad.compile.pass.cpp
@@ -27,7 +27,7 @@
 static_assert(std::same_as<decltype(std::ranges::subrange(ptr, ptr, 0)),
                            std::ranges::subrange<int*, int*, std::ranges::subrange_kind::sized>>);
 static_assert(std::same_as<decltype(std::ranges::subrange(ptr, nullptr, 0)),
-                           std::ranges::subrange<int*, nullptr_t, std::ranges::subrange_kind::sized>>);
+                           std::ranges::subrange<int*, std::nullptr_t, std::ranges::subrange_kind::sized>>);
 
 struct ForwardRange {
   forward_iterator<int*> begin() const;
diff --git a/test/std/re/re.alg/re.alg.match/awk.locale.pass.cpp b/test/std/re/re.alg/re.alg.match/awk.locale.pass.cpp
index 7588f2d..e4ed37d 100644
--- a/test/std/re/re.alg/re.alg.match/awk.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/awk.locale.pass.cpp
@@ -71,6 +71,8 @@
                                                  std::regex_constants::awk)));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -112,5 +114,6 @@
                                                  std::regex_constants::awk)));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.match/awk.pass.cpp b/test/std/re/re.alg/re.alg.match/awk.pass.cpp
index b92374d..f3385f4 100644
--- a/test/std/re/re.alg/re.alg.match/awk.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/awk.pass.cpp
@@ -663,6 +663,8 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         const wchar_t s[] = L"a";
@@ -1303,5 +1305,6 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.match/basic.locale.pass.cpp b/test/std/re/re.alg/re.alg.match/basic.locale.pass.cpp
index 3b9b8e2..f2a8d9a 100644
--- a/test/std/re/re.alg/re.alg.match/basic.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/basic.locale.pass.cpp
@@ -73,6 +73,8 @@
                                                  std::regex_constants::basic)));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -114,5 +116,7 @@
                                                  std::regex_constants::basic)));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.match/basic.pass.cpp b/test/std/re/re.alg/re.alg.match/basic.pass.cpp
index aacf3ec..d77349d 100644
--- a/test/std/re/re.alg/re.alg.match/basic.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/basic.pass.cpp
@@ -650,6 +650,7 @@
         assert(m.str(0) == s);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         assert(!std::regex_match(L"a", m, std::wregex()));
@@ -1276,6 +1277,8 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     { // LWG 2273
         std::regex re("Foo|FooBar");
         std::cmatch m;
diff --git a/test/std/re/re.alg/re.alg.match/ecma.locale.pass.cpp b/test/std/re/re.alg/re.alg.match/ecma.locale.pass.cpp
index 26be206..330f04a 100644
--- a/test/std/re/re.alg/re.alg.match/ecma.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/ecma.locale.pass.cpp
@@ -34,6 +34,47 @@
 {
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
+        std::cmatch m;
+        const char s[] = "m";
+        assert(std::regex_match(s, m, std::regex("[a[=M=]z]")));
+        assert(m.size() == 1);
+        assert(!m.prefix().matched);
+        assert(m.prefix().first == s);
+        assert(m.prefix().second == m[0].first);
+        assert(!m.suffix().matched);
+        assert(m.suffix().first == m[0].second);
+        assert(m.suffix().second == m[0].second);
+        assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
+        assert(m.position(0) == 0);
+        assert(m.str(0) == s);
+    }
+    {
+        std::cmatch m;
+        const char s[] = "Ch";
+        assert(std::regex_match(s, m, std::regex("[a[.ch.]z]",
+                   std::regex_constants::icase)));
+        assert(m.size() == 1);
+        assert(!m.prefix().matched);
+        assert(m.prefix().first == s);
+        assert(m.prefix().second == m[0].first);
+        assert(!m.suffix().matched);
+        assert(m.suffix().first == m[0].second);
+        assert(m.suffix().second == m[0].second);
+        assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
+        assert(m.position(0) == 0);
+        assert(m.str(0) == s);
+    }
+    std::locale::global(std::locale("C"));
+    {
+        std::cmatch m;
+        const char s[] = "m";
+        assert(!std::regex_match(s, m, std::regex("[a[=M=]z]")));
+        assert(m.size() == 0);
+    }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
+    {
         std::wcmatch m;
         const wchar_t s[] = L"m";
         assert(std::regex_match(s, m, std::wregex(L"[a[=M=]z]")));
@@ -71,5 +112,7 @@
         assert(!std::regex_match(s, m, std::wregex(L"[a[=M=]z]")));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.match/ecma.pass.cpp b/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
index 64be590..58502aa 100644
--- a/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/ecma.pass.cpp
@@ -670,6 +670,7 @@
         assert(m.str(0) == s);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         const wchar_t s[] = L"a";
@@ -1304,6 +1305,7 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.match/extended.locale.pass.cpp b/test/std/re/re.alg/re.alg.match/extended.locale.pass.cpp
index 5a0dd18..b314fcd 100644
--- a/test/std/re/re.alg/re.alg.match/extended.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/extended.locale.pass.cpp
@@ -73,6 +73,8 @@
                                                  std::regex_constants::extended)));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -114,5 +116,7 @@
                                                  std::regex_constants::extended)));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.match/extended.pass.cpp b/test/std/re/re.alg/re.alg.match/extended.pass.cpp
index e9d4491..b3be567 100644
--- a/test/std/re/re.alg/re.alg.match/extended.pass.cpp
+++ b/test/std/re/re.alg/re.alg.match/extended.pass.cpp
@@ -665,6 +665,7 @@
         assert(m.str(0) == s);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         const wchar_t s[] = L"a";
@@ -1307,6 +1308,7 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/awk.locale.pass.cpp b/test/std/re/re.alg/re.alg.search/awk.locale.pass.cpp
index 2759278..8108c2b 100644
--- a/test/std/re/re.alg/re.alg.search/awk.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/awk.locale.pass.cpp
@@ -73,6 +73,8 @@
                                                  std::regex_constants::awk)));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -114,5 +116,7 @@
                                                  std::regex_constants::awk)));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/awk.pass.cpp b/test/std/re/re.alg/re.alg.search/awk.pass.cpp
index e33f583..741a74f 100644
--- a/test/std/re/re.alg/re.alg.search/awk.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/awk.pass.cpp
@@ -753,6 +753,8 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         const wchar_t s[] = L"a";
@@ -1483,6 +1485,7 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/basic.locale.pass.cpp b/test/std/re/re.alg/re.alg.search/basic.locale.pass.cpp
index 130ef49..4d1532e 100644
--- a/test/std/re/re.alg/re.alg.search/basic.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/basic.locale.pass.cpp
@@ -73,6 +73,8 @@
                                                  std::regex_constants::basic)));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -114,5 +116,7 @@
                                                  std::regex_constants::basic)));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/basic.pass.cpp b/test/std/re/re.alg/re.alg.search/basic.pass.cpp
index 0ea290e..287ca99 100644
--- a/test/std/re/re.alg/re.alg.search/basic.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/basic.pass.cpp
@@ -740,6 +740,7 @@
         assert(m.str(0) == s);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         assert(!std::regex_search(L"a", m, std::wregex()));
@@ -1456,6 +1457,8 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     { // LWG 2273
         std::regex re("Foo|FooBar");
         std::cmatch m;
diff --git a/test/std/re/re.alg/re.alg.search/ecma.locale.pass.cpp b/test/std/re/re.alg/re.alg.search/ecma.locale.pass.cpp
index e97c4df..3da1e58 100644
--- a/test/std/re/re.alg/re.alg.search/ecma.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/ecma.locale.pass.cpp
@@ -71,6 +71,8 @@
         assert(!std::regex_search(s, m, std::regex("[a[=M=]z]")));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -110,5 +112,7 @@
         assert(!std::regex_search(s, m, std::wregex(L"[a[=M=]z]")));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/ecma.pass.cpp b/test/std/re/re.alg/re.alg.search/ecma.pass.cpp
index 57f7182..00977d3 100644
--- a/test/std/re/re.alg/re.alg.search/ecma.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/ecma.pass.cpp
@@ -763,6 +763,7 @@
         assert(m.str(0) == s);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         const wchar_t s[] = L"a";
@@ -1502,6 +1503,7 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/extended.locale.pass.cpp b/test/std/re/re.alg/re.alg.search/extended.locale.pass.cpp
index 8902d06..2030602 100644
--- a/test/std/re/re.alg/re.alg.search/extended.locale.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/extended.locale.pass.cpp
@@ -73,6 +73,8 @@
                                                  std::regex_constants::extended)));
         assert(m.size() == 0);
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     {
         std::wcmatch m;
@@ -114,5 +116,7 @@
                                                  std::regex_constants::extended)));
         assert(m.size() == 0);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+
     return 0;
 }
diff --git a/test/std/re/re.alg/re.alg.search/extended.pass.cpp b/test/std/re/re.alg/re.alg.search/extended.pass.cpp
index b5b7718..8ffedfc 100644
--- a/test/std/re/re.alg/re.alg.search/extended.pass.cpp
+++ b/test/std/re/re.alg/re.alg.search/extended.pass.cpp
@@ -756,6 +756,7 @@
         assert(m.str(0) == s);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wcmatch m;
         const wchar_t s[] = L"a";
@@ -1488,6 +1489,7 @@
         assert(m.position(0) == 0);
         assert(m.str(0) == s);
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.iter/re.regiter/re.regiter.cnstr/default.pass.cpp b/test/std/re/re.iter/re.regiter/re.regiter.cnstr/default.pass.cpp
index 75bd9ca..52b3309 100644
--- a/test/std/re/re.iter/re.regiter/re.regiter.cnstr/default.pass.cpp
+++ b/test/std/re/re.iter/re.regiter/re.regiter.cnstr/default.pass.cpp
@@ -28,7 +28,9 @@
 int main(int, char**)
 {
     test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.iter/re.regiter/types.pass.cpp b/test/std/re/re.iter/re.regiter/types.pass.cpp
index b96fec7..7d30b0a 100644
--- a/test/std/re/re.iter/re.regiter/types.pass.cpp
+++ b/test/std/re/re.iter/re.regiter/types.pass.cpp
@@ -41,7 +41,9 @@
 int main(int, char**)
 {
     test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.regex/re.regex.construct/deduct.pass.cpp b/test/std/re/re.regex/re.regex.construct/deduct.pass.cpp
index feabcfc..db4fba0 100644
--- a/test/std/re/re.regex/re.regex.construct/deduct.pass.cpp
+++ b/test/std/re/re.regex/re.regex.construct/deduct.pass.cpp
@@ -42,6 +42,7 @@
     assert(re.mark_count() == 0);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     std::wstring s1(L"\\(a\\)");
     std::basic_regex re(s1.begin(), s1.end(), std::regex_constants::basic);
@@ -50,6 +51,7 @@
     assert(re.flags() == std::regex_constants::basic);
     assert(re.mark_count() == 1);
     }
+#endif
 
 //  Test the implicit deduction guides
     {
@@ -60,6 +62,7 @@
     assert(re.mark_count() == 2);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
 //  basic_regex(string, flag_type);
     std::basic_regex re(L"(a([bc]))"s, std::regex_constants::awk);
@@ -67,6 +70,7 @@
     assert(re.flags() == std::regex_constants::awk);
     assert(re.mark_count() == 2);
     }
+#endif
 
     {
 //  basic_regex(const charT*);
@@ -76,6 +80,7 @@
     assert(re.mark_count() == 0);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
 //  basic_regex(const charT*, flag_type);
     std::basic_regex re(L"ABCDE", std::regex_constants::grep);
@@ -83,6 +88,7 @@
     assert(re.flags() == std::regex_constants::grep);
     assert(re.mark_count() == 0);
     }
+#endif
 
     {
 //  basic_regex(const charT*, size_t);
@@ -92,6 +98,7 @@
     assert(re.mark_count() == 0);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
 //  basic_regex(const charT*, size_t, flag_type);
     std::basic_regex re(L"ABCDEDEF", 8, std::regex_constants::awk);
@@ -99,6 +106,7 @@
     assert(re.flags() == std::regex_constants::awk);
     assert(re.mark_count() == 0);
     }
+#endif
 
     {
 //  basic_regex(const basic_regex &);
@@ -123,6 +131,7 @@
     assert(re.mark_count() == 0);
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
 //  basic_regex(initializer_list, flag_type);
     std::basic_regex re({L'A', L'B', L'F', L'E', L'D'}, std::regex_constants::grep);
@@ -130,6 +139,7 @@
     assert(re.flags() == std::regex_constants::grep);
     assert(re.mark_count() == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.regex/re.regex.construct/default.pass.cpp b/test/std/re/re.regex/re.regex.construct/default.pass.cpp
index 9705d70..f0abdbf 100644
--- a/test/std/re/re.regex/re.regex.construct/default.pass.cpp
+++ b/test/std/re/re.regex/re.regex.construct/default.pass.cpp
@@ -28,7 +28,9 @@
 int main(int, char**)
 {
     test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.all/get_allocator.pass.cpp b/test/std/re/re.results/re.results.all/get_allocator.pass.cpp
index 33b5970..84ef708 100644
--- a/test/std/re/re.results/re.results.all/get_allocator.pass.cpp
+++ b/test/std/re/re.results/re.results.all/get_allocator.pass.cpp
@@ -31,7 +31,9 @@
 int main(int, char**)
 {
     test<char>(test_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(test_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.const/allocator.pass.cpp b/test/std/re/re.results/re.results.const/allocator.pass.cpp
index 6599546..5d152c4 100644
--- a/test/std/re/re.results/re.results.const/allocator.pass.cpp
+++ b/test/std/re/re.results/re.results.const/allocator.pass.cpp
@@ -31,7 +31,9 @@
 int main(int, char**)
 {
     test<char>(test_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(test_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.const/copy.pass.cpp b/test/std/re/re.results/re.results.const/copy.pass.cpp
index 88b8093..be9585e 100644
--- a/test/std/re/re.results/re.results.const/copy.pass.cpp
+++ b/test/std/re/re.results/re.results.const/copy.pass.cpp
@@ -33,10 +33,14 @@
 int main(int, char**)
 {
     test<char>   (std::allocator<std::sub_match<const char *> >());
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(std::allocator<std::sub_match<const wchar_t *> >());
+#endif
 
     test<char>   (test_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(test_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.const/copy_assign.pass.cpp b/test/std/re/re.results/re.results.const/copy_assign.pass.cpp
index 1b220df..33dbeb9 100644
--- a/test/std/re/re.results/re.results.const/copy_assign.pass.cpp
+++ b/test/std/re/re.results/re.results.const/copy_assign.pass.cpp
@@ -37,15 +37,21 @@
 int main(int, char**)
 {
     test<char>   (std::allocator<std::sub_match<const char *> >());
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(std::allocator<std::sub_match<const wchar_t *> >());
+#endif
 
-//  test_allocator has POCCA -> false
+    // test_allocator has POCCA -> false
     test<char>   (test_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(test_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
-//  other_allocator has POCCA -> true
+    // other_allocator has POCCA -> true
     test<char>   (other_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(other_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.const/default.pass.cpp b/test/std/re/re.results/re.results.const/default.pass.cpp
index 52a7282..bcb2462 100644
--- a/test/std/re/re.results/re.results.const/default.pass.cpp
+++ b/test/std/re/re.results/re.results.const/default.pass.cpp
@@ -46,7 +46,9 @@
 int main(int, char**)
 {
     test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.const/move.pass.cpp b/test/std/re/re.results/re.results.const/move.pass.cpp
index e960cc6..82f2b3e 100644
--- a/test/std/re/re.results/re.results.const/move.pass.cpp
+++ b/test/std/re/re.results/re.results.const/move.pass.cpp
@@ -38,12 +38,16 @@
 int main(int, char**)
 {
     test<char>   (std::allocator<std::sub_match<const char *> >());
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(std::allocator<std::sub_match<const wchar_t *> >());
+#endif
 
     test<char>   (test_allocator<std::sub_match<const char*> >(3));
     assert(test_alloc_base::moved == 1);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(test_allocator<std::sub_match<const wchar_t*> >(3));
     assert(test_alloc_base::moved == 2);
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.const/move_assign.pass.cpp b/test/std/re/re.results/re.results.const/move_assign.pass.cpp
index 42393f1..a8c269d 100644
--- a/test/std/re/re.results/re.results.const/move_assign.pass.cpp
+++ b/test/std/re/re.results/re.results.const/move_assign.pass.cpp
@@ -38,15 +38,21 @@
 int main(int, char**)
 {
     test<char>   (std::allocator<std::sub_match<const char *> >());
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(std::allocator<std::sub_match<const wchar_t *> >());
+#endif
 
-//  test_allocator has POCMA -> false
+    // test_allocator has POCMA -> false
     test<char>   (test_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(test_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
-//  other_allocator has POCMA -> true
+    // other_allocator has POCMA -> true
     test<char>   (other_allocator<std::sub_match<const char*> >(3));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>(other_allocator<std::sub_match<const wchar_t*> >(3));
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.form/form1.pass.cpp b/test/std/re/re.results/re.results.form/form1.pass.cpp
index f435de8..4bf888d 100644
--- a/test/std/re/re.results/re.results.form/form1.pass.cpp
+++ b/test/std/re/re.results/re.results.form/form1.pass.cpp
@@ -114,6 +114,7 @@
         assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::match_results<const wchar_t*> m;
         const wchar_t s[] = L"abcdefghijk";
@@ -152,6 +153,7 @@
         assert(r == out + 34);
         assert(std::wstring(out) == L"match: cdefghi, m[1]: efg, m[2]: e");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.form/form2.pass.cpp b/test/std/re/re.results/re.results.form/form2.pass.cpp
index fc0c0ad..91b7137 100644
--- a/test/std/re/re.results/re.results.form/form2.pass.cpp
+++ b/test/std/re/re.results/re.results.form/form2.pass.cpp
@@ -25,7 +25,6 @@
 int main(int, char**)
 {
     typedef std::basic_string<char, std::char_traits<char>, test_allocator<char> > nstr;
-    typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t> > wstr;
     {
         std::match_results<const char*> m;
         const char s[] = "abcdefghijk";
@@ -62,6 +61,8 @@
         assert(std::string(out) == "match: cdefghi, m[1]: efg, m[2]: e");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t> > wstr;
     {
         std::match_results<const wchar_t*> m;
         const wchar_t s[] = L"abcdefghijk";
@@ -97,6 +98,7 @@
         assert(r == out + 34);
         assert(std::wstring(out) == L"match: cdefghi, m[1]: efg, m[2]: e");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.form/form3.pass.cpp b/test/std/re/re.results/re.results.form/form3.pass.cpp
index 67bd66a..384cf17 100644
--- a/test/std/re/re.results/re.results.form/form3.pass.cpp
+++ b/test/std/re/re.results/re.results.form/form3.pass.cpp
@@ -24,7 +24,6 @@
 int main(int, char**)
 {
     typedef std::basic_string<char, std::char_traits<char>, test_allocator<char> > nstr;
-    typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t> > wstr;
     {
         std::match_results<const char*> m;
         const char s[] = "abcdefghijk";
@@ -53,6 +52,8 @@
         assert(out == "match: cdefghi, m[1]: efg, m[2]: e");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t> > wstr;
     {
         std::match_results<const wchar_t*> m;
         const wchar_t s[] = L"abcdefghijk";
@@ -80,6 +81,7 @@
         wstr out = m.format(fmt, std::regex_constants::format_sed);
         assert(out == L"match: cdefghi, m[1]: efg, m[2]: e");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.results/re.results.form/form4.pass.cpp b/test/std/re/re.results/re.results.form/form4.pass.cpp
index 69152f7..7bd25d9 100644
--- a/test/std/re/re.results/re.results.form/form4.pass.cpp
+++ b/test/std/re/re.results/re.results.form/form4.pass.cpp
@@ -48,6 +48,7 @@
         assert(out == "match: cdefghi, m[1]: efg, m[2]: e");
     }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::match_results<const wchar_t*> m;
         const wchar_t s[] = L"abcdefghijk";
@@ -75,6 +76,7 @@
         std::wstring out = m.format(fmt, std::regex_constants::format_sed);
         assert(out == L"match: cdefghi, m[1]: efg, m[2]: e");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/compare_string_type.pass.cpp b/test/std/re/re.submatch/re.submatch.members/compare_string_type.pass.cpp
index 6b57a19..31f2737 100644
--- a/test/std/re/re.submatch/re.submatch.members/compare_string_type.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/compare_string_type.pass.cpp
@@ -31,6 +31,7 @@
         assert(sm.compare(string()) > 0);
         assert(sm.compare(string("123")) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
@@ -44,6 +45,7 @@
         assert(sm.compare(string()) > 0);
         assert(sm.compare(string(L"123")) == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/compare_sub_match.pass.cpp b/test/std/re/re.submatch/re.submatch.members/compare_sub_match.pass.cpp
index 6d0976b..fbd21e3 100644
--- a/test/std/re/re.submatch/re.submatch.members/compare_sub_match.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/compare_sub_match.pass.cpp
@@ -34,6 +34,7 @@
         sm2.matched = true;
         assert(sm.compare(sm2) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
@@ -50,6 +51,7 @@
         sm2.matched = true;
         assert(sm.compare(sm2) == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/compare_value_type_ptr.pass.cpp b/test/std/re/re.submatch/re.submatch.members/compare_value_type_ptr.pass.cpp
index 42e6ab9..b213a51 100644
--- a/test/std/re/re.submatch/re.submatch.members/compare_value_type_ptr.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/compare_value_type_ptr.pass.cpp
@@ -30,6 +30,7 @@
         assert(sm.compare("") > 0);
         assert(sm.compare("123") == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
@@ -42,6 +43,7 @@
         assert(sm.compare(L"") > 0);
         assert(sm.compare(L"123") == 0);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/default.pass.cpp b/test/std/re/re.submatch/re.submatch.members/default.pass.cpp
index c34591f..c828f49 100644
--- a/test/std/re/re.submatch/re.submatch.members/default.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/default.pass.cpp
@@ -24,12 +24,14 @@
         SM sm;
         assert(sm.matched == false);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
         SM sm;
         assert(sm.matched == false);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/length.pass.cpp b/test/std/re/re.submatch/re.submatch.members/length.pass.cpp
index 5246eb3..1027bd7 100644
--- a/test/std/re/re.submatch/re.submatch.members/length.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/length.pass.cpp
@@ -29,6 +29,7 @@
         sm.matched = true;
         assert(sm.length() == 3);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
@@ -40,6 +41,7 @@
         sm.matched = true;
         assert(sm.length() == 3);
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/operator_string.pass.cpp b/test/std/re/re.submatch/re.submatch.members/operator_string.pass.cpp
index 051ecc3..08a9dbf 100644
--- a/test/std/re/re.submatch/re.submatch.members/operator_string.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/operator_string.pass.cpp
@@ -31,6 +31,7 @@
         str = sm;
         assert(str == std::string("123"));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
@@ -44,6 +45,7 @@
         str = sm;
         assert(str == std::wstring(L"123"));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.members/str.pass.cpp b/test/std/re/re.submatch/re.submatch.members/str.pass.cpp
index af39ee9..ffdcbaa 100644
--- a/test/std/re/re.submatch/re.submatch.members/str.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.members/str.pass.cpp
@@ -31,6 +31,7 @@
         str = sm.str();
         assert(str == std::string("123"));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef wchar_t CharT;
         typedef std::sub_match<const CharT*> SM;
@@ -44,6 +45,7 @@
         str = sm.str();
         assert(str == std::wstring(L"123"));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.op/compare.pass.cpp b/test/std/re/re.submatch/re.submatch.op/compare.pass.cpp
index e332a83..be072b1 100644
--- a/test/std/re/re.submatch/re.submatch.op/compare.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.op/compare.pass.cpp
@@ -280,10 +280,12 @@
 {
     test(std::string("123"), std::string("123"));
     test(std::string("1234"), std::string("123"));
+    test(std::string("123\000" "56", 6), std::string("123\000" "56", 6), false);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test(std::wstring(L"123"), std::wstring(L"123"));
     test(std::wstring(L"1234"), std::wstring(L"123"));
-    test(std::string("123\000" "56", 6), std::string("123\000" "56", 6), false);
     test(std::wstring(L"123\000" L"56", 6), std::wstring(L"123\000" L"56", 6), false);
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/re.submatch.op/stream.pass.cpp b/test/std/re/re.submatch/re.submatch.op/stream.pass.cpp
index 070266d..244d78d 100644
--- a/test/std/re/re.submatch/re.submatch.op/stream.pass.cpp
+++ b/test/std/re/re.submatch/re.submatch.op/stream.pass.cpp
@@ -38,7 +38,9 @@
 int main(int, char**)
 {
     test(std::string("123"));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test(std::wstring(L"123"));
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.submatch/types.pass.cpp b/test/std/re/re.submatch/types.pass.cpp
index 831eec1..3c23d72 100644
--- a/test/std/re/re.submatch/types.pass.cpp
+++ b/test/std/re/re.submatch/types.pass.cpp
@@ -37,11 +37,16 @@
         static_assert((std::is_same<SM::string_type, std::string>::value), "");
         static_assert((std::is_convertible<SM*, std::pair<char*, char*>*>::value), "");
 
+        static_assert((std::is_same<std::csub_match, std::sub_match<const char*> >::value), "");
+        static_assert((std::is_same<std::ssub_match, std::sub_match<std::string::const_iterator> >::value), "");
+
         SM sm;
         sm.first = nullptr;
         sm.second = nullptr;
         sm.matched = false;
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::sub_match<wchar_t*> SM;
         static_assert((std::is_same<SM::iterator, wchar_t*>::value), "");
@@ -50,17 +55,15 @@
         static_assert((std::is_same<SM::string_type, std::wstring>::value), "");
         static_assert((std::is_convertible<SM*, std::pair<wchar_t*, wchar_t*>*>::value), "");
 
+        static_assert((std::is_same<std::wcsub_match, std::sub_match<const wchar_t*> >::value), "");
+        static_assert((std::is_same<std::wssub_match, std::sub_match<std::wstring::const_iterator> >::value), "");
+
         SM sm;
         sm.first = nullptr;
         sm.second = nullptr;
         sm.matched = false;
     }
-    {
-        static_assert((std::is_same<std::csub_match, std::sub_match<const char*> >::value), "");
-        static_assert((std::is_same<std::wcsub_match, std::sub_match<const wchar_t*> >::value), "");
-        static_assert((std::is_same<std::ssub_match, std::sub_match<std::string::const_iterator> >::value), "");
-        static_assert((std::is_same<std::wssub_match, std::sub_match<std::wstring::const_iterator> >::value), "");
-    }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.syn/wcmatch.pass.cpp b/test/std/re/re.syn/wcmatch.pass.cpp
index f373e57..3f35901 100644
--- a/test/std/re/re.syn/wcmatch.pass.cpp
+++ b/test/std/re/re.syn/wcmatch.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef match_results<const wchar_t*>   wcmatch;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wcregex_iterator.pass.cpp b/test/std/re/re.syn/wcregex_iterator.pass.cpp
index 3425c98..78d354c 100644
--- a/test/std/re/re.syn/wcregex_iterator.pass.cpp
+++ b/test/std/re/re.syn/wcregex_iterator.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef regex_iterator<const wchar_t*>   wcregex_iterator;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wcregex_token_iterator.pass.cpp b/test/std/re/re.syn/wcregex_token_iterator.pass.cpp
index 2176538..2f88b89 100644
--- a/test/std/re/re.syn/wcregex_token_iterator.pass.cpp
+++ b/test/std/re/re.syn/wcregex_token_iterator.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef regex_token_iterator<const wchar_t*>   wcregex_token_iterator;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wcsub_match.pass.cpp b/test/std/re/re.syn/wcsub_match.pass.cpp
index 86a2103..0b71ee7 100644
--- a/test/std/re/re.syn/wcsub_match.pass.cpp
+++ b/test/std/re/re.syn/wcsub_match.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef sub_match<const wchar_t*>   wcsub_match;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wregex.pass.cpp b/test/std/re/re.syn/wregex.pass.cpp
index 5be6f6f..15df351 100644
--- a/test/std/re/re.syn/wregex.pass.cpp
+++ b/test/std/re/re.syn/wregex.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef basic_regex<wchar_t> wregex;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wsmatch.pass.cpp b/test/std/re/re.syn/wsmatch.pass.cpp
index 760057e..5518a5c 100644
--- a/test/std/re/re.syn/wsmatch.pass.cpp
+++ b/test/std/re/re.syn/wsmatch.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef match_results<wstring::const_iterator>   wsmatch;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wsregex_iterator.pass.cpp b/test/std/re/re.syn/wsregex_iterator.pass.cpp
index b1d7edf..461b147 100644
--- a/test/std/re/re.syn/wsregex_iterator.pass.cpp
+++ b/test/std/re/re.syn/wsregex_iterator.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef regex_iterator<wstring::const_iterator>   wsregex_iterator;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wsregex_token_iterator.pass.cpp b/test/std/re/re.syn/wsregex_token_iterator.pass.cpp
index 58454a5..520671c 100644
--- a/test/std/re/re.syn/wsregex_token_iterator.pass.cpp
+++ b/test/std/re/re.syn/wsregex_token_iterator.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef regex_token_iterator<wstring::const_iterator>   wsregex_token_iterator;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.syn/wssub_match.pass.cpp b/test/std/re/re.syn/wssub_match.pass.cpp
index 7ca6dc7..cf53f28 100644
--- a/test/std/re/re.syn/wssub_match.pass.cpp
+++ b/test/std/re/re.syn/wssub_match.pass.cpp
@@ -10,6 +10,8 @@
 
 // typedef sub_match<wstring::const_iterator>   wssub_match;
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <regex>
 #include <type_traits>
 #include "test_macros.h"
diff --git a/test/std/re/re.traits/default.pass.cpp b/test/std/re/re.traits/default.pass.cpp
index 432de84..ff817cb 100644
--- a/test/std/re/re.traits/default.pass.cpp
+++ b/test/std/re/re.traits/default.pass.cpp
@@ -23,18 +23,27 @@
 int main(int, char**)
 {
     {
-        std::regex_traits<char> t1;
-        assert(t1.getloc().name() == "C");
-        std::regex_traits<wchar_t> t2;
-        assert(t2.getloc().name() == "C");
+        std::regex_traits<char> t;
+        assert(t.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        std::regex_traits<wchar_t> t;
+        assert(t.getloc().name() == "C");
+    }
+#endif
     {
         std::locale::global(std::locale(LOCALE_en_US_UTF_8));
-        std::regex_traits<char> t1;
-        assert(t1.getloc().name() == LOCALE_en_US_UTF_8);
-        std::regex_traits<wchar_t> t2;
-        assert(t2.getloc().name() == LOCALE_en_US_UTF_8);
+        std::regex_traits<char> t;
+        assert(t.getloc().name() == LOCALE_en_US_UTF_8);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        std::locale::global(std::locale(LOCALE_en_US_UTF_8));
+        std::regex_traits<wchar_t> t;
+        assert(t.getloc().name() == LOCALE_en_US_UTF_8);
+    }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/getloc.pass.cpp b/test/std/re/re.traits/getloc.pass.cpp
index dbc35de..55820cc 100644
--- a/test/std/re/re.traits/getloc.pass.cpp
+++ b/test/std/re/re.traits/getloc.pass.cpp
@@ -23,18 +23,27 @@
 int main(int, char**)
 {
     {
-        std::regex_traits<char> t1;
-        assert(t1.getloc().name() == "C");
-        std::regex_traits<wchar_t> t2;
-        assert(t2.getloc().name() == "C");
+        std::regex_traits<char> t;
+        assert(t.getloc().name() == "C");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        std::regex_traits<wchar_t> t;
+        assert(t.getloc().name() == "C");
+    }
+#endif
     {
         std::locale::global(std::locale(LOCALE_en_US_UTF_8));
-        std::regex_traits<char> t1;
-        assert(t1.getloc().name() == LOCALE_en_US_UTF_8);
-        std::regex_traits<wchar_t> t2;
-        assert(t2.getloc().name() == LOCALE_en_US_UTF_8);
+        std::regex_traits<char> t;
+        assert(t.getloc().name() == LOCALE_en_US_UTF_8);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        std::locale::global(std::locale(LOCALE_en_US_UTF_8));
+        std::regex_traits<wchar_t> t;
+        assert(t.getloc().name() == LOCALE_en_US_UTF_8);
+    }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/isctype.pass.cpp b/test/std/re/re.traits/isctype.pass.cpp
index 3563f8a..c6bba18 100644
--- a/test/std/re/re.traits/isctype.pass.cpp
+++ b/test/std/re/re.traits/isctype.pass.cpp
@@ -150,6 +150,8 @@
         assert(!t.isctype('-', t.lookup_classname(s.begin(), s.end())));
         assert(!t.isctype('@', t.lookup_classname(s.begin(), s.end())));
     }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::regex_traits<wchar_t> t;
 
@@ -279,6 +281,7 @@
         assert(!t.isctype(L'-', t.lookup_classname(s.begin(), s.end())));
         assert(!t.isctype(L'@', t.lookup_classname(s.begin(), s.end())));
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.traits/length.pass.cpp b/test/std/re/re.traits/length.pass.cpp
index b0be164..e14df64 100644
--- a/test/std/re/re.traits/length.pass.cpp
+++ b/test/std/re/re.traits/length.pass.cpp
@@ -23,10 +23,12 @@
     assert(std::regex_traits<char>::length("12") == 2);
     assert(std::regex_traits<char>::length("123") == 3);
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     assert(std::regex_traits<wchar_t>::length(L"") == 0);
     assert(std::regex_traits<wchar_t>::length(L"1") == 1);
     assert(std::regex_traits<wchar_t>::length(L"12") == 2);
     assert(std::regex_traits<wchar_t>::length(L"123") == 3);
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/lookup_classname.pass.cpp b/test/std/re/re.traits/lookup_classname.pass.cpp
index 31d93cb..ddf4663 100644
--- a/test/std/re/re.traits/lookup_classname.pass.cpp
+++ b/test/std/re/re.traits/lookup_classname.pass.cpp
@@ -158,6 +158,7 @@
     test("", std::ctype_base::mask());
     test("digits", std::ctype_base::mask());
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test(L"d", std::ctype_base::digit);
     test(L"D", std::ctype_base::digit);
     test(L"d", std::ctype_base::digit, true);
@@ -245,6 +246,7 @@
     test(L"dig", std::ctype_base::mask());
     test(L"", std::ctype_base::mask());
     test(L"digits", std::ctype_base::mask());
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/lookup_collatename.pass.cpp b/test/std/re/re.traits/lookup_collatename.pass.cpp
index 27ff6ee..7258692 100644
--- a/test/std/re/re.traits/lookup_collatename.pass.cpp
+++ b/test/std/re/re.traits/lookup_collatename.pass.cpp
@@ -117,6 +117,7 @@
     test("ch", std::string("ch"));
     std::locale::global(std::locale("C"));
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test(L"NUL", std::wstring(L"\x00", 1));
     test(L"alert", std::wstring(L"\x07"));
     test(L"backspace", std::wstring(L"\x08"));
@@ -192,6 +193,7 @@
     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
     test(L"ch", std::wstring(L"ch"));
     std::locale::global(std::locale("C"));
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/re/re.traits/transform.pass.cpp b/test/std/re/re.traits/transform.pass.cpp
index cbc5eaa..80cd3f0 100644
--- a/test/std/re/re.traits/transform.pass.cpp
+++ b/test/std/re/re.traits/transform.pass.cpp
@@ -35,6 +35,7 @@
         t.imbue(std::locale(LOCALE_cs_CZ_ISO8859_2));
         assert(t.transform(F(a), F(a+1)) < t.transform(F(B), F(B+1)));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::regex_traits<wchar_t> t;
         const wchar_t a[] = L"a";
@@ -44,6 +45,7 @@
         t.imbue(std::locale(LOCALE_cs_CZ_ISO8859_2));
         assert(t.transform(F(a), F(a+1)) < t.transform(F(B), F(B+1)));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/transform_primary.pass.cpp b/test/std/re/re.traits/transform_primary.pass.cpp
index 3b1be1d..4f793aa 100644
--- a/test/std/re/re.traits/transform_primary.pass.cpp
+++ b/test/std/re/re.traits/transform_primary.pass.cpp
@@ -39,6 +39,7 @@
         assert(t.transform_primary(F(A), F(A+1)) ==
                t.transform_primary(F(Aacute), F(Aacute+1)));
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::regex_traits<wchar_t> t;
         const wchar_t A[] = L"A";
@@ -50,6 +51,7 @@
         assert(t.transform_primary(F(A), F(A+1)) ==
                t.transform_primary(F(Aacute), F(Aacute+1)));
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/translate.pass.cpp b/test/std/re/re.traits/translate.pass.cpp
index e9e32e9..a3e5978 100644
--- a/test/std/re/re.traits/translate.pass.cpp
+++ b/test/std/re/re.traits/translate.pass.cpp
@@ -24,12 +24,14 @@
         assert(t.translate('B') == 'B');
         assert(t.translate('c') == 'c');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::regex_traits<wchar_t> t;
         assert(t.translate(L'a') == L'a');
         assert(t.translate(L'B') == L'B');
         assert(t.translate(L'c') == L'c');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/translate_nocase.pass.cpp b/test/std/re/re.traits/translate_nocase.pass.cpp
index 47f521d..d7eabc9 100644
--- a/test/std/re/re.traits/translate_nocase.pass.cpp
+++ b/test/std/re/re.traits/translate_nocase.pass.cpp
@@ -40,6 +40,7 @@
         assert(t.translate_nocase('a') == 'a');
         assert(t.translate_nocase('1') == '1');
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::regex_traits<wchar_t> t;
         assert(t.translate_nocase(L' ') == L' ');
@@ -60,6 +61,7 @@
         assert(t.translate_nocase(L'\xDA') == L'\xFA');
         assert(t.translate_nocase(L'\xFA') == L'\xFA');
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/types.pass.cpp b/test/std/re/re.traits/types.pass.cpp
index 5816cb2..f15a647 100644
--- a/test/std/re/re.traits/types.pass.cpp
+++ b/test/std/re/re.traits/types.pass.cpp
@@ -25,9 +25,11 @@
     static_assert((std::is_same<std::regex_traits<char>::char_type, char>::value), "");
     static_assert((std::is_same<std::regex_traits<char>::string_type, std::string>::value), "");
     static_assert((std::is_same<std::regex_traits<char>::locale_type, std::locale>::value), "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert((std::is_same<std::regex_traits<wchar_t>::char_type, wchar_t>::value), "");
     static_assert((std::is_same<std::regex_traits<wchar_t>::string_type, std::wstring>::value), "");
     static_assert((std::is_same<std::regex_traits<wchar_t>::locale_type, std::locale>::value), "");
+#endif
 
   return 0;
 }
diff --git a/test/std/re/re.traits/value.pass.cpp b/test/std/re/re.traits/value.pass.cpp
index b7ca1fb..d4b7b0a 100644
--- a/test/std/re/re.traits/value.pass.cpp
+++ b/test/std/re/re.traits/value.pass.cpp
@@ -70,6 +70,7 @@
             assert(t.value(char(c), 16) == -1);
         }
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::regex_traits<wchar_t> t;
 
@@ -122,6 +123,7 @@
             assert(t.value(c, 16) == -1);
         }
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/basic.string.hash/enabled_hashes.pass.cpp b/test/std/strings/basic.string.hash/enabled_hashes.pass.cpp
index 0935b89..67e22ea 100644
--- a/test/std/strings/basic.string.hash/enabled_hashes.pass.cpp
+++ b/test/std/strings/basic.string.hash/enabled_hashes.pass.cpp
@@ -23,7 +23,9 @@
   test_library_hash_specializations_available();
   {
     test_hash_enabled_for_type<std::string>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test_hash_enabled_for_type<std::wstring>();
+#endif
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test_hash_enabled_for_type<std::u8string>();
 #endif
diff --git a/test/std/strings/basic.string.hash/strings.pass.cpp b/test/std/strings/basic.string.hash/strings.pass.cpp
index dbed700..9f7299b 100644
--- a/test/std/strings/basic.string.hash/strings.pass.cpp
+++ b/test/std/strings/basic.string.hash/strings.pass.cpp
@@ -50,7 +50,9 @@
     test<std::u16string>();
     test<std::u32string>();
 #endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wstring>();
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/basic.string.literals/literal.pass.cpp b/test/std/strings/basic.string.literals/literal.pass.cpp
index d8274bc..6d48e74 100644
--- a/test/std/strings/basic.string.literals/literal.pass.cpp
+++ b/test/std/strings/basic.string.literals/literal.pass.cpp
@@ -25,31 +25,41 @@
 
         ASSERT_SAME_TYPE(decltype(  "Hi"s), std::string);
         ASSERT_SAME_TYPE(decltype(u8"Hi"s), u8string);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         ASSERT_SAME_TYPE(decltype( L"Hi"s), std::wstring);
+#endif
         ASSERT_SAME_TYPE(decltype( u"Hi"s), std::u16string);
         ASSERT_SAME_TYPE(decltype( U"Hi"s), std::u32string);
 
         std::string foo;
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         std::wstring Lfoo;
+#endif
         u8string u8foo;
         std::u16string ufoo;
         std::u32string Ufoo;
 
         foo   =   ""s;     assert(  foo.size() == 0);
         u8foo = u8""s;     assert(u8foo.size() == 0);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         Lfoo  =  L""s;     assert( Lfoo.size() == 0);
+#endif
         ufoo  =  u""s;     assert( ufoo.size() == 0);
         Ufoo  =  U""s;     assert( Ufoo.size() == 0);
 
         foo   =   " "s;    assert(  foo.size() == 1);
         u8foo = u8" "s;    assert(u8foo.size() == 1);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         Lfoo  =  L" "s;    assert( Lfoo.size() == 1);
+#endif
         ufoo  =  u" "s;    assert( ufoo.size() == 1);
         Ufoo  =  U" "s;    assert( Ufoo.size() == 1);
 
         foo   =   "ABC"s;     assert(  foo ==   "ABC");   assert(  foo == std::string   (  "ABC"));
         u8foo = u8"ABC"s;     assert(u8foo == u8"ABC");   assert(u8foo == u8string      (u8"ABC"));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         Lfoo  =  L"ABC"s;     assert( Lfoo ==  L"ABC");   assert( Lfoo == std::wstring  ( L"ABC"));
+#endif
         ufoo  =  u"ABC"s;     assert( ufoo ==  u"ABC");   assert( ufoo == std::u16string( u"ABC"));
         Ufoo  =  U"ABC"s;     assert( Ufoo ==  U"ABC");   assert( Ufoo == std::u32string( U"ABC"));
     }
diff --git a/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp b/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp
index 31afc70..83d2a92 100644
--- a/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp
+++ b/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp
@@ -30,7 +30,9 @@
 // Test that it's possible to take the address of basic_string's destructors
 // by creating globals which will register their destructors with cxa_atexit.
 std::string s;
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 std::wstring ws;
+#endif
 
 int main(int, char**)
 {
diff --git a/test/std/strings/basic.string/string.cons/implicit_deduction_guides.pass.cpp b/test/std/strings/basic.string/string.cons/implicit_deduction_guides.pass.cpp
index e7dd236..ec48740 100644
--- a/test/std/strings/basic.string/string.cons/implicit_deduction_guides.pass.cpp
+++ b/test/std/strings/basic.string/string.cons/implicit_deduction_guides.pass.cpp
@@ -62,18 +62,22 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "aaaaaa");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string w(2ull, L'b');
     ASSERT_SAME_TYPE(decltype(w), std::wstring);
     assert(w == L"bb");
+#endif
   }
   { // Testing (3) w/ allocator
     std::basic_string s(6ull, 'a', test_allocator<char>{});
     ASSERT_SAME_TYPE(decltype(s), BStr<char,test_allocator<char>>);
     assert(s == "aaaaaa");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string w(2ull, L'b', test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), BStr<wchar_t, test_allocator<wchar_t>>);
     assert(w == L"bb");
+#endif
   }
   { // Testing (4) w/o allocator
     const std::string sin("abc");
@@ -81,6 +85,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "bc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -88,6 +93,7 @@
     std::basic_string w(win, (TestSizeT)3);
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"def");
+#endif
   }
   { // Testing (4) w/ allocator
     const std::string sin("abc");
@@ -95,6 +101,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "bc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -102,6 +109,7 @@
     std::basic_string w(win, (TestSizeT)3, test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"def");
+#endif
   }
   { // Testing (5) w/o allocator
     const std::string sin("abc");
@@ -109,6 +117,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "bc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -116,6 +125,7 @@
     std::basic_string w(win, (TestSizeT)2, (TestSizeT)3);
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"cde");
+#endif
   }
   { // Testing (5) w/ allocator
     const std::string sin("abc");
@@ -123,6 +133,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "bc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -130,48 +141,57 @@
     std::basic_string w(win, (TestSizeT)2, (TestSizeT)3, test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"cde");
+#endif
   }
   { // Testing (6) w/o allocator
     std::basic_string s("abc", (size_t)2);
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "ab");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string w(L"abcdef", (size_t)3);
     ASSERT_SAME_TYPE(decltype(w), std::wstring);
     assert(w == L"abc");
+#endif
   }
   { // Testing (6) w/ allocator
     std::basic_string s("abc", (size_t)2, std::allocator<char>{});
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "ab");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   std::char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
     std::basic_string w(L"abcdef", (TestSizeT)3, test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"abc");
+#endif
   }
   { // Testing (7) w/o allocator
     std::basic_string s("abc");
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string w(L"abcdef");
     ASSERT_SAME_TYPE(decltype(w), std::wstring);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (7) w/ allocator
     std::basic_string s("abc", std::allocator<char>{});
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   std::char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
     std::basic_string w(L"abcdef", test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"abcdef");
+#endif
   }
   { // (8) w/o allocator
     using It = cpp17_input_iterator<const char*>;
@@ -181,12 +201,24 @@
     assert(s == "abc");
   }
   { // (8) w/ allocator
-    using ExpectW = std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>;
-    using It = cpp17_input_iterator<const wchar_t*>;
-    const wchar_t* input = L"abcdef";
-    std::basic_string s(It(input), It(input + 3), test_allocator<wchar_t>{});
-    ASSERT_SAME_TYPE(decltype(s), ExpectW);
-    assert(s == L"abc");
+    {
+      using Expect = std::basic_string<char, std::char_traits<char>, test_allocator<char>>;
+      using It = cpp17_input_iterator<const char*>;
+      const char* input = "abcdef";
+      std::basic_string s(It(input), It(input + 3), test_allocator<char>{});
+      ASSERT_SAME_TYPE(decltype(s), Expect);
+      assert(s == "abc");
+    }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+      using ExpectW = std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>;
+      using It = cpp17_input_iterator<const wchar_t*>;
+      const wchar_t* input = L"abcdef";
+      std::basic_string s(It(input), It(input + 3), test_allocator<wchar_t>{});
+      ASSERT_SAME_TYPE(decltype(s), ExpectW);
+      assert(s == L"abc");
+    }
+#endif
   }
   { // Testing (9)
     const std::string sin("abc");
@@ -194,6 +226,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -201,6 +234,7 @@
     std::basic_string w(win);
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (10)
     const std::string sin("abc");
@@ -208,6 +242,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -215,6 +250,7 @@
     std::basic_string w(win, test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (11)
     std::string sin("abc");
@@ -222,6 +258,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -229,6 +266,7 @@
     std::basic_string w(std::move(win));
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (12)
     std::string sin("abc");
@@ -236,6 +274,7 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WStr = std::basic_string<wchar_t,
                                   constexpr_char_traits<wchar_t>,
                                   test_allocator<wchar_t>>;
@@ -243,24 +282,29 @@
     std::basic_string w(std::move(win), test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), WStr);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (13) w/o allocator
     std::basic_string s({'a', 'b', 'c'});
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string w({L'a', L'b', L'c'});
     ASSERT_SAME_TYPE(decltype(w), std::wstring);
     assert(w == L"abc");
+#endif
   }
   { // Testing (13) w/ allocator
     std::basic_string s({'a', 'b', 'c'}, test_allocator<char>{});
     ASSERT_SAME_TYPE(decltype(s), BStr<char, test_allocator<char>>);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string w({L'a', L'b', L'c'}, test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), BStr<wchar_t, test_allocator<wchar_t>>);
     assert(w == L"abc");
+#endif
   }
   { // Testing (14) w/o allocator
     std::string_view sv("abc");
@@ -268,11 +312,13 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using Expect = std::basic_string<wchar_t, constexpr_char_traits<wchar_t>>;
     std::basic_string_view<wchar_t, constexpr_char_traits<wchar_t>> BSV(L"abcdef");
     std::basic_string w(BSV);
     ASSERT_SAME_TYPE(decltype(w), Expect);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (14) w/ allocator
     using ExpectS = std::basic_string<char, std::char_traits<char>, test_allocator<char>>;
@@ -281,12 +327,14 @@
     ASSERT_SAME_TYPE(decltype(s), ExpectS);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using ExpectW = std::basic_string<wchar_t, constexpr_char_traits<wchar_t>,
                                       test_allocator<wchar_t>>;
     std::basic_string_view<wchar_t, constexpr_char_traits<wchar_t>> BSV(L"abcdef");
     std::basic_string w(BSV, test_allocator<wchar_t>{});
     ASSERT_SAME_TYPE(decltype(w), ExpectW);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (15) w/o allocator
     std::string s0("abc");
@@ -294,10 +342,12 @@
     ASSERT_SAME_TYPE(decltype(s), std::string);
     assert(s == "b");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::wstring w0(L"abcdef");
     std::basic_string w(w0, 2, 2);
     ASSERT_SAME_TYPE(decltype(w), std::wstring);
     assert(w == L"cd");
+#endif
   }
   { // Testing (15) w/ allocator
     using ExpectS = std::basic_string<char, std::char_traits<char>, test_allocator<char>>;
@@ -306,11 +356,13 @@
     ASSERT_SAME_TYPE(decltype(s), ExpectS);
     assert(s == "b");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using ExpectW = std::basic_string<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>;
     ExpectW w0(L"abcdef");
     std::basic_string w(w0, 2, 2, test_allocator<wchar_t>{6});
     ASSERT_SAME_TYPE(decltype(w), ExpectW);
     assert(w == L"cd");
+#endif
   }
 
   return 0;
diff --git a/test/std/strings/basic.string/string.cons/initializer_list.pass.cpp b/test/std/strings/basic.string/string.cons/initializer_list.pass.cpp
index aeb0fcf..92f0d44 100644
--- a/test/std/strings/basic.string/string.cons/initializer_list.pass.cpp
+++ b/test/std/strings/basic.string/string.cons/initializer_list.pass.cpp
@@ -25,22 +25,26 @@
         std::string s = {'a', 'b', 'c'};
         assert(s == "abc");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstring s;
         s = {L'a', L'b', L'c'};
         assert(s == L"abc");
     }
+#endif
     {
         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
         S s = {'a', 'b', 'c'};
         assert(s == "abc");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
         S s;
         s = {L'a', L'b', L'c'};
         assert(s == L"abc");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/basic.string/string.cons/string_view_deduction.pass.cpp b/test/std/strings/basic.string/string.cons/string_view_deduction.pass.cpp
index 46b3b8f..a9b48d6 100644
--- a/test/std/strings/basic.string/string.cons/string_view_deduction.pass.cpp
+++ b/test/std/strings/basic.string/string.cons/string_view_deduction.pass.cpp
@@ -59,6 +59,7 @@
     assert(s1.size() == sv.size());
     assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     std::wstring_view sv = L"12345678901234";
     std::basic_string s1{sv, test_allocator<wchar_t>{}};
@@ -69,6 +70,7 @@
     assert(s1.size() == sv.size());
     assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0);
     }
+#endif
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     {
     std::u8string_view sv = u8"12345678901234";
diff --git a/test/std/strings/basic.string/string.cons/string_view_size_size_deduction.pass.cpp b/test/std/strings/basic.string/string.cons/string_view_size_size_deduction.pass.cpp
index 69e94ad..305194d 100644
--- a/test/std/strings/basic.string/string.cons/string_view_size_size_deduction.pass.cpp
+++ b/test/std/strings/basic.string/string.cons/string_view_size_size_deduction.pass.cpp
@@ -63,6 +63,7 @@
     assert(s1.size() == 4);
     assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0);
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
     std::wstring_view sv = L"12345678901234";
     std::basic_string s1{sv, 0, 4, test_allocator<wchar_t>{}};
@@ -73,6 +74,7 @@
     assert(s1.size() == 4);
     assert(s1.compare(0, s1.size(), sv.data(), s1.size()) == 0);
     }
+#endif
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     {
     std::u8string_view sv = u8"12345678901234";
diff --git a/test/std/strings/basic.string/string.iterators/iterators.pass.cpp b/test/std/strings/basic.string/string.iterators/iterators.pass.cpp
index 4ca75d2..c7c1eb2 100644
--- a/test/std/strings/basic.string/string.iterators/iterators.pass.cpp
+++ b/test/std/strings/basic.string/string.iterators/iterators.pass.cpp
@@ -54,7 +54,9 @@
 int main(int, char**)
 {
     test<std::string>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wstring>();
+#endif
 
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test<std::u8string>();
diff --git a/test/std/strings/basic.string/string.nonmembers/string.io/get_line.pass.cpp b/test/std/strings/basic.string/string.nonmembers/string.io/get_line.pass.cpp
index 6069f8e..b1fdf57 100644
--- a/test/std/strings/basic.string/string.nonmembers/string.io/get_line.pass.cpp
+++ b/test/std/strings/basic.string/string.nonmembers/string.io/get_line.pass.cpp
@@ -35,6 +35,7 @@
         assert(in.eof());
         assert(s == "   ghij");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream in(L" abc\n  def\n   ghij");
         std::wstring s(L"initial text");
@@ -48,6 +49,7 @@
         assert(in.eof());
         assert(s == L"   ghij");
     }
+#endif
 #if TEST_STD_VER >= 11
     {
         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
@@ -63,6 +65,7 @@
         assert(in.eof());
         assert(s == "   ghij");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
         std::wistringstream in(L" abc\n  def\n   ghij");
@@ -77,7 +80,8 @@
         assert(in.eof());
         assert(s == L"   ghij");
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_STD_VER >= 11
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         std::basic_stringbuf<char> sb("hello");
@@ -98,6 +102,7 @@
         assert(threw);
         assert(s == "hello");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::basic_stringbuf<wchar_t> sb(L"hello");
         std::basic_istream<wchar_t> is(&sb);
@@ -117,6 +122,7 @@
         assert(threw);
         assert(s == L"hello");
     }
+#endif
 
     {
         std::basic_stringbuf<char> sb;
@@ -137,6 +143,7 @@
         assert(threw);
         assert(s == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::basic_stringbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -156,6 +163,7 @@
         assert(threw);
         assert(s == L"");
     }
+#endif
 #endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
diff --git a/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp b/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp
index d7d271b..c94e6c2 100644
--- a/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp
+++ b/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim.pass.cpp
@@ -38,6 +38,7 @@
         assert(in.eof());
         assert(s == "   ghij");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream in(L" abc*  def**   ghij");
         std::wstring s(L"initial text");
@@ -54,6 +55,7 @@
         assert(in.eof());
         assert(s == L"   ghij");
     }
+#endif
 #if TEST_STD_VER >= 11
     {
         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
@@ -72,6 +74,7 @@
         assert(in.eof());
         assert(s == "   ghij");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
         std::wistringstream in(L" abc*  def**   ghij");
@@ -89,7 +92,8 @@
         assert(in.eof());
         assert(s == L"   ghij");
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_STD_VER >= 11
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         std::basic_stringbuf<char> sb("hello");
@@ -110,6 +114,7 @@
         assert(threw);
         assert(s == "hello");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::basic_stringbuf<wchar_t> sb(L"hello");
         std::basic_istream<wchar_t> is(&sb);
@@ -129,6 +134,7 @@
         assert(threw);
         assert(s == L"hello");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::basic_stringbuf<char> sb;
         std::basic_istream<char> is(&sb);
@@ -148,6 +154,7 @@
         assert(threw);
         assert(s == "");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::basic_stringbuf<wchar_t> sb;
         std::basic_istream<wchar_t> is(&sb);
@@ -167,6 +174,7 @@
         assert(threw);
         assert(s == L"");
     }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 #endif // TEST_HAS_NO_EXCEPTIONS
 
     return 0;
diff --git a/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim_rv.pass.cpp b/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim_rv.pass.cpp
index d2e5ab5..077a1a8 100644
--- a/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim_rv.pass.cpp
+++ b/test/std/strings/basic.string/string.nonmembers/string.io/get_line_delim_rv.pass.cpp
@@ -27,23 +27,27 @@
         getline(std::istringstream(" abc*  def*   ghij"), s, '*');
         assert(s == " abc");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstring s(L"initial text");
         getline(std::wistringstream(L" abc*  def*   ghij"), s, L'*');
         assert(s == L" abc");
     }
+#endif
     {
         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char> > S;
         S s("initial text");
         getline(std::istringstream(" abc*  def*   ghij"), s, '*');
         assert(s == " abc");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t> > S;
         S s(L"initial text");
         getline(std::wistringstream(L" abc*  def*   ghij"), s, L'*');
         assert(s == L" abc");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/basic.string/string.nonmembers/string.io/get_line_rv.pass.cpp b/test/std/strings/basic.string/string.nonmembers/string.io/get_line_rv.pass.cpp
index 3fb35cc..aef9047 100644
--- a/test/std/strings/basic.string/string.nonmembers/string.io/get_line_rv.pass.cpp
+++ b/test/std/strings/basic.string/string.nonmembers/string.io/get_line_rv.pass.cpp
@@ -27,23 +27,27 @@
         getline(std::istringstream(" abc\n  def\n   ghij"), s);
         assert(s == " abc");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wstring s(L"initial text");
         getline(std::wistringstream(L" abc\n  def\n   ghij"), s);
         assert(s == L" abc");
     }
+#endif
     {
         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char> > S;
         S s("initial text");
         getline(std::istringstream(" abc\n  def\n   ghij"), s);
         assert(s == " abc");
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t> > S;
         S s(L"initial text");
         getline(std::wistringstream(L" abc\n  def\n   ghij"), s);
         assert(s == L" abc");
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/basic.string/string.nonmembers/string.io/stream_extract.pass.cpp b/test/std/strings/basic.string/string.nonmembers/string.io/stream_extract.pass.cpp
index 92061e2..686b7a9 100644
--- a/test/std/strings/basic.string/string.nonmembers/string.io/stream_extract.pass.cpp
+++ b/test/std/strings/basic.string/string.nonmembers/string.io/stream_extract.pass.cpp
@@ -44,6 +44,7 @@
         in >> s;
         assert(in.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wistringstream in(L"a bc defghij");
         std::wstring s(L"initial text");
@@ -66,6 +67,7 @@
         in >> s;
         assert(in.fail());
     }
+#endif
 #ifndef TEST_HAS_NO_EXCEPTIONS
     {
         std::stringbuf sb;
@@ -128,6 +130,7 @@
         in >> s;
         assert(in.fail());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
         std::wistringstream in(L"a bc defghij");
@@ -151,7 +154,8 @@
         in >> s;
         assert(in.fail());
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_STD_VER >= 11
 
   return 0;
 }
diff --git a/test/std/strings/basic.string/string.nonmembers/string.io/stream_insert.pass.cpp b/test/std/strings/basic.string/string.nonmembers/string.io/stream_insert.pass.cpp
index b60fc33..d2b2890 100644
--- a/test/std/strings/basic.string/string.nonmembers/string.io/stream_insert.pass.cpp
+++ b/test/std/strings/basic.string/string.nonmembers/string.io/stream_insert.pass.cpp
@@ -37,6 +37,7 @@
         assert(out.good());
         assert("   " + s == out.str());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream out;
         std::wstring s(L"some text");
@@ -52,6 +53,7 @@
         assert(out.good());
         assert(L"   " + s == out.str());
     }
+#endif
 #if TEST_STD_VER >= 11
     {
         typedef std::basic_string<char, std::char_traits<char>, min_allocator<char>> S;
@@ -70,6 +72,7 @@
         assert(out.good());
         assert("   " + s == out.str());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         typedef std::basic_string<wchar_t, std::char_traits<wchar_t>, min_allocator<wchar_t>> S;
         std::basic_ostringstream<S::value_type, S::traits_type, S::allocator_type> out;
@@ -87,7 +90,8 @@
         assert(out.good());
         assert(L"   " + s == out.str());
     }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
+#endif // TEST_STD_VER >= 11
 
   return 0;
 }
diff --git a/test/std/strings/c.strings/cwchar.pass.cpp b/test/std/strings/c.strings/cwchar.pass.cpp
index 1d2742b..1ac1f28 100644
--- a/test/std/strings/c.strings/cwchar.pass.cpp
+++ b/test/std/strings/c.strings/cwchar.pass.cpp
@@ -8,6 +8,8 @@
 
 // <cwchar>
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <cwchar>
 #include <ctime>
 #include <cstdarg>
diff --git a/test/std/strings/c.strings/cwctype.pass.cpp b/test/std/strings/c.strings/cwctype.pass.cpp
index 99027d9..294b8de 100644
--- a/test/std/strings/c.strings/cwctype.pass.cpp
+++ b/test/std/strings/c.strings/cwctype.pass.cpp
@@ -8,6 +8,8 @@
 
 // <cwctype>
 
+// XFAIL: libcpp-has-no-wide-characters
+
 #include <cwctype>
 #include <type_traits>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign2.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign2.pass.cpp
index 25e4270..8ef8cfe 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign2.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign2.pass.cpp
@@ -13,6 +13,8 @@
 // static void assign(char_type& c1, const char_type& c2);
 // constexpr in C++17
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign3.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign3.pass.cpp
index e1b2945..8c58696 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign3.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/assign3.pass.cpp
@@ -12,6 +12,8 @@
 
 // static char_type* assign(char_type* s, size_t n, char_type a);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp
index 1c2e119..493e3d0 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/compare.pass.cpp
@@ -13,6 +13,8 @@
 // static int compare(const char_type* s1, const char_type* s2, size_t n);
 // constexpr in C++17
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/copy.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/copy.pass.cpp
index 3191f61..02fdb81 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/copy.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/copy.pass.cpp
@@ -12,6 +12,8 @@
 
 // static char_type* copy(char_type* s1, const char_type* s2, size_t n);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eof.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eof.pass.cpp
index cc4f1ea..a1f9be8 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eof.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eof.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr int_type eof();
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq.pass.cpp
index 400c293..51b31d9 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr bool eq(char_type c1, char_type c2);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq_int_type.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq_int_type.pass.cpp
index fbb1709..f5a5cc0 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq_int_type.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/eq_int_type.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr bool eq_int_type(int_type c1, int_type c2);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/find.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/find.pass.cpp
index 78a9ad5..11e0f8e 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/find.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/find.pass.cpp
@@ -13,6 +13,8 @@
 // static const char_type* find(const char_type* s, size_t n, const char_type& a);
 // constexpr in C++17
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/length.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/length.pass.cpp
index 7421892..12ebe97 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/length.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/length.pass.cpp
@@ -13,6 +13,8 @@
 // static size_t length(const char_type* s);
 // constexpr in C++17
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/lt.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/lt.pass.cpp
index 5664692..2bd23e9 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/lt.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/lt.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr bool lt(char_type c1, char_type c2);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/move.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/move.pass.cpp
index 2e27535..d096633 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/move.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/move.pass.cpp
@@ -12,6 +12,8 @@
 
 // static char_type* move(char_type* s1, const char_type* s2, size_t n);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/not_eof.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/not_eof.pass.cpp
index 6ae2763..c20ba81 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/not_eof.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/not_eof.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr int_type not_eof(int_type c);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_char_type.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_char_type.pass.cpp
index 6d5ef11..cea9e46 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_char_type.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_char_type.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr char_type to_char_type(int_type c);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_int_type.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_int_type.pass.cpp
index 74f8e68..02cc92e 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_int_type.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/to_int_type.pass.cpp
@@ -12,6 +12,8 @@
 
 // static constexpr int_type to_int_type(char_type c);
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <cassert>
 
diff --git a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/types.pass.cpp b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/types.pass.cpp
index 810a142..165b766 100644
--- a/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/types.pass.cpp
+++ b/test/std/strings/char.traits/char.traits.specializations/char.traits.specializations.wchar.t/types.pass.cpp
@@ -16,6 +16,8 @@
 // typedef streampos pos_type;
 // typedef mbstate_t state_type;
 
+// UNSUPPORTED: libcpp-has-no-wide-characters
+
 #include <string>
 #include <type_traits>
 
diff --git a/test/std/strings/string.classes/typedefs.pass.cpp b/test/std/strings/string.classes/typedefs.pass.cpp
index 55717e3..0369f25 100644
--- a/test/std/strings/string.classes/typedefs.pass.cpp
+++ b/test/std/strings/string.classes/typedefs.pass.cpp
@@ -25,7 +25,9 @@
 int main(int, char**)
 {
     static_assert((std::is_same<std::string, std::basic_string<char> >::value), "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert((std::is_same<std::wstring, std::basic_string<wchar_t> >::value), "");
+#endif
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     static_assert((std::is_same<std::u8string, std::basic_string<char8_t> >::value), "");
 #endif
diff --git a/test/std/strings/string.conversions/stod.pass.cpp b/test/std/strings/string.conversions/stod.pass.cpp
index d13b695..2bab34d 100644
--- a/test/std/strings/string.conversions/stod.pass.cpp
+++ b/test/std/strings/string.conversions/stod.pass.cpp
@@ -20,171 +20,140 @@
 
 int main(int, char**)
 {
-    assert(std::stod("0") == 0);
-    assert(std::stod(L"0") == 0);
-    assert(std::stod("-0") == 0);
-    assert(std::stod(L"-0") == 0);
-    assert(std::stod("-10") == -10);
-    assert(std::stod(L"-10.5") == -10.5);
-    assert(std::stod(" 10") == 10);
-    assert(std::stod(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stod("10g", &idx) == 10);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stod(L"10g", &idx) == 10);
-    assert(idx == 2);
+    // char
+    {
+        assert(std::stod("0") == 0);
+        assert(std::stod("-0") == 0);
+        assert(std::stod("-10") == -10);
+        assert(std::stod(" 10") == 10);
+        {
+            size_t idx = 0;
+            assert(std::stod("10g", &idx) == 10);
+            assert(idx == 2);
+        }
+        {
+            size_t idx = 0;
+            assert(std::stod("1.e60", &idx) == 1.e60);
+            assert(idx == 5);
+        }
+        {
+            size_t idx = 0;
+            assert(std::stod("INF", &idx) == INFINITY);
+            assert(idx == 3);
+        }
+        {
+            size_t idx = 0;
+            assert(std::isnan(std::stod("NAN", &idx)));
+            assert(idx == 3);
+        }
+
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
-        assert(std::stod("1.e60", &idx) == 1.e60);
-        assert(idx == 5);
+        {
+            size_t idx = 0;
+            try {
+                assert(std::stod("1.e360", &idx) == INFINITY);
+                assert(false);
+            } catch (const std::out_of_range&) {
+                assert(idx == 0);
+            }
+        }
+        {
+            size_t idx = 0;
+            try {
+                std::stod("", &idx);
+                assert(false);
+            } catch (const std::invalid_argument&) {
+                assert(idx == 0);
+            }
+        }
+        {
+            size_t idx = 0;
+            try {
+                std::stod("  - 8", &idx);
+                assert(false);
+            } catch (const std::invalid_argument&) {
+                assert(idx == 0);
+            }
+        }
+        {
+            size_t idx = 0;
+            try {
+                std::stod("a1", &idx);
+                assert(false);
+            } catch (const std::invalid_argument&) {
+                assert(idx == 0);
+            }
+        }
+#endif // TEST_HAS_NO_EXCEPTIONS
     }
+
+    // wchar_t
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    {
+        assert(std::stod(L"0") == 0);
+        assert(std::stod(L"-0") == 0);
+        assert(std::stod(L"-10.5") == -10.5);
+        assert(std::stod(L" 10") == 10);
+        {
+            size_t idx = 0;
+            assert(std::stod(L"10g", &idx) == 10);
+            assert(idx == 2);
+        }
+        {
+            size_t idx = 0;
+            assert(std::stod(L"1.e60", &idx) == 1.e60);
+            assert(idx == 5);
+        }
+        {
+            size_t idx = 0;
+            assert(std::stod(L"INF", &idx) == INFINITY);
+            assert(idx == 3);
+        }
+        {
+            size_t idx = 0;
+            assert(std::isnan(std::stod(L"NAN", &idx)));
+            assert(idx == 3);
+        }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
+        {
+            size_t idx = 0;
+            try {
+                assert(std::stod(L"1.e360", &idx) == INFINITY);
+                assert(false);
+            } catch (const std::out_of_range&) {
+                assert(idx == 0);
+            }
+        }
+        {
+            size_t idx = 0;
+            try {
+                std::stod(L"", &idx);
+                assert(false);
+            } catch (const std::invalid_argument&) {
+                assert(idx == 0);
+            }
+        }
+        {
+            size_t idx = 0;
+            try {
+                std::stod(L"  - 8", &idx);
+                assert(false);
+            } catch (const std::invalid_argument&) {
+                assert(idx == 0);
+            }
+        }
+        {
+            size_t idx = 0;
+            try {
+                std::stod(L"a1", &idx);
+                assert(false);
+            } catch (const std::invalid_argument&) {
+                assert(idx == 0);
+            }
+        }
+#endif // TEST_HAS_NO_EXCEPTIONS
     }
-    try
-#endif
-    {
-        assert(std::stod(L"1.e60", &idx) == 1.e60);
-        assert(idx == 5);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-    idx = 0;
-    try
-    {
-        assert(std::stod("1.e360", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        assert(std::stod(L"1.e360", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-#endif
-    {
-        assert(std::stod("INF", &idx) == INFINITY);
-        assert(idx == 3);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
-        assert(std::stod(L"INF", &idx) == INFINITY);
-        assert(idx == 3);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
-        assert(std::isnan(std::stod("NAN", &idx)));
-        assert(idx == 3);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
-        assert(std::isnan(std::stod(L"NAN", &idx)));
-        assert(idx == 3);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-    idx = 0;
-    try
-    {
-        std::stod("", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stod(L"", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stod("  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stod(L"  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stod("a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stod(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stof.pass.cpp b/test/std/strings/string.conversions/stof.pass.cpp
index 22dda0b..4f320ea 100644
--- a/test/std/strings/string.conversions/stof.pass.cpp
+++ b/test/std/strings/string.conversions/stof.pass.cpp
@@ -21,167 +21,140 @@
 int main(int, char**)
 {
     assert(std::stof("0") == 0);
-    assert(std::stof(L"0") == 0);
     assert(std::stof("-0") == 0);
-    assert(std::stof(L"-0") == 0);
     assert(std::stof("-10") == -10);
-    assert(std::stof(L"-10.5") == -10.5);
     assert(std::stof(" 10") == 10);
-    assert(std::stof(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stof("10g", &idx) == 10);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stof(L"10g", &idx) == 10);
-    assert(idx == 2);
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    idx = 0;
-    try
     {
-        assert(std::stof("1.e60", &idx) == INFINITY);
-        assert(false);
+        size_t idx = 0;
+        assert(std::stof("10g", &idx) == 10);
+        assert(idx == 2);
     }
-    catch (const std::out_of_range&)
     {
-        assert(idx == 0);
-    }
-    try
-    {
-        assert(std::stof(L"1.e60", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    idx = 0;
-    try
-    {
-        assert(std::stof("1.e360", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        assert(std::stof(L"1.e360", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-#endif
-    {
+        size_t idx = 0;
         assert(std::stof("INF", &idx) == INFINITY);
         assert(idx == 3);
     }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
-        assert(std::stof(L"INF", &idx) == INFINITY);
-        assert(idx == 3);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
+        size_t idx = 0;
         assert(std::isnan(std::stof("NAN", &idx)));
         assert(idx == 3);
     }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
+        size_t idx = 0;
+        try {
+            assert(std::stof("1.e60", &idx) == INFINITY);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
     {
+        size_t idx = 0;
+        try {
+            assert(std::stof("1.e360", &idx) == INFINITY);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stof("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stof("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stof("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stof(L"0") == 0);
+    assert(std::stof(L"-0") == 0);
+    assert(std::stof(L"-10.5") == -10.5);
+    assert(std::stof(L" 10") == 10);
+    {
+        size_t idx = 0;
+        assert(std::stof(L"10g", &idx) == 10);
+        assert(idx == 2);
+    }
+    {
+        size_t idx = 0;
+        assert(std::stof(L"INF", &idx) == INFINITY);
+        assert(idx == 3);
+    }
+    {
+        size_t idx = 0;
         assert(std::isnan(std::stof(L"NAN", &idx)));
         assert(idx == 3);
     }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
+        size_t idx = 0;
+        try {
+            assert(std::stof(L"1.e60", &idx) == INFINITY);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    idx = 0;
-    try
     {
-        std::stof("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            assert(std::stof(L"1.e360", &idx) == INFINITY);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stof(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stof(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stof(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stof(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
-    {
-        std::stof("  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stof(L"  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stof("a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stof(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stoi.pass.cpp b/test/std/strings/string.conversions/stoi.pass.cpp
index b3e4163..d629043 100644
--- a/test/std/strings/string.conversions/stoi.pass.cpp
+++ b/test/std/strings/string.conversions/stoi.pass.cpp
@@ -20,95 +20,102 @@
 int main(int, char**)
 {
     assert(std::stoi("0") == 0);
-    assert(std::stoi(L"0") == 0);
     assert(std::stoi("-0") == 0);
-    assert(std::stoi(L"-0") == 0);
     assert(std::stoi("-10") == -10);
-    assert(std::stoi(L"-10") == -10);
     assert(std::stoi(" 10") == 10);
-    assert(std::stoi(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stoi("10g", &idx, 16) == 16);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stoi(L"10g", &idx, 16) == 16);
-    assert(idx == 2);
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max())
     {
-        try
-        {
+        size_t idx = 0;
+        assert(std::stoi("10g", &idx, 16) == 16);
+        assert(idx == 2);
+    }
+#ifndef TEST_HAS_NO_EXCEPTIONS
+    if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) {
+        size_t idx = 0;
+        try {
             std::stoi("0x100000000", &idx, 16);
             assert(false);
+        } catch (const std::out_of_range&) {
+
         }
-        catch (const std::out_of_range&)
-        {
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stoi("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
         }
-        try
-        {
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stoi("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stoi("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stoi(L"0") == 0);
+    assert(std::stoi(L"-0") == 0);
+    assert(std::stoi(L"-10") == -10);
+    assert(std::stoi(L" 10") == 10);
+    {
+        size_t idx = 0;
+        assert(std::stoi(L"10g", &idx, 16) == 16);
+        assert(idx == 2);
+    }
+#ifndef TEST_HAS_NO_EXCEPTIONS
+    if (std::numeric_limits<long>::max() > std::numeric_limits<int>::max()) {
+        size_t idx = 0;
+        try {
             std::stoi(L"0x100000000", &idx, 16);
             assert(false);
-        }
-        catch (const std::out_of_range&)
-        {
+        } catch (const std::out_of_range&) {
+
         }
     }
-    idx = 0;
-    try
     {
-        std::stoi("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoi(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoi(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoi(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoi(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoi("  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoi(L"  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoi("a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoi(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stol.pass.cpp b/test/std/strings/string.conversions/stol.pass.cpp
index a05a4b1..4196646 100644
--- a/test/std/strings/string.conversions/stol.pass.cpp
+++ b/test/std/strings/string.conversions/stol.pass.cpp
@@ -20,96 +20,104 @@
 int main(int, char**)
 {
     assert(std::stol("0") == 0);
-    assert(std::stol(L"0") == 0);
     assert(std::stol("-0") == 0);
-    assert(std::stol(L"-0") == 0);
     assert(std::stol("-10") == -10);
-    assert(std::stol(L"-10") == -10);
     assert(std::stol(" 10") == 10);
-    assert(std::stol(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stol("10g", &idx, 16) == 16);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stol(L"10g", &idx, 16) == 16);
-    assert(idx == 2);
+    {
+        size_t idx = 0;
+        assert(std::stol("10g", &idx, 16) == 16);
+        assert(idx == 2);
+    }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    idx = 0;
-    try
     {
-        std::stol("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stol("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stol("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stol(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stol("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stol("9999999999999999999999999999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    try
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stol(L"0") == 0);
+    assert(std::stol(L"-0") == 0);
+    assert(std::stol(L"-10") == -10);
+    assert(std::stol(L" 10") == 10);
     {
-        std::stol("  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        assert(std::stol(L"10g", &idx, 16) == 16);
+        assert(idx == 2);
     }
-    catch (const std::invalid_argument&)
+#ifndef TEST_HAS_NO_EXCEPTIONS
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stol(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stol(L"  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stol(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stol(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stol("a1", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stol(L"9999999999999999999999999999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stol(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stol("9999999999999999999999999999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stol(L"9999999999999999999999999999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stold.pass.cpp b/test/std/strings/string.conversions/stold.pass.cpp
index 4b1b1b1..fd228c6 100644
--- a/test/std/strings/string.conversions/stold.pass.cpp
+++ b/test/std/strings/string.conversions/stold.pass.cpp
@@ -21,172 +21,133 @@
 int main(int, char**)
 {
     assert(std::stold("0") == 0);
-    assert(std::stold(L"0") == 0);
     assert(std::stold("-0") == 0);
-    assert(std::stold(L"-0") == 0);
     assert(std::stold("-10") == -10);
-    assert(std::stold(L"-10.5") == -10.5);
     assert(std::stold(" 10") == 10);
-    assert(std::stold(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stold("10g", &idx) == 10);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stold(L"10g", &idx) == 10);
-    assert(idx == 2);
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
     {
+        size_t idx = 0;
+        assert(std::stold("10g", &idx) == 10);
+        assert(idx == 2);
+    }
+    {
+        size_t idx = 0;
         assert(std::stold("1.e60", &idx) == 1.e60L);
         assert(idx == 5);
     }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
-    }
-    try
-#endif
-    {
-        assert(std::stold(L"1.e60", &idx) == 1.e60L);
-        assert(idx == 5);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-    {
-        assert(std::stold("1.e6000", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        assert(std::stold(L"1.e6000", &idx) == INFINITY);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-#endif
-    {
+        size_t idx = 0;
         assert(std::stold("INF", &idx) == INFINITY);
         assert(idx == 3);
     }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
-        assert(std::stold(L"INF", &idx) == INFINITY);
-        assert(idx == 3);
-    }
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
-    {
-        assert(false);
-    }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
-    {
+        size_t idx = 0;
         assert(std::isnan(std::stold("NAN", &idx)));
         assert(idx == 3);
     }
+
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stold("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-#endif
-    idx = 0;
-#ifndef TEST_HAS_NO_EXCEPTIONS
-    try
-#endif
     {
+        size_t idx = 0;
+        try {
+            std::stold("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+    {
+        size_t idx = 0;
+        try {
+            std::stold("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
+    }
+    {
+        size_t idx = 0;
+        try {
+            assert(std::stold("1.e6000", &idx) == INFINITY);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
+    }
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stold(L"0") == 0);
+    assert(std::stold(L"-0") == 0);
+    assert(std::stold(L"-10.5") == -10.5);
+    assert(std::stold(L" 10") == 10);
+    {
+        size_t idx = 0;
+        assert(std::stold(L"10g", &idx) == 10);
+        assert(idx == 2);
+    }
+    {
+        size_t idx = 0;
+        assert(std::stold(L"1.e60", &idx) == 1.e60L);
+        assert(idx == 5);
+    }
+    {
+        size_t idx = 0;
+        assert(std::stold(L"INF", &idx) == INFINITY);
+        assert(idx == 3);
+    }
+    {
+        size_t idx = 0;
         assert(std::isnan(std::stold(L"NAN", &idx)));
         assert(idx == 3);
     }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    catch (const std::out_of_range&)
     {
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stold(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    idx = 0;
-    try
     {
-        std::stold("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stold(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stold(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stold(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            assert(std::stold(L"1.e6000", &idx) == INFINITY);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stold("  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stold(L"  - 8", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stold("a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stold(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stoll.pass.cpp b/test/std/strings/string.conversions/stoll.pass.cpp
index bccf845..a6d53e5 100644
--- a/test/std/strings/string.conversions/stoll.pass.cpp
+++ b/test/std/strings/string.conversions/stoll.pass.cpp
@@ -20,96 +20,104 @@
 int main(int, char**)
 {
     assert(std::stoll("0") == 0);
-    assert(std::stoll(L"0") == 0);
     assert(std::stoll("-0") == 0);
-    assert(std::stoll(L"-0") == 0);
     assert(std::stoll("-10") == -10);
-    assert(std::stoll(L"-10") == -10);
     assert(std::stoll(" 10") == 10);
-    assert(std::stoll(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stoll("10g", &idx, 16) == 16);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stoll(L"10g", &idx, 16) == 16);
-    assert(idx == 2);
+    {
+        size_t idx = 0;
+        assert(std::stoll("10g", &idx, 16) == 16);
+        assert(idx == 2);
+    }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    idx = 0;
-    try
     {
-        std::stoll("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoll("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoll("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoll(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoll("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stoll("99999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    try
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stoll(L"0") == 0);
+    assert(std::stoll(L"-0") == 0);
+    assert(std::stoll(L"-10") == -10);
+    assert(std::stoll(L" 10") == 10);
     {
-        std::stoll("  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        assert(std::stoll(L"10g", &idx, 16) == 16);
+        assert(idx == 2);
     }
-    catch (const std::invalid_argument&)
+#ifndef TEST_HAS_NO_EXCEPTIONS
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoll(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoll(L"  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoll(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoll(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoll("a1", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stoll(L"99999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoll(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stoll("99999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stoll(L"99999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stoul.pass.cpp b/test/std/strings/string.conversions/stoul.pass.cpp
index c620925..37e7f9d 100644
--- a/test/std/strings/string.conversions/stoul.pass.cpp
+++ b/test/std/strings/string.conversions/stoul.pass.cpp
@@ -20,94 +20,102 @@
 int main(int, char**)
 {
     assert(std::stoul("0") == 0);
-    assert(std::stoul(L"0") == 0);
     assert(std::stoul("-0") == 0);
-    assert(std::stoul(L"-0") == 0);
     assert(std::stoul(" 10") == 10);
-    assert(std::stoul(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stoul("10g", &idx, 16) == 16);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stoul(L"10g", &idx, 16) == 16);
-    assert(idx == 2);
+    {
+        size_t idx = 0;
+        assert(std::stoul("10g", &idx, 16) == 16);
+        assert(idx == 2);
+    }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    idx = 0;
-    try
     {
-        std::stoul("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoul("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoul("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoul(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoul("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stoul("9999999999999999999999999999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    try
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stoul(L"0") == 0);
+    assert(std::stoul(L"-0") == 0);
+    assert(std::stoul(L" 10") == 10);
     {
-        std::stoul("  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        assert(std::stoul(L"10g", &idx, 16) == 16);
+        assert(idx == 2);
     }
-    catch (const std::invalid_argument&)
+#ifndef TEST_HAS_NO_EXCEPTIONS
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoul(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoul(L"  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoul(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoul(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoul("a1", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stoul(L"9999999999999999999999999999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoul(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stoul("9999999999999999999999999999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stoul(L"9999999999999999999999999999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/stoull.pass.cpp b/test/std/strings/string.conversions/stoull.pass.cpp
index 803065c..dcfc583 100644
--- a/test/std/strings/string.conversions/stoull.pass.cpp
+++ b/test/std/strings/string.conversions/stoull.pass.cpp
@@ -20,95 +20,102 @@
 int main(int, char**)
 {
     assert(std::stoull("0") == 0);
-    assert(std::stoull(L"0") == 0);
     assert(std::stoull("-0") == 0);
-    assert(std::stoull(L"-0") == 0);
     assert(std::stoull(" 10") == 10);
-    assert(std::stoull(L" 10") == 10);
-    size_t idx = 0;
-    assert(std::stoull("10g", &idx, 16) == 16);
-    assert(idx == 2);
-    idx = 0;
-    assert(std::stoull(L"10g", &idx, 16) == 16);
-    assert(idx == 2);
+    {
+        size_t idx = 0;
+        assert(std::stoull("10g", &idx, 16) == 16);
+        assert(idx == 2);
+    }
 #ifndef TEST_HAS_NO_EXCEPTIONS
-    idx = 0;
-    try
     {
-        std::stoull("", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoull("", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoull("  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    idx = 0;
-    try
     {
-        std::stoull(L"", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoull("a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stoull("9999999999999999999999999999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    try
+#endif // TEST_HAS_NO_EXCEPTIONS
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert(std::stoull(L"0") == 0);
+    assert(std::stoull(L"-0") == 0);
+    assert(std::stoull(L" 10") == 10);
     {
-        std::stoull("  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        assert(std::stoull(L"10g", &idx, 16) == 16);
+        assert(idx == 2);
     }
-    catch (const std::invalid_argument&)
+#ifndef TEST_HAS_NO_EXCEPTIONS
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoull(L"", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoull(L"  - 8", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            std::stoull(L"  - 8", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
     {
-        assert(idx == 0);
+        size_t idx = 0;
+        try {
+            std::stoull(L"a1", &idx);
+            assert(false);
+        } catch (const std::invalid_argument&) {
+            assert(idx == 0);
+        }
     }
-    try
     {
-        std::stoull("a1", &idx);
-        assert(false);
+        size_t idx = 0;
+        try {
+            // LWG#2009 and PR14919
+            std::stoull(L"9999999999999999999999999999999999999999999999999", &idx);
+            assert(false);
+        } catch (const std::out_of_range&) {
+            assert(idx == 0);
+        }
     }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        std::stoull(L"a1", &idx);
-        assert(false);
-    }
-    catch (const std::invalid_argument&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stoull("9999999999999999999999999999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-    try
-    {
-        // LWG#2009 and PR14919
-        std::stoull(L"9999999999999999999999999999999999999999999999999", &idx);
-        assert(false);
-    }
-    catch (const std::out_of_range&)
-    {
-        assert(idx == 0);
-    }
-#endif
+#endif // TEST_HAS_NO_EXCEPTIONS
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
   return 0;
 }
diff --git a/test/std/strings/string.conversions/to_wstring.pass.cpp b/test/std/strings/string.conversions/to_wstring.pass.cpp
index f3b4712..7909cc8 100644
--- a/test/std/strings/string.conversions/to_wstring.pass.cpp
+++ b/test/std/strings/string.conversions/to_wstring.pass.cpp
@@ -6,6 +6,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// XFAIL: libcpp-has-no-wide-characters
+
 // <string>
 
 // wstring to_wstring(int val);
diff --git a/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp b/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp
index 741e2c1..2283cca 100644
--- a/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp
+++ b/test/std/strings/string.view/string.view.capacity/capacity.pass.cpp
@@ -68,17 +68,21 @@
 #endif
     test1<std::u16string_view> ();
     test1<std::u32string_view> ();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test1<std::wstring_view> ();
+#endif
 
     test2 ( "ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
     test2 ( "ABCDE", 5 );
     test2 ( "a", 1 );
     test2 ( "", 0 );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test2 ( L"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
     test2 ( L"ABCDE", 5 );
     test2 ( L"a", 1 );
     test2 ( L"", 0 );
+#endif
 
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test2 ( u8"ABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDEABCDE", 105 );
diff --git a/test/std/strings/string.view/string.view.cons/assign.pass.cpp b/test/std/strings/string.view/string.view.cons/assign.pass.cpp
index 5ca2f45..c80c8e5 100644
--- a/test/std/strings/string.view/string.view.cons/assign.pass.cpp
+++ b/test/std/strings/string.view/string.view.cons/assign.pass.cpp
@@ -35,23 +35,27 @@
     assert( test<std::u8string_view>  (u8"1234"));
 #endif
 #if TEST_STD_VER >= 11
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+#   ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     assert( test<std::u16string_view> ( u"1234"));
     assert( test<std::u32string_view> ( U"1234"));
+#   endif
 #endif
-#endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     assert( test<std::wstring_view>   ( L"1234"));
+#endif
 
 #if TEST_STD_VER > 11
     static_assert( test<std::string_view>    ({  "abc", 3}), "");
-#if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
+#   if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     static_assert( test<std::u8string_view>  ({u8"abc", 3}), "");
-#endif
-#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
+#   endif
+#   ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
     static_assert( test<std::u16string_view> ({ u"abc", 3}), "");
     static_assert( test<std::u32string_view> ({ U"abc", 3}), "");
-#endif
+#   endif
+#   ifndef TEST_HAS_NO_WIDE_CHARACTERS
     static_assert( test<std::wstring_view>   ({ L"abc", 3}), "");
+#   endif
 #endif
 
   return 0;
diff --git a/test/std/strings/string.view/string.view.cons/deduct.pass.cpp b/test/std/strings/string.view/string.view.cons/deduct.pass.cpp
index f838fda..e0ff5f6 100644
--- a/test/std/strings/string.view/string.view.cons/deduct.pass.cpp
+++ b/test/std/strings/string.view/string.view.cons/deduct.pass.cpp
@@ -31,7 +31,9 @@
 
 constexpr void test() {
   test<char, char*>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t, wchar_t*>();
+#endif
   test<char8_t, char8_t*>();
   test<char16_t, char16_t*>();
   test<char32_t, char32_t*>();
diff --git a/test/std/strings/string.view/string.view.cons/default.pass.cpp b/test/std/strings/string.view/string.view.cons/default.pass.cpp
index ad46217..3134210 100644
--- a/test/std/strings/string.view/string.view.cons/default.pass.cpp
+++ b/test/std/strings/string.view/string.view.cons/default.pass.cpp
@@ -41,8 +41,9 @@
     test<std::u8string_view> ();
 #endif
     test<std::u32string_view> ();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wstring_view> ();
-
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp b/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
index a65ba27..e7a9e0a 100644
--- a/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
+++ b/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
@@ -32,7 +32,9 @@
 
 constexpr bool test() {
   test<char, char*>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t, wchar_t*>();
+#endif
   test<char8_t, char8_t*>();
   test<char16_t, char16_t*>();
   test<char32_t, char32_t*>();
diff --git a/test/std/strings/string.view/string.view.cons/from_string.pass.cpp b/test/std/strings/string.view/string.view.cons/from_string.pass.cpp
index 99d3ecb..15f28ab 100644
--- a/test/std/strings/string.view/string.view.cons/from_string.pass.cpp
+++ b/test/std/strings/string.view/string.view.cons/from_string.pass.cpp
@@ -36,9 +36,11 @@
     test ( std::string("") );
     test ( std::string() );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test ( std::wstring(L"QBCDE") );
     test ( std::wstring(L"") );
     test ( std::wstring() );
+#endif
 
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test ( std::u8string{u8"QBCDE"} );
diff --git a/test/std/strings/string.view/string.view.cons/implicit_deduction_guides.pass.cpp b/test/std/strings/string.view/string.view.cons/implicit_deduction_guides.pass.cpp
index 8e1ff27..35c10da 100644
--- a/test/std/strings/string.view/string.view.cons/implicit_deduction_guides.pass.cpp
+++ b/test/std/strings/string.view/string.view.cons/implicit_deduction_guides.pass.cpp
@@ -36,29 +36,35 @@
     ASSERT_SAME_TYPE(decltype(s), std::string_view);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     using WSV = std::basic_string_view<wchar_t, constexpr_char_traits<wchar_t>>;
     const WSV win(L"abcdef");
     std::basic_string_view w(win);
     ASSERT_SAME_TYPE(decltype(w), WSV);
     assert(w == L"abcdef");
+#endif
   }
   { // Testing (3)
     std::basic_string_view s("abc", 2);
     ASSERT_SAME_TYPE(decltype(s), std::string_view);
     assert(s == "ab");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string_view w(L"abcdef", 4);
     ASSERT_SAME_TYPE(decltype(w), std::wstring_view);
     assert(w == L"abcd");
+#endif
   }
   { // Testing (4)
     std::basic_string_view s("abc");
     ASSERT_SAME_TYPE(decltype(s), std::string_view);
     assert(s == "abc");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     std::basic_string_view w(L"abcdef");
     ASSERT_SAME_TYPE(decltype(w), std::wstring_view);
     assert(w == L"abcdef");
+#endif
   }
 
   return 0;
diff --git a/test/std/strings/string.view/string.view.hash/enabled_hashes.pass.cpp b/test/std/strings/string.view/string.view.hash/enabled_hashes.pass.cpp
index ae87bd8..59ca470 100644
--- a/test/std/strings/string.view/string.view.hash/enabled_hashes.pass.cpp
+++ b/test/std/strings/string.view/string.view.hash/enabled_hashes.pass.cpp
@@ -23,7 +23,9 @@
   test_library_hash_specializations_available();
   {
     test_hash_enabled_for_type<std::string_view>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test_hash_enabled_for_type<std::wstring_view>();
+#endif
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test_hash_enabled_for_type<std::u8string_view>();
 #endif
diff --git a/test/std/strings/string.view/string.view.hash/string_view.pass.cpp b/test/std/strings/string.view/string.view.hash/string_view.pass.cpp
index c0742ec..93a69cc 100644
--- a/test/std/strings/string.view/string.view.hash/string_view.pass.cpp
+++ b/test/std/strings/string.view/string.view.hash/string_view.pass.cpp
@@ -65,7 +65,9 @@
     test<std::u16string_view>();
     test<std::u32string_view>();
 #endif
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<std::wstring_view>();
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.io/stream_insert.pass.cpp b/test/std/strings/string.view/string.view.io/stream_insert.pass.cpp
index 2c172d0..fb7dffe 100644
--- a/test/std/strings/string.view/string.view.io/stream_insert.pass.cpp
+++ b/test/std/strings/string.view/string.view.io/stream_insert.pass.cpp
@@ -21,14 +21,11 @@
 
 #include "test_macros.h"
 
-using std::string_view;
-using std::wstring_view;
-
 int main(int, char**)
 {
     {
         std::ostringstream out;
-        string_view sv("some text");
+        std::string_view sv("some text");
         out << sv;
         assert(out.good());
         assert(sv == out.str());
@@ -36,15 +33,16 @@
     {
         std::ostringstream out;
         std::string s("some text");
-        string_view sv(s);
+        std::string_view sv(s);
         out.width(12);
         out << sv;
         assert(out.good());
         assert("   " + s == out.str());
     }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     {
         std::wostringstream out;
-        wstring_view sv(L"some text");
+        std::wstring_view sv(L"some text");
         out << sv;
         assert(out.good());
         assert(sv == out.str());
@@ -52,12 +50,13 @@
     {
         std::wostringstream out;
         std::wstring s(L"some text");
-        wstring_view sv(s);
+        std::wstring_view sv(s);
         out.width(12);
         out << sv;
         assert(out.good());
         assert(L"   " + s == out.str());
     }
+#endif
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.iterators/begin.pass.cpp b/test/std/strings/string.view/string.view.iterators/begin.pass.cpp
index ba700c8..2a610c3 100644
--- a/test/std/strings/string.view/string.view.iterators/begin.pass.cpp
+++ b/test/std/strings/string.view/string.view.iterators/begin.pass.cpp
@@ -47,14 +47,11 @@
 #endif
     typedef std::u16string_view u16string_view;
     typedef std::u32string_view u32string_view;
-    typedef std::wstring_view   wstring_view;
 
     test(string_view   ());
     test(u16string_view());
     test(u32string_view());
-    test(wstring_view  ());
     test(string_view   ( "123"));
-    test(wstring_view  (L"123"));
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test(u8string_view{u8"123"});
 #endif
@@ -63,6 +60,12 @@
     test(u32string_view{U"123"});
 #endif
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    typedef std::wstring_view   wstring_view;
+    test(wstring_view  ());
+    test(wstring_view  (L"123"));
+#endif
+
 #if TEST_STD_VER > 11
     {
     constexpr string_view       sv { "123", 3 };
@@ -71,7 +74,6 @@
 #endif
     constexpr u16string_view u16sv {u"123", 3 };
     constexpr u32string_view u32sv {U"123", 3 };
-    constexpr wstring_view     wsv {L"123", 3 };
 
     static_assert (    *sv.begin() ==    sv[0], "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -79,7 +81,6 @@
 #endif
     static_assert ( *u16sv.begin() == u16sv[0], "" );
     static_assert ( *u32sv.begin() == u32sv[0], "" );
-    static_assert (   *wsv.begin() ==   wsv[0], "" );
 
     static_assert (    *sv.cbegin() ==    sv[0], "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -87,9 +88,16 @@
 #endif
     static_assert ( *u16sv.cbegin() == u16sv[0], "" );
     static_assert ( *u32sv.cbegin() == u32sv[0], "" );
-    static_assert (   *wsv.cbegin() ==   wsv[0], "" );
-    }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+        {
+            constexpr wstring_view     wsv {L"123", 3 };
+            static_assert (   *wsv.begin() ==   wsv[0], "" );
+            static_assert (   *wsv.cbegin() ==   wsv[0], "" );
+        }
 #endif
+    }
+#endif // TEST_STD_VER > 11
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.iterators/end.pass.cpp b/test/std/strings/string.view/string.view.iterators/end.pass.cpp
index 59c29e2..5a52ac5 100644
--- a/test/std/strings/string.view/string.view.iterators/end.pass.cpp
+++ b/test/std/strings/string.view/string.view.iterators/end.pass.cpp
@@ -56,14 +56,11 @@
 #endif
     typedef std::u16string_view u16string_view;
     typedef std::u32string_view u32string_view;
-    typedef std::wstring_view   wstring_view;
 
     test(string_view   ());
     test(u16string_view());
     test(u32string_view());
-    test(wstring_view  ());
     test(string_view   ( "123"));
-    test(wstring_view  (L"123"));
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test(u8string_view{u8"123"});
 #endif
@@ -72,6 +69,12 @@
     test(u32string_view{U"123"});
 #endif
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    typedef std::wstring_view   wstring_view;
+    test(wstring_view  ());
+    test(wstring_view  (L"123"));
+#endif
+
 #if TEST_STD_VER > 11
     {
     constexpr string_view       sv { "123", 3 };
@@ -80,7 +83,6 @@
 #endif
     constexpr u16string_view u16sv {u"123", 3 };
     constexpr u32string_view u32sv {U"123", 3 };
-    constexpr wstring_view     wsv {L"123", 3 };
 
     static_assert (    sv.begin() !=    sv.end(), "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -88,7 +90,6 @@
 #endif
     static_assert ( u16sv.begin() != u16sv.end(), "" );
     static_assert ( u32sv.begin() != u32sv.end(), "" );
-    static_assert (   wsv.begin() !=   wsv.end(), "" );
 
     static_assert (    sv.begin() !=    sv.cend(), "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -96,9 +97,16 @@
 #endif
     static_assert ( u16sv.begin() != u16sv.cend(), "" );
     static_assert ( u32sv.begin() != u32sv.cend(), "" );
-    static_assert (   wsv.begin() !=   wsv.cend(), "" );
-    }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+        {
+            constexpr wstring_view     wsv {L"123", 3 };
+            static_assert (   wsv.begin() !=   wsv.end(), "" );
+            static_assert (   wsv.begin() !=   wsv.cend(), "" );
+        }
 #endif
+    }
+#endif // TEST_STD_VER > 11
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.iterators/rbegin.pass.cpp b/test/std/strings/string.view/string.view.iterators/rbegin.pass.cpp
index a57d7b4..0f3c110 100644
--- a/test/std/strings/string.view/string.view.iterators/rbegin.pass.cpp
+++ b/test/std/strings/string.view/string.view.iterators/rbegin.pass.cpp
@@ -48,14 +48,11 @@
 #endif
     typedef std::u16string_view u16string_view;
     typedef std::u32string_view u32string_view;
-    typedef std::wstring_view   wstring_view;
 
     test(string_view   ());
     test(u16string_view());
     test(u32string_view());
-    test(wstring_view  ());
     test(string_view   ( "123"));
-    test(wstring_view  (L"123"));
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test(u8string_view{u8"123"});
 #endif
@@ -64,6 +61,12 @@
     test(u32string_view{U"123"});
 #endif
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    typedef std::wstring_view   wstring_view;
+    test(wstring_view  ());
+    test(wstring_view  (L"123"));
+#endif
+
 #if TEST_STD_VER > 14
     {
     constexpr string_view       sv { "123", 3 };
@@ -72,7 +75,6 @@
 #endif
     constexpr u16string_view u16sv {u"123", 3 };
     constexpr u32string_view u32sv {U"123", 3 };
-    constexpr wstring_view     wsv {L"123", 3 };
 
     static_assert (    *sv.rbegin() ==    sv[2], "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -80,7 +82,6 @@
 #endif
     static_assert ( *u16sv.rbegin() == u16sv[2], "" );
     static_assert ( *u32sv.rbegin() == u32sv[2], "" );
-    static_assert (   *wsv.rbegin() ==   wsv[2], "" );
 
     static_assert (    *sv.crbegin() ==    sv[2], "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -88,9 +89,16 @@
 #endif
     static_assert ( *u16sv.crbegin() == u16sv[2], "" );
     static_assert ( *u32sv.crbegin() == u32sv[2], "" );
-    static_assert (   *wsv.crbegin() ==   wsv[2], "" );
-    }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+        {
+            constexpr wstring_view     wsv {L"123", 3 };
+            static_assert (   *wsv.rbegin() ==   wsv[2], "" );
+            static_assert (   *wsv.crbegin() ==   wsv[2], "" );
+        }
 #endif
+    }
+#endif // TEST_STD_VER > 14
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.iterators/rend.pass.cpp b/test/std/strings/string.view/string.view.iterators/rend.pass.cpp
index e0db02c..1eb781d 100644
--- a/test/std/strings/string.view/string.view.iterators/rend.pass.cpp
+++ b/test/std/strings/string.view/string.view.iterators/rend.pass.cpp
@@ -56,14 +56,11 @@
 #endif
     typedef std::u16string_view u16string_view;
     typedef std::u32string_view u32string_view;
-    typedef std::wstring_view   wstring_view;
 
     test(string_view   ());
     test(u16string_view());
     test(u32string_view());
-    test(wstring_view  ());
     test(string_view   ( "123"));
-    test(wstring_view  (L"123"));
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
     test(u8string_view{u8"123"});
 #endif
@@ -72,6 +69,12 @@
     test(u32string_view{U"123"});
 #endif
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    typedef std::wstring_view   wstring_view;
+    test(wstring_view  ());
+    test(wstring_view  (L"123"));
+#endif
+
 #if TEST_STD_VER > 14
     {
     constexpr string_view       sv { "123", 3 };
@@ -80,7 +83,6 @@
 #endif
     constexpr u16string_view u16sv {u"123", 3 };
     constexpr u32string_view u32sv {U"123", 3 };
-    constexpr wstring_view     wsv {L"123", 3 };
 
     static_assert (    *--sv.rend() ==    sv[0], "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -88,7 +90,6 @@
 #endif
     static_assert ( *--u16sv.rend() == u16sv[0], "" );
     static_assert ( *--u32sv.rend() == u32sv[0], "" );
-    static_assert (   *--wsv.rend() ==   wsv[0], "" );
 
     static_assert (    *--sv.crend() ==    sv[0], "" );
 #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201811L
@@ -96,9 +97,16 @@
 #endif
     static_assert ( *--u16sv.crend() == u16sv[0], "" );
     static_assert ( *--u32sv.crend() == u32sv[0], "" );
-    static_assert (   *--wsv.crend() ==   wsv[0], "" );
-    }
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+        {
+            constexpr wstring_view     wsv {L"123", 3 };
+            static_assert (   *--wsv.rend() ==   wsv[0], "" );
+            static_assert (   *--wsv.crend() ==   wsv[0], "" );
+        }
 #endif
+    }
+#endif // TEST_STD_VER > 14
 
   return 0;
 }
diff --git a/test/std/strings/string.view/string.view.modifiers/remove_prefix.pass.cpp b/test/std/strings/string.view/string.view.modifiers/remove_prefix.pass.cpp
index 0e33130..cb65cdf 100644
--- a/test/std/strings/string.view/string.view.modifiers/remove_prefix.pass.cpp
+++ b/test/std/strings/string.view/string.view.modifiers/remove_prefix.pass.cpp
@@ -50,9 +50,11 @@
     test ( "a", 1 );
     test ( "", 0 );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test ( L"ABCDE", 5 );
     test ( L"a", 1 );
     test ( L"", 0 );
+#endif
 
 #if TEST_STD_VER >= 11
     test ( u"ABCDE", 5 );
diff --git a/test/std/strings/string.view/string.view.modifiers/remove_suffix.pass.cpp b/test/std/strings/string.view/string.view.modifiers/remove_suffix.pass.cpp
index cab1254..341ea66 100644
--- a/test/std/strings/string.view/string.view.modifiers/remove_suffix.pass.cpp
+++ b/test/std/strings/string.view/string.view.modifiers/remove_suffix.pass.cpp
@@ -51,9 +51,11 @@
     test ( "a", 1 );
     test ( "", 0 );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test ( L"ABCDE", 5 );
     test ( L"a", 1 );
     test ( L"", 0 );
+#endif
 
 #if TEST_STD_VER >= 11
     test ( u"ABCDE", 5 );
diff --git a/test/std/strings/string.view/string.view.modifiers/swap.pass.cpp b/test/std/strings/string.view/string.view.modifiers/swap.pass.cpp
index 0f0ae48..21dfa57 100644
--- a/test/std/strings/string.view/string.view.modifiers/swap.pass.cpp
+++ b/test/std/strings/string.view/string.view.modifiers/swap.pass.cpp
@@ -50,9 +50,11 @@
     test ( "a", 1 );
     test ( "", 0 );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test ( L"ABCDE", 5 );
     test ( L"a", 1 );
     test ( L"", 0 );
+#endif
 
 #if TEST_STD_VER >= 11
     test ( u"ABCDE", 5 );
diff --git a/test/std/strings/string.view/string.view.nonmem/quoted.pass.cpp b/test/std/strings/string.view/string.view.nonmem/quoted.pass.cpp
index 3ad9ae2..3e7f85e 100644
--- a/test/std/strings/string.view/string.view.nonmem/quoted.pass.cpp
+++ b/test/std/strings/string.view/string.view.nonmem/quoted.pass.cpp
@@ -22,12 +22,13 @@
 
 bool is_skipws ( const std::istream *is ) {
     return ( is->flags() & std::ios_base::skipws ) != 0;
-    }
+}
 
-
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 bool is_skipws ( const std::wistream *is ) {
     return ( is->flags() & std::ios_base::skipws ) != 0;
-    }
+}
+#endif
 
 void round_trip ( const char *p ) {
     std::stringstream ss;
@@ -92,7 +93,7 @@
     return s;
 }
 
-
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 void round_trip ( const wchar_t *p ) {
     std::wstringstream ss;
     bool skippingws = is_skipws ( &ss );
@@ -159,6 +160,7 @@
     ss >> std::quoted(s, delim, escape);
     return s;
 }
+#endif // TEST_HAS_NO_WIDE_CHARACTERS
 
 int main(int, char**)
 {
@@ -167,10 +169,12 @@
     round_trip_d  (  "", 'q' );
     round_trip_e  (  "", 'q' );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     round_trip    ( L"" );
     round_trip_ws ( L"" );
     round_trip_d  ( L"", 'q' );
     round_trip_e  ( L"", 'q' );
+#endif
 
     round_trip    (  "Hi" );
     round_trip_ws (  "Hi" );
@@ -179,34 +183,42 @@
     assert ( quote ( "Hi", '!' ) == "!Hi!" );
     assert ( quote ( "Hi!", '!' ) == R"(!Hi\!!)" );
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     round_trip    ( L"Hi" );
     round_trip_ws ( L"Hi" );
     round_trip_d  ( L"Hi", '!' );
     round_trip_e  ( L"Hi", '!' );
     assert ( quote ( L"Hi", '!' )  == L"!Hi!" );
     assert ( quote ( L"Hi!", '!' ) == LR"(!Hi\!!)" );
+#endif
 
     round_trip    (  "Hi Mom" );
     round_trip_ws (  "Hi Mom" );
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     round_trip    ( L"Hi Mom" );
     round_trip_ws ( L"Hi Mom" );
+#endif
 
     assert ( quote (  "" )  ==  "\"\"" );
-    assert ( quote ( L"" )  == L"\"\"" );
     assert ( quote (  "a" ) ==  "\"a\"" );
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert ( quote ( L"" )  == L"\"\"" );
     assert ( quote ( L"a" ) == L"\"a\"" );
+#endif
 
-//  missing end quote - must not hang
+    // missing end quote - must not hang
     assert ( unquote (  "\"abc" ) ==  "abc" );
-    assert ( unquote ( L"\"abc" ) == L"abc" );
-
     assert ( unquote (  "abc" ) == "abc" ); // no delimiter
-    assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
     assert ( unquote (  "abc def" ) ==  "abc" ); // no delimiter
-    assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter
-
     assert ( unquote (  "" ) ==  "" ); // nothing there
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+    assert ( unquote ( L"\"abc" ) == L"abc" );
+    assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
+    assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter
     assert ( unquote ( L"" ) == L"" ); // nothing there
+#endif
 
     return 0;
 }
diff --git a/test/std/strings/string.view/string_view.literals/literal.pass.cpp b/test/std/strings/string.view/string_view.literals/literal.pass.cpp
index 4b209f3..5c34507 100644
--- a/test/std/strings/string.view/string_view.literals/literal.pass.cpp
+++ b/test/std/strings/string.view/string_view.literals/literal.pass.cpp
@@ -27,43 +27,57 @@
 
         ASSERT_SAME_TYPE(decltype(  "Hi"sv), std::string_view);
         ASSERT_SAME_TYPE(decltype(u8"Hi"sv), u8string_view);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         ASSERT_SAME_TYPE(decltype( L"Hi"sv), std::wstring_view);
+#endif
         ASSERT_SAME_TYPE(decltype( u"Hi"sv), std::u16string_view);
         ASSERT_SAME_TYPE(decltype( U"Hi"sv), std::u32string_view);
 
         std::string_view foo;
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         std::wstring_view Lfoo;
+#endif
         u8string_view u8foo;
         std::u16string_view ufoo;
         std::u32string_view Ufoo;
 
         foo  =    ""sv;     assert(  foo.size() == 0);
         u8foo = u8""sv;     assert(u8foo.size() == 0);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         Lfoo  =  L""sv;     assert( Lfoo.size() == 0);
+#endif
         ufoo  =  u""sv;     assert( ufoo.size() == 0);
         Ufoo  =  U""sv;     assert( Ufoo.size() == 0);
 
         foo   =   " "sv;    assert(  foo.size() == 1);
         u8foo = u8" "sv;    assert(u8foo.size() == 1);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         Lfoo  =  L" "sv;    assert( Lfoo.size() == 1);
+#endif
         ufoo  =  u" "sv;    assert( ufoo.size() == 1);
         Ufoo  =  U" "sv;    assert( Ufoo.size() == 1);
 
         foo   =   "ABC"sv;  assert(  foo ==   "ABC");   assert(  foo == std::string_view   (  "ABC"));
         u8foo = u8"ABC"sv;  assert(u8foo == u8"ABC");   assert(u8foo == u8string_view      (u8"ABC"));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         Lfoo  =  L"ABC"sv;  assert( Lfoo ==  L"ABC");   assert( Lfoo == std::wstring_view  ( L"ABC"));
+#endif
         ufoo  =  u"ABC"sv;  assert( ufoo ==  u"ABC");   assert( ufoo == std::u16string_view( u"ABC"));
         Ufoo  =  U"ABC"sv;  assert( Ufoo ==  U"ABC");   assert( Ufoo == std::u32string_view( U"ABC"));
 
         static_assert(  "ABC"sv.size() == 3, "");
         static_assert(u8"ABC"sv.size() == 3, "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         static_assert( L"ABC"sv.size() == 3, "");
+#endif
         static_assert( u"ABC"sv.size() == 3, "");
         static_assert( U"ABC"sv.size() == 3, "");
 
         ASSERT_NOEXCEPT(  "ABC"sv);
         ASSERT_NOEXCEPT(u8"ABC"sv);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         ASSERT_NOEXCEPT( L"ABC"sv);
+#endif
         ASSERT_NOEXCEPT( u"ABC"sv);
         ASSERT_NOEXCEPT( U"ABC"sv);
     }
diff --git a/test/std/strings/string.view/trivially_copyable.compile.pass.cpp b/test/std/strings/string.view/trivially_copyable.compile.pass.cpp
index 934ddbd..6a22864 100644
--- a/test/std/strings/string.view/trivially_copyable.compile.pass.cpp
+++ b/test/std/strings/string.view/trivially_copyable.compile.pass.cpp
@@ -13,8 +13,12 @@
 #include <string_view>
 #include <type_traits>
 
+#include "test_macros.h"
+
 static_assert(std::is_trivially_copyable<std::basic_string_view<char> >::value, "");
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(std::is_trivially_copyable<std::basic_string_view<wchar_t> >::value, "");
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
 static_assert(std::is_trivially_copyable<std::basic_string_view<char8_t> >::value, "");
 #endif
diff --git a/test/std/utilities/format/format.arguments/format.arg.store/class.pass.cpp b/test/std/utilities/format/format.arguments/format.arg.store/class.pass.cpp
index 49b8d88..fe7a42d 100644
--- a/test/std/utilities/format/format.arguments/format.arg.store/class.pass.cpp
+++ b/test/std/utilities/format/format.arguments/format.arg.store/class.pass.cpp
@@ -72,7 +72,9 @@
 
 void test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 }
 
 int main(int, char**) {
diff --git a/test/std/utilities/format/format.arguments/format.arg.store/make_format_args.sh.cpp b/test/std/utilities/format/format.arguments/format.arg.store/make_format_args.sh.cpp
index 009bf72..af174ea 100644
--- a/test/std/utilities/format/format.arguments/format.arg.store/make_format_args.sh.cpp
+++ b/test/std/utilities/format/format.arguments/format.arg.store/make_format_args.sh.cpp
@@ -8,6 +8,7 @@
 // UNSUPPORTED: c++03, c++11, c++14, c++17
 // UNSUPPORTED: libcpp-no-concepts
 // UNSUPPORTED: libcpp-has-no-incomplete-format
+// UNSUPPORTED: libcpp-has-no-wide-characters
 
 // Validate it works regardless of the signedness of `char`.
 // RUN: %{cxx} %{flags} %{compile_flags} -fsigned-char -fsyntax-only %s
diff --git a/test/std/utilities/format/format.arguments/format.arg.store/make_wformat_args.pass.cpp b/test/std/utilities/format/format.arguments/format.arg.store/make_wformat_args.pass.cpp
index d654dea..9b3a567 100644
--- a/test/std/utilities/format/format.arguments/format.arg.store/make_wformat_args.pass.cpp
+++ b/test/std/utilities/format/format.arguments/format.arg.store/make_wformat_args.pass.cpp
@@ -8,6 +8,7 @@
 // UNSUPPORTED: c++03, c++11, c++14, c++17
 // UNSUPPORTED: libcpp-no-concepts
 // UNSUPPORTED: libcpp-has-no-incomplete-format
+// XFAIL: libcpp-has-no-wide-characters
 // TODO FMT Evaluate gcc-11 status
 // UNSUPPORTED: gcc-11
 
diff --git a/test/std/utilities/format/format.arguments/format.args/ctor.pass.cpp b/test/std/utilities/format/format.arguments/format.args/ctor.pass.cpp
index 26a4057..2a73d95 100644
--- a/test/std/utilities/format/format.arguments/format.args/ctor.pass.cpp
+++ b/test/std/utilities/format/format.arguments/format.args/ctor.pass.cpp
@@ -57,7 +57,9 @@
 
 void test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 }
 
 int main(int, char**) {
diff --git a/test/std/utilities/format/format.arguments/format.args/types.compile.pass.cpp b/test/std/utilities/format/format.arguments/format.args/types.compile.pass.cpp
index 356475c..cac83f7 100644
--- a/test/std/utilities/format/format.arguments/format.args/types.compile.pass.cpp
+++ b/test/std/utilities/format/format.arguments/format.args/types.compile.pass.cpp
@@ -25,19 +25,23 @@
 
 static_assert(std::is_same_v<std::format_args,
                              std::basic_format_args<std::format_context>>);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(std::is_same_v<std::wformat_args,
                              std::basic_format_args<std::wformat_context>>);
+#endif
 
 static_assert(std::is_same_v<
               std::format_args_t<std::back_insert_iterator<std::string>, char>,
               std::basic_format_args<std::basic_format_context<
                   std::back_insert_iterator<std::string>, char>>>);
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(
     std::is_same_v<
         std::format_args_t<std::back_insert_iterator<std::wstring>, wchar_t>,
         std::basic_format_args<std::basic_format_context<
             std::back_insert_iterator<std::wstring>, wchar_t>>>);
+#endif
 
 static_assert(
     std::is_same_v<
diff --git a/test/std/utilities/format/format.formatter/format.context/format.context/advance_to.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.context/advance_to.pass.cpp
index eea6800..849b0e0 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.context/advance_to.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.context/advance_to.pass.cpp
@@ -47,9 +47,11 @@
       std::make_format_args<std::basic_format_context<
           std::back_insert_iterator<std::basic_string<char>>, char>>()));
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test(std::basic_format_args(
       std::make_format_args<std::basic_format_context<
           std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>>()));
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test(std::basic_format_args(
       std::make_format_args<std::basic_format_context<
diff --git a/test/std/utilities/format/format.formatter/format.context/format.context/arg.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.context/arg.pass.cpp
index 5157fe7..e345878 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.context/arg.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.context/arg.pass.cpp
@@ -46,7 +46,9 @@
 
 int main(int, char**) {
   test<std::back_insert_iterator<std::basic_string<char>>, char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<std::back_insert_iterator<std::basic_string<char8_t>>, char8_t>();
 #endif
diff --git a/test/std/utilities/format/format.formatter/format.context/format.context/ctor.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.context/ctor.pass.cpp
index 909b61f..6ea2ee8 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.context/ctor.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.context/ctor.pass.cpp
@@ -122,7 +122,9 @@
 
 void test() {
   test<std::back_insert_iterator<std::basic_string<char>>, char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<std::back_insert_iterator<std::basic_string<char8_t>>, char8_t>();
 #endif
diff --git a/test/std/utilities/format/format.formatter/format.context/format.context/locale.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.context/locale.pass.cpp
index 0fe789e..982416f 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.context/locale.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.context/locale.pass.cpp
@@ -78,7 +78,9 @@
 
 void test() {
   test<std::back_insert_iterator<std::basic_string<char>>, char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<std::back_insert_iterator<std::basic_string<char8_t>>, char8_t>();
 #endif
diff --git a/test/std/utilities/format/format.formatter/format.context/format.context/out.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.context/out.pass.cpp
index af4d61f..9c56f05 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.context/out.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.context/out.pass.cpp
@@ -43,9 +43,11 @@
   test(std::basic_format_args(
       std::make_format_args<std::basic_format_context<
           std::back_insert_iterator<std::basic_string<char>>, char>>()));
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test(std::basic_format_args(
       std::make_format_args<std::basic_format_context<
           std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>>()));
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test(std::basic_format_args(
       std::make_format_args<std::basic_format_context<
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.bool.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.bool.pass.cpp
index 41b6f12..162c23d 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.bool.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.bool.pass.cpp
@@ -73,7 +73,9 @@
 
 int main(int, char**) {
   test_boolean<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_boolean<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.c_string.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.c_string.pass.cpp
index ab72914..5e0af39 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.c_string.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.c_string.pass.cpp
@@ -100,8 +100,10 @@
 int main(int, char**) {
   test_char_pointer<char*>();
   test_char_pointer<const char*>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_char_pointer<wchar_t*>();
   test_char_pointer<const wchar_t*>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.char.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.char.pass.cpp
index f0ec2dd..65bca30 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.char.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.char.pass.cpp
@@ -76,8 +76,10 @@
 
 int main(int, char**) {
   test_char_type<char, char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_char_type<char, wchar_t>();
   test_char_type<wchar_t, wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.const_char_array.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.const_char_array.pass.cpp
index b222804..386af84 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.const_char_array.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.const_char_array.pass.cpp
@@ -114,7 +114,9 @@
 
 int main(int, char**) {
   test_array<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_array<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.floating_point.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.floating_point.pass.cpp
index 30708a1..1ba1189 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.floating_point.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.floating_point.pass.cpp
@@ -113,7 +113,9 @@
 
 int main(int, char**) {
   test_all_float_types<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_all_float_types<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.signed_integral.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.signed_integral.pass.cpp
index 526531f..8f2d5af 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.signed_integral.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.signed_integral.pass.cpp
@@ -115,7 +115,9 @@
 
 int main(int, char**) {
   test_all_signed_integral_types<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_all_signed_integral_types<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.string.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.string.pass.cpp
index 6a6de7e..df72c89 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.string.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.string.pass.cpp
@@ -118,7 +118,9 @@
 
 int main(int, char**) {
   test_all_string_types<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_all_string_types<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.unsigned_integral.pass.cpp b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.unsigned_integral.pass.cpp
index f232112..22e330c 100644
--- a/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.unsigned_integral.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/format.formatter.spec/formatter.unsigned_integral.pass.cpp
@@ -103,7 +103,9 @@
 
 int main(int, char**) {
   test_all_unsigned_integral_types<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test_all_unsigned_integral_types<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.formatter/format.context/types.compile.pass.cpp b/test/std/utilities/format/format.formatter/format.context/types.compile.pass.cpp
index eb8d1b7..13eb467 100644
--- a/test/std/utilities/format/format.formatter/format.context/types.compile.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.context/types.compile.pass.cpp
@@ -99,7 +99,9 @@
 
 constexpr void test() {
   test<std::back_insert_iterator<std::basic_string<char>>, char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>();
+#endif
   test<std::back_insert_iterator<std::basic_string<char8_t>>, char8_t>();
   test<std::back_insert_iterator<std::basic_string<char16_t>>, char16_t>();
   test<std::back_insert_iterator<std::basic_string<char32_t>>, char32_t>();
@@ -109,11 +111,13 @@
               std::format_context,
               std::basic_format_context<
                   std::back_insert_iterator<std::basic_string<char>>, char>>);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(
     std::is_same_v<
         std::wformat_context,
         std::basic_format_context<
             std::back_insert_iterator<std::basic_string<wchar_t>>, wchar_t>>);
+#endif
 
 // Required for MSVC internal test runner compatibility.
 int main(int, char**) { return 0; }
diff --git a/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp b/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp
index 7e1a6b6..56e2d06 100644
--- a/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp
+++ b/test/std/utilities/format/format.formatter/format.parse.ctx/types.compile.pass.cpp
@@ -47,7 +47,9 @@
 
 constexpr void test() {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   test<char8_t>();
 #endif
@@ -59,8 +61,10 @@
 
 static_assert(std::is_same_v<std::format_parse_context,
                              std::basic_format_parse_context<char> >);
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 static_assert(std::is_same_v<std::wformat_parse_context,
                              std::basic_format_parse_context<wchar_t> >);
+#endif
 
 // Required for MSVC internal test runner compatibility.
 int main(int, char**) { return 0; }
diff --git a/test/std/utilities/format/format.functions/format.locale.pass.cpp b/test/std/utilities/format/format.functions/format.locale.pass.cpp
index 1fb6c3b..4da2f2e 100644
--- a/test/std/utilities/format/format.functions/format.locale.pass.cpp
+++ b/test/std/utilities/format/format.functions/format.locale.pass.cpp
@@ -66,10 +66,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/format.pass.cpp b/test/std/utilities/format/format.functions/format.pass.cpp
index 392a412..b6dffd8 100644
--- a/test/std/utilities/format/format.functions/format.pass.cpp
+++ b/test/std/utilities/format/format.functions/format.pass.cpp
@@ -75,10 +75,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/format_tests.h b/test/std/utilities/format/format.functions/format_tests.h
index 3da2edf..a2d71a9 100644
--- a/test/std/utilities/format/format.functions/format_tests.h
+++ b/test/std/utilities/format/format.functions/format_tests.h
@@ -1100,10 +1100,12 @@
 #endif
 }
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 template <class TestFunction>
 void format_tests_char_to_wchar_t(TestFunction check) {
   using CharT = wchar_t;
   check(STR("hello 09azA"), STR("hello {}{}{}{}{}"), '0', '9', 'a', 'z', 'A');
 }
+#endif
 
 #endif
diff --git a/test/std/utilities/format/format.functions/format_to.locale.pass.cpp b/test/std/utilities/format/format.functions/format_to.locale.pass.cpp
index 461f541..98356fd 100644
--- a/test/std/utilities/format/format.functions/format_to.locale.pass.cpp
+++ b/test/std/utilities/format/format.functions/format_to.locale.pass.cpp
@@ -81,10 +81,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/format_to.pass.cpp b/test/std/utilities/format/format.functions/format_to.pass.cpp
index fc988be..d8d24f9 100644
--- a/test/std/utilities/format/format.functions/format_to.pass.cpp
+++ b/test/std/utilities/format/format.functions/format_to.pass.cpp
@@ -82,10 +82,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/format_to_n.locale.pass.cpp b/test/std/utilities/format/format.functions/format_to_n.locale.pass.cpp
index 40c502a..206450b 100644
--- a/test/std/utilities/format/format.functions/format_to_n.locale.pass.cpp
+++ b/test/std/utilities/format/format.functions/format_to_n.locale.pass.cpp
@@ -119,10 +119,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/format_to_n.pass.cpp b/test/std/utilities/format/format.functions/format_to_n.pass.cpp
index 98b7c0c..6f69af4 100644
--- a/test/std/utilities/format/format.functions/format_to_n.pass.cpp
+++ b/test/std/utilities/format/format.functions/format_to_n.pass.cpp
@@ -115,10 +115,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/formatted_size.locale.pass.cpp b/test/std/utilities/format/format.functions/formatted_size.locale.pass.cpp
index 26f6ef9..b31170b 100644
--- a/test/std/utilities/format/format.functions/formatted_size.locale.pass.cpp
+++ b/test/std/utilities/format/format.functions/formatted_size.locale.pass.cpp
@@ -54,10 +54,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/formatted_size.pass.cpp b/test/std/utilities/format/format.functions/formatted_size.pass.cpp
index 3ba3776..befb4ce 100644
--- a/test/std/utilities/format/format.functions/formatted_size.pass.cpp
+++ b/test/std/utilities/format/format.functions/formatted_size.pass.cpp
@@ -51,10 +51,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/locale-specific_form.pass.cpp b/test/std/utilities/format/format.functions/locale-specific_form.pass.cpp
index eda3723..2d660c6 100644
--- a/test/std/utilities/format/format.functions/locale-specific_form.pass.cpp
+++ b/test/std/utilities/format/format.functions/locale-specific_form.pass.cpp
@@ -105,6 +105,7 @@
   char do_thousands_sep() const override { return '_'; }
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 template <>
 struct numpunct<wchar_t> : std::numpunct<wchar_t> {
   string_type do_truename() const override { return L"yes"; }
@@ -113,6 +114,7 @@
   std::string do_grouping() const override { return "\1\2\3\2\1"; };
   wchar_t do_thousands_sep() const override { return L'_'; }
 };
+#endif
 
 template <class CharT, class... Args>
 void test(std::basic_string<CharT> expected, std::basic_string<CharT> fmt,
@@ -237,12 +239,14 @@
   string_type do_falsename() const override { return "ungültig"; }
 };
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 template <>
 struct numpunct_unicode<wchar_t> : std::numpunct<wchar_t> {
   string_type do_truename() const override { return L"gültig"; }
   string_type do_falsename() const override { return L"ungültig"; }
 };
 #endif
+#endif // _LIBCPP_HAS_NO_UNICODE
 
 template <class CharT>
 void test_bool() {
@@ -613,7 +617,9 @@
 
 int main(int, char**) {
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/vformat.locale.pass.cpp b/test/std/utilities/format/format.functions/vformat.locale.pass.cpp
index 5a0fcab..08e067e 100644
--- a/test/std/utilities/format/format.functions/vformat.locale.pass.cpp
+++ b/test/std/utilities/format/format.functions/vformat.locale.pass.cpp
@@ -58,10 +58,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/vformat.pass.cpp b/test/std/utilities/format/format.functions/vformat.pass.cpp
index b1e7025..c4df0a8 100644
--- a/test/std/utilities/format/format.functions/vformat.pass.cpp
+++ b/test/std/utilities/format/format.functions/vformat.pass.cpp
@@ -55,10 +55,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/vformat_to.locale.pass.cpp b/test/std/utilities/format/format.functions/vformat_to.locale.pass.cpp
index a006a2b..5a57adf 100644
--- a/test/std/utilities/format/format.functions/vformat_to.locale.pass.cpp
+++ b/test/std/utilities/format/format.functions/vformat_to.locale.pass.cpp
@@ -97,10 +97,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/format/format.functions/vformat_to.pass.cpp b/test/std/utilities/format/format.functions/vformat_to.pass.cpp
index 1c243e6..1deca0d 100644
--- a/test/std/utilities/format/format.functions/vformat_to.pass.cpp
+++ b/test/std/utilities/format/format.functions/vformat_to.pass.cpp
@@ -100,10 +100,12 @@
 };
 
 int main(int, char**) {
-  format_tests_char_to_wchar_t(test);
-
   format_tests<char>(test, test_exception);
+
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  format_tests_char_to_wchar_t(test);
   format_tests<wchar_t>(test, test_exception);
+#endif
 
   return 0;
 }
diff --git a/test/std/utilities/function.objects/unord.hash/integral.pass.cpp b/test/std/utilities/function.objects/unord.hash/integral.pass.cpp
index 031aa30..4168b16 100644
--- a/test/std/utilities/function.objects/unord.hash/integral.pass.cpp
+++ b/test/std/utilities/function.objects/unord.hash/integral.pass.cpp
@@ -58,7 +58,9 @@
     test<unsigned char>();
     test<char16_t>();
     test<char32_t>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
     test<wchar_t>();
+#endif
     test<short>();
     test<unsigned short>();
     test<int>();
diff --git a/test/std/utilities/template.bitset/bitset.members/to_string.pass.cpp b/test/std/utilities/template.bitset/bitset.members/to_string.pass.cpp
index 0f364ec..2ad9c2d 100644
--- a/test/std/utilities/template.bitset/bitset.members/to_string.pass.cpp
+++ b/test/std/utilities/template.bitset/bitset.members/to_string.pass.cpp
@@ -47,6 +47,7 @@
     std::vector<std::bitset<N> > const cases = get_test_cases<N>();
     for (std::size_t c = 0; c != cases.size(); ++c) {
         std::bitset<N> const v = cases[c];
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >();
             check_equal(s, v, L'0', L'1');
@@ -55,6 +56,7 @@
             std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >();
             check_equal(s, v, L'0', L'1');
         }
+#endif
         {
             std::string s = v.template to_string<char>();
             check_equal(s, v, '0', '1');
@@ -63,6 +65,7 @@
             std::string s = v.to_string();
             check_equal(s, v, '0', '1');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >('0');
             check_equal(s, v, L'0', L'1');
@@ -71,6 +74,7 @@
             std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >('0');
             check_equal(s, v, L'0', L'1');
         }
+#endif
         {
             std::string s = v.template to_string<char>('0');
             check_equal(s, v, '0', '1');
@@ -79,6 +83,7 @@
             std::string s = v.to_string('0');
             check_equal(s, v, '0', '1');
         }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
         {
             std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >('0', '1');
             check_equal(s, v, L'0', L'1');
@@ -87,6 +92,7 @@
             std::wstring s = v.template to_string<wchar_t, std::char_traits<wchar_t> >('0', '1');
             check_equal(s, v, L'0', L'1');
         }
+#endif
         {
             std::string s = v.template to_string<char>('0', '1');
             check_equal(s, v, '0', '1');
diff --git a/test/std/utilities/template.bitset/includes.pass.cpp b/test/std/utilities/template.bitset/includes.pass.cpp
index 43d9e08..b58dac5 100644
--- a/test/std/utilities/template.bitset/includes.pass.cpp
+++ b/test/std/utilities/template.bitset/includes.pass.cpp
@@ -21,7 +21,6 @@
   }
   { // test for <iosfwd>
     test_typedef<std::ios>();
-    test_typedef<std::wios>();
     test_typedef<std::istream>();
     test_typedef<std::ostream>();
     test_typedef<std::iostream>();
diff --git a/test/std/utilities/utility/utility.intcmp/intcmp.fail.cpp b/test/std/utilities/utility/utility.intcmp/intcmp.fail.cpp
index b5d68c8..66e35ad 100644
--- a/test/std/utilities/utility/utility.intcmp/intcmp.fail.cpp
+++ b/test/std/utilities/utility/utility.intcmp/intcmp.fail.cpp
@@ -51,83 +51,85 @@
 
 template <class T>
 constexpr void test() {
-  std::cmp_equal(T(), T()); // expected-error11{{no matching function for call to 'cmp_equal'}}
-  std::cmp_equal(T(), int()); // expected-error11{{no matching function for call to 'cmp_equal'}}
-  std::cmp_equal(int(), T()); // expected-error11{{no matching function for call to 'cmp_equal'}}
-  std::cmp_not_equal(T(), T()); // expected-error11{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_not_equal(T(), int()); // expected-error11{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_not_equal(int(), T()); // expected-error11{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_less(T(), T()); // expected-error11{{no matching function for call to 'cmp_less'}}
-  std::cmp_less(T(), int()); // expected-error11{{no matching function for call to 'cmp_less'}}
-  std::cmp_less(int(), T()); // expected-error11{{no matching function for call to 'cmp_less'}}
-  std::cmp_less_equal(T(), T()); // expected-error11{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_less_equal(T(), int()); // expected-error11{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_less_equal(int(), T()); // expected-error11{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_greater(T(), T()); // expected-error11{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater(T(), int()); // expected-error11{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater(int(), T()); // expected-error11{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater_equal(T(), T()); // expected-error11{{no matching function for call to 'cmp_greater_equal'}}
-  std::cmp_greater_equal(T(), int()); // expected-error11{{no matching function for call to 'cmp_greater_equal'}}
-  std::cmp_greater_equal(int(), T()); // expected-error11{{no matching function for call to 'cmp_greater_equal'}}
-  std::in_range<T>(int()); // expected-error11{{no matching function for call to 'in_range'}}
-  std::in_range<int>(T()); // expected-error11{{no matching function for call to 'in_range'}}
+  std::cmp_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_not_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_not_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_not_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_less(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_less_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_less_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_greater(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater_equal(T(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater_equal'}}
+  std::cmp_greater_equal(T(), int()); // expected-error 10-11 {{no matching function for call to 'cmp_greater_equal'}}
+  std::cmp_greater_equal(int(), T()); // expected-error 10-11 {{no matching function for call to 'cmp_greater_equal'}}
+  std::in_range<T>(int()); // expected-error 10-11 {{no matching function for call to 'in_range'}}
+  std::in_range<int>(T()); // expected-error 10-11 {{no matching function for call to 'in_range'}}
 }
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
 template <class T>
 constexpr void test_char8t() {
-  std::cmp_equal(T(), T()); // expected-error1{{no matching function for call to 'cmp_equal'}}
-  std::cmp_equal(T(), int()); // expected-error1{{no matching function for call to 'cmp_equal'}}
-  std::cmp_equal(int(), T()); // expected-error1{{no matching function for call to 'cmp_equal'}}
-  std::cmp_not_equal(T(), T()); // expected-error1{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_not_equal(T(), int()); // expected-error1{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_not_equal(int(), T()); // expected-error1{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_less(T(), T()); // expected-error1{{no matching function for call to 'cmp_less'}}
-  std::cmp_less(T(), int()); // expected-error1{{no matching function for call to 'cmp_less'}}
-  std::cmp_less(int(), T()); // expected-error1{{no matching function for call to 'cmp_less'}}
-  std::cmp_less_equal(T(), T()); // expected-error1{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_less_equal(T(), int()); // expected-error1{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_less_equal(int(), T()); // expected-error1{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_greater(T(), T()); // expected-error1{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater(T(), int()); // expected-error1{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater(int(), T()); // expected-error1{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater_equal(T(), T()); // expected-error1{{no matching function for call to 'cmp_greater_equal'}}
-  std::cmp_greater_equal(T(), int()); // expected-error1{{no matching function for call to 'cmp_greater_equal'}}
-  std::cmp_greater_equal(int(), T()); // expected-error1{{no matching function for call to 'cmp_greater_equal'}}
-  std::in_range<T>(int()); // expected-error1{{no matching function for call to 'in_range'}}
-  std::in_range<int>(T()); // expected-error1{{no matching function for call to 'in_range'}}
+  std::cmp_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_not_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_not_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_not_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_less(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_less_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_less_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_greater(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater_equal(T(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater_equal'}}
+  std::cmp_greater_equal(T(), int()); // expected-error 1 {{no matching function for call to 'cmp_greater_equal'}}
+  std::cmp_greater_equal(int(), T()); // expected-error 1 {{no matching function for call to 'cmp_greater_equal'}}
+  std::in_range<T>(int()); // expected-error 1 {{no matching function for call to 'in_range'}}
+  std::in_range<int>(T()); // expected-error 1 {{no matching function for call to 'in_range'}}
 }
 #endif // _LIBCPP_HAS_NO_CHAR8_T
 
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
 template <class T>
 constexpr void test_uchars() {
-  std::cmp_equal(T(), T()); // expected-error2{{no matching function for call to 'cmp_equal'}}
-  std::cmp_equal(T(), int()); // expected-error2{{no matching function for call to 'cmp_equal'}}
-  std::cmp_equal(int(), T()); // expected-error2{{no matching function for call to 'cmp_equal'}}
-  std::cmp_not_equal(T(), T()); // expected-error2{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_not_equal(T(), int()); // expected-error2{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_not_equal(int(), T()); // expected-error2{{no matching function for call to 'cmp_not_equal'}}
-  std::cmp_less(T(), T()); // expected-error2{{no matching function for call to 'cmp_less'}}
-  std::cmp_less(T(), int()); // expected-error2{{no matching function for call to 'cmp_less'}}
-  std::cmp_less(int(), T()); // expected-error2{{no matching function for call to 'cmp_less'}}
-  std::cmp_less_equal(T(), T()); // expected-error2{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_less_equal(T(), int()); // expected-error2{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_less_equal(int(), T()); // expected-error2{{no matching function for call to 'cmp_less_equal'}}
-  std::cmp_greater(T(), T()); // expected-error2{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater(T(), int()); // expected-error2{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater(int(), T()); // expected-error2{{no matching function for call to 'cmp_greater'}}
-  std::cmp_greater_equal(T(), T()); // expected-error2{{no matching function for call to 'cmp_greater_equal'}}
-  std::cmp_greater_equal(T(), int()); // expected-error2{{no matching function for call to 'cmp_greater_equal'}}
-  std::cmp_greater_equal(int(), T()); // expected-error2{{no matching function for call to 'cmp_greater_equal'}}
-  std::in_range<T>(int()); // expected-error2{{no matching function for call to 'in_range'}}
-  std::in_range<int>(T()); // expected-error2{{no matching function for call to 'in_range'}}
+  std::cmp_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_equal'}}
+  std::cmp_not_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_not_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_not_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_not_equal'}}
+  std::cmp_less(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_less'}}
+  std::cmp_less_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_less_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_less_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_less_equal'}}
+  std::cmp_greater(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater'}}
+  std::cmp_greater_equal(T(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater_equal'}}
+  std::cmp_greater_equal(T(), int()); // expected-error 2 {{no matching function for call to 'cmp_greater_equal'}}
+  std::cmp_greater_equal(int(), T()); // expected-error 2 {{no matching function for call to 'cmp_greater_equal'}}
+  std::in_range<T>(int()); // expected-error 2 {{no matching function for call to 'in_range'}}
+  std::in_range<int>(T()); // expected-error 2 {{no matching function for call to 'in_range'}}
 }
 #endif // _LIBCPP_HAS_NO_UNICODE_CHARS
 
 int main() {
   test<bool>();
   test<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   test<wchar_t>();
+#endif
   test<float>();
   test<double>();
   test<long double>();
diff --git a/test/support/make_string.h b/test/support/make_string.h
index 1ff3dc4..d417d7e 100644
--- a/test/support/make_string.h
+++ b/test/support/make_string.h
@@ -24,16 +24,24 @@
 #define CHAR8_ONLY(x)
 #endif
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+# define IF_WIDE_CHARACTERS(...) __VA_ARGS__
+#else
+# define IF_WIDE_CHARACTERS(...) /* nothing */
+#endif
+
 #define MKSTR(Str)                                                             \
   {                                                                            \
-    Str, TEST_CONCAT(L, Str),                                                  \
+    Str, IF_WIDE_CHARACTERS(TEST_CONCAT(L, Str),)                              \
         CHAR8_ONLY(TEST_CONCAT(u8, Str)) TEST_CONCAT(u, Str),                  \
         TEST_CONCAT(U, Str)                                                    \
   }
 
 struct MultiStringType {
   const char* s;
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   const wchar_t* w;
+#endif
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
   const char8_t* u8;
 #endif
@@ -41,7 +49,9 @@
   const char32_t* u32;
 
   constexpr operator const char*() const { return s; }
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   constexpr operator const wchar_t*() const { return w; }
+#endif
 #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
   constexpr operator const char8_t*() const { return u8; }
 #endif
diff --git a/test/support/poisoned_hash_helper.h b/test/support/poisoned_hash_helper.h
index fbd35ca..bb4b70b 100644
--- a/test/support/poisoned_hash_helper.h
+++ b/test/support/poisoned_hash_helper.h
@@ -57,7 +57,9 @@
       char,
       signed char,
       unsigned char,
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
       wchar_t,
+#endif
 #ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
       char16_t,
       char32_t,
diff --git a/test/support/test.support/make_string_header.pass.cpp b/test/support/test.support/make_string_header.pass.cpp
index c35cc52..63c9149 100644
--- a/test/support/test.support/make_string_header.pass.cpp
+++ b/test/support/test.support/make_string_header.pass.cpp
@@ -23,11 +23,13 @@
     ==   " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN"
              "OPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
 
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
   assert(MAKE_STRING(wchar_t,
          " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN"
              "OPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~")
     ==  L" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN"
              "OPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
+#endif
 #ifndef _LIBCPP_HAS_NO_CHAR8_T
   assert(MAKE_STRING(char8_t,
          " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN"
diff --git a/test/support/test_macros.h b/test/support/test_macros.h
index feb6e8a..53fb990 100644
--- a/test/support/test_macros.h
+++ b/test/support/test_macros.h
@@ -348,6 +348,11 @@
 #define TEST_WIN_NO_FILESYSTEM_PERMS_NONE
 #endif
 
+// Support for carving out parts of the test suite, like removing wide characters, etc.
+#if defined(_LIBCPP_HAS_NO_WIDE_CHARACTERS)
+#   define TEST_HAS_NO_WIDE_CHARACTERS
+#endif
+
 #if defined(__GNUC__)
 #pragma GCC diagnostic pop
 #endif
diff --git a/utils/ci/buildkite-pipeline.yml b/utils/ci/buildkite-pipeline.yml
index 08b4d3c..67b5525 100644
--- a/utils/ci/buildkite-pipeline.yml
+++ b/utils/ci/buildkite-pipeline.yml
@@ -465,6 +465,19 @@
           limit: 2
     timeout_in_minutes: 120
 
+  - label: "No wide characters"
+    command: "libcxx/utils/ci/run-buildbot generic-no-wide-characters"
+    artifact_paths:
+      - "**/test-results.xml"
+    agents:
+      queue: "libcxx-builders"
+      os: "linux"
+    retry:
+      automatic:
+        - exit_status: -1  # Agent was lost
+          limit: 2
+    timeout_in_minutes: 120
+
   # Other non-testing CI jobs
   - label: "Benchmarks"
     command: "libcxx/utils/ci/run-buildbot benchmarks"
diff --git a/utils/ci/run-buildbot b/utils/ci/run-buildbot
index a3e6b78..1a90a52 100755
--- a/utils/ci/run-buildbot
+++ b/utils/ci/run-buildbot
@@ -364,6 +364,12 @@
                    -DLIBCXX_TEST_CONFIG="llvm-libc++-shared.cfg.in"
     check-runtimes
 ;;
+generic-no-wide-characters)
+    clean
+    generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Generic-no-wide-characters.cmake" \
+                   -DLIBCXX_TEST_CONFIG="llvm-libc++-shared.cfg.in"
+    check-runtimes
+;;
 x86_64-apple-system)
     clean
     generate-cmake -C "${MONOREPO_ROOT}/libcxx/cmake/caches/Apple.cmake" \
diff --git a/utils/generate_header_tests.py b/utils/generate_header_tests.py
index e081914..19e7278 100755
--- a/utils/generate_header_tests.py
+++ b/utils/generate_header_tests.py
@@ -50,6 +50,11 @@
     "streambuf": ["ifndef _LIBCPP_HAS_NO_LOCALIZATION"],
     "strstream": ["ifndef _LIBCPP_HAS_NO_LOCALIZATION"],
 
+    "wctype.h": ["ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS"],
+    "cwctype": ["ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS"],
+    "cwchar": ["ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS"],
+    "wchar.h": ["ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS"],
+
     "experimental/coroutine": ["if defined(__cpp_coroutines)"],
     "experimental/regex": ["ifndef _LIBCPP_HAS_NO_LOCALIZATION"],
 }
diff --git a/utils/libcxx/test/features.py b/utils/libcxx/test/features.py
index 1204304..fe2aa14 100644
--- a/utils/libcxx/test/features.py
+++ b/utils/libcxx/test/features.py
@@ -100,6 +100,7 @@
   '_LIBCPP_HAS_NO_FILESYSTEM_LIBRARY': 'libcpp-has-no-filesystem-library',
   '_LIBCPP_HAS_NO_RANDOM_DEVICE': 'libcpp-has-no-random-device',
   '_LIBCPP_HAS_NO_LOCALIZATION': 'libcpp-has-no-localization',
+  '_LIBCPP_HAS_NO_WIDE_CHARACTERS': 'libcpp-has-no-wide-characters',
   '_LIBCPP_HAS_NO_INCOMPLETE_FORMAT': 'libcpp-has-no-incomplete-format',
   '_LIBCPP_HAS_NO_INCOMPLETE_RANGES': 'libcpp-has-no-incomplete-ranges',
   '_LIBCPP_HAS_NO_UNICODE': 'libcpp-has-no-unicode',