From abd06b4c9be0a8cf3a69b2b745ef2b112cac83c8 Mon Sep 17 00:00:00 2001 From: Ed Schouten Date: Thu, 26 Mar 2015 14:35:46 +0000 Subject: [PATCH] Make the presence of stdin and stdout optional. The idea behind Nuxi CloudABI is that it is targeted at (but not limited to) running networked services in a sandboxed environment. The model behind stdin, stdout and stderr is strongly focused on interactive tools in a command shell. CloudABI does not support the notion of stdin and stdout, as 'standard input/output' does not apply to services. The concept of stderr does makes sense though, as services do need some mechanism to log error messages in a uniform way. This patch extends libc++ in such a way that std::cin and std::cout and the associated / functions can be disabled through the flags _LIBCPP_HAS_NO_STDIN and _LIBCPP_HAS_NO_STDOUT, respectively. At the same time it attempts to clean up src/iostream.cpp a bit. Instead of using a single array of mbstate_t objects and hardcoding the array indices, it creates separate objects that declared next to the iostream objects and their buffers. The code is also restructured by interleaving the construction and setup of c* and wc* objects. That way it is more obvious that this is done identically. The c* and wc* objects already have separate unit tests. Make use of this fact by adding XFAILs in case libcpp-has-no-std* is set. That way the tests work in both directions. If stdin or stdout is disabled, these tests will therefore test for the absence of c* and wc*. Differential Revision: http://reviews.llvm.org/D8340 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@233275 91177308-0d34-0410-b5e6-96231b3b80d8 --- CMakeLists.txt | 12 +++++ include/__config | 7 +++ include/cstdio | 45 ++++++++++--------- include/cwchar | 20 ++++++--- include/iostream | 10 +++-- src/iostream.cpp | 14 ++++++ test/CMakeLists.txt | 2 + test/libcxx/test/config.py | 14 ++++++ test/lit.site.cfg.in | 2 + .../file.streams/c.files/cstdio.pass.cpp | 45 ++++++++++--------- .../narrow.stream.objects/cerr.pass.cpp | 4 ++ .../narrow.stream.objects/cin.pass.cpp | 6 +++ .../narrow.stream.objects/cout.pass.cpp | 2 + .../wide.stream.objects/wcerr.pass.cpp | 4 ++ .../wide.stream.objects/wcin.pass.cpp | 6 +++ .../wide.stream.objects/wcout.pass.cpp | 2 + test/std/strings/c.strings/cwchar.pass.cpp | 18 +++++--- 17 files changed, 158 insertions(+), 55 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07373572..82a35e0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,6 +55,8 @@ option(LIBCXX_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF) option(LIBCXX_ENABLE_CXX1Y "Enable -std=c++1y and use of c++1y language features if the compiler supports it." OFF) option(LIBCXX_ENABLE_SHARED "Build libc++ as a shared library." ON) option(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE "Build libc++ with support for the global filesystem namespace." ON) +option(LIBCXX_ENABLE_STDIN "Build libc++ with support for stdin/std::cin." ON) +option(LIBCXX_ENABLE_STDOUT "Build libc++ with support for stdout/std::cout." ON) option(LIBCXX_ENABLE_THREADS "Build libc++ with support for threads." ON) option(LIBCXX_BUILD_32_BITS "Build 32 bit libc++" OFF) option(LIBCXX_ENABLE_MONOTONIC_CLOCK @@ -259,6 +261,16 @@ if (NOT LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE) add_definitions(-D_LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE) endif() +# LIBCXX_ENABLE_STDIN configuration +if (NOT LIBCXX_ENABLE_STDIN) + add_definitions(-D_LIBCPP_HAS_NO_STDIN) +endif() + +# LIBCXX_ENABLE_STDOUT configuration +if (NOT LIBCXX_ENABLE_STDOUT) + add_definitions(-D_LIBCPP_HAS_NO_STDOUT) +endif() + # LIBCXX_ENABLE_THREADS configuration if (NOT LIBCXX_ENABLE_THREADS) add_definitions(-D_LIBCPP_HAS_NO_THREADS) diff --git a/include/__config b/include/__config index 33c386b1..97c66c85 100644 --- a/include/__config +++ b/include/__config @@ -740,6 +740,13 @@ extern "C" void __sanitizer_annotate_contiguous_container( #define _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE #endif +// CloudABI is intended for running networked services. Processes do not +// have standard input and output channels. +#ifdef __CloudABI__ +#define _LIBCPP_HAS_NO_STDIN +#define _LIBCPP_HAS_NO_STDOUT +#endif + #if defined(__ANDROID__) || defined(__CloudABI__) #define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE #endif diff --git a/include/cstdio b/include/cstdio index 8c4e627f..d8ba6c2e 100644 --- a/include/cstdio +++ b/include/cstdio @@ -144,34 +144,20 @@ using ::FILE; using ::fpos_t; using ::size_t; -#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE -using ::remove; -using ::rename; -using ::tmpfile; -using ::tmpnam; -#endif using ::fclose; using ::fflush; -#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE -using ::fopen; -using ::freopen; -#endif using ::setbuf; using ::setvbuf; using ::fprintf; using ::fscanf; -using ::printf; -using ::scanf; using ::snprintf; using ::sprintf; using ::sscanf; #ifndef _LIBCPP_MSVCRT using ::vfprintf; using ::vfscanf; -using ::vscanf; using ::vsscanf; #endif // _LIBCPP_MSVCRT -using ::vprintf; using ::vsnprintf; using ::vsprintf; using ::fgetc; @@ -179,13 +165,7 @@ using ::fgets; using ::fputc; using ::fputs; using ::getc; -using ::getchar; -#if _LIBCPP_STD_VER <= 11 -using ::gets; -#endif using ::putc; -using ::putchar; -using ::puts; using ::ungetc; using ::fread; using ::fwrite; @@ -199,6 +179,31 @@ using ::feof; using ::ferror; using ::perror; +#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE +using ::fopen; +using ::freopen; +using ::remove; +using ::rename; +using ::tmpfile; +using ::tmpnam; +#endif + +#ifndef _LIBCPP_HAS_NO_STDIN +using ::getchar; +#if _LIBCPP_STD_VER <= 11 +using ::gets; +#endif +using ::scanf; +using ::vscanf; +#endif + +#ifndef _LIBCPP_HAS_NO_STDOUT +using ::printf; +using ::putchar; +using ::puts; +using ::vprintf; +#endif + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_CSTDIO diff --git a/include/cwchar b/include/cwchar index 9f51587c..797a1777 100644 --- a/include/cwchar +++ b/include/cwchar @@ -126,24 +126,18 @@ using ::fwscanf; using ::swprintf; using ::vfwprintf; using ::vswprintf; -using ::vwprintf; #ifndef _LIBCPP_MSVCRT using ::swscanf; using ::vfwscanf; using ::vswscanf; -using ::vwscanf; #endif // _LIBCPP_MSVCRT -using ::wprintf; -using ::wscanf; using ::fgetwc; using ::fgetws; using ::fputwc; using ::fputws; using ::fwide; using ::getwc; -using ::getwchar; using ::putwc; -using ::putwchar; using ::ungetwc; using ::wcstod; #ifndef _LIBCPP_MSVCRT @@ -212,6 +206,20 @@ using ::wcrtomb; using ::mbsrtowcs; using ::wcsrtombs; +#ifndef _LIBCPP_HAS_NO_STDIN +using ::getwchar; +#ifndef _LIBCPP_MSVCRT +using ::vwscanf; +#endif // _LIBCPP_MSVCRT +using ::wscanf; +#endif + +#ifndef _LIBCPP_HAS_NO_STDOUT +using ::putwchar; +using ::vwprintf; +using ::wprintf; +#endif + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_CWCHAR diff --git a/include/iostream b/include/iostream index ddf24841..136a8497 100644 --- a/include/iostream +++ b/include/iostream @@ -46,13 +46,17 @@ extern wostream wclog; _LIBCPP_BEGIN_NAMESPACE_STD +#ifndef _LIBCPP_HAS_NO_STDIN extern _LIBCPP_FUNC_VIS istream cin; -extern _LIBCPP_FUNC_VIS ostream cout; -extern _LIBCPP_FUNC_VIS ostream cerr; -extern _LIBCPP_FUNC_VIS ostream clog; extern _LIBCPP_FUNC_VIS wistream wcin; +#endif +#ifndef _LIBCPP_HAS_NO_STDOUT +extern _LIBCPP_FUNC_VIS ostream cout; extern _LIBCPP_FUNC_VIS wostream wcout; +#endif +extern _LIBCPP_FUNC_VIS ostream cerr; extern _LIBCPP_FUNC_VIS wostream wcerr; +extern _LIBCPP_FUNC_VIS ostream clog; extern _LIBCPP_FUNC_VIS wostream wclog; _LIBCPP_END_NAMESPACE_STD diff --git a/src/iostream.cpp b/src/iostream.cpp index e404535a..e073aec6 100644 --- a/src/iostream.cpp +++ b/src/iostream.cpp @@ -13,19 +13,23 @@ _LIBCPP_BEGIN_NAMESPACE_STD +#ifndef _LIBCPP_HAS_NO_STDIN _ALIGNAS_TYPE (istream) _LIBCPP_FUNC_VIS char cin [sizeof(istream)]; _ALIGNAS_TYPE (__stdinbuf ) static char __cin [sizeof(__stdinbuf )]; static mbstate_t mb_cin; _ALIGNAS_TYPE (wistream) _LIBCPP_FUNC_VIS char wcin [sizeof(wistream)]; _ALIGNAS_TYPE (__stdinbuf ) static char __wcin [sizeof(__stdinbuf )]; static mbstate_t mb_wcin; +#endif +#ifndef _LIBCPP_HAS_NO_STDOUT _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cout[sizeof(ostream)]; _ALIGNAS_TYPE (__stdoutbuf) static char __cout[sizeof(__stdoutbuf)]; static mbstate_t mb_cout; _ALIGNAS_TYPE (wostream) _LIBCPP_FUNC_VIS char wcout[sizeof(wostream)]; _ALIGNAS_TYPE (__stdoutbuf) static char __wcout[sizeof(__stdoutbuf)]; static mbstate_t mb_wcout; +#endif _ALIGNAS_TYPE (ostream) _LIBCPP_FUNC_VIS char cerr[sizeof(ostream)]; _ALIGNAS_TYPE (__stdoutbuf) static char __cerr[sizeof(__stdoutbuf)]; @@ -41,29 +45,39 @@ ios_base::Init __start_std_streams; ios_base::Init::Init() { +#ifndef _LIBCPP_HAS_NO_STDIN istream* cin_ptr = ::new(cin) istream(::new(__cin) __stdinbuf (stdin, &mb_cin)); wistream* wcin_ptr = ::new(wcin) wistream(::new(__wcin) __stdinbuf (stdin, &mb_wcin)); +#endif +#ifndef _LIBCPP_HAS_NO_STDOUT ostream* cout_ptr = ::new(cout) ostream(::new(__cout) __stdoutbuf(stdout, &mb_cout)); wostream* wcout_ptr = ::new(wcout) wostream(::new(__wcout) __stdoutbuf(stdout, &mb_wcout)); +#endif ostream* cerr_ptr = ::new(cerr) ostream(::new(__cerr) __stdoutbuf(stderr, &mb_cerr)); ::new(clog) ostream(cerr_ptr->rdbuf()); wostream* wcerr_ptr = ::new(wcerr) wostream(::new(__wcerr) __stdoutbuf(stderr, &mb_wcerr)); ::new(wclog) wostream(wcerr_ptr->rdbuf()); +#if !defined(_LIBCPP_HAS_NO_STDIN) && !defined(_LIBCPP_HAS_NO_STDOUT) cin_ptr->tie(cout_ptr); wcin_ptr->tie(wcout_ptr); +#endif _VSTD::unitbuf(*cerr_ptr); _VSTD::unitbuf(*wcerr_ptr); +#ifndef _LIBCPP_HAS_NO_STDOUT cerr_ptr->tie(cout_ptr); wcerr_ptr->tie(wcout_ptr); +#endif } ios_base::Init::~Init() { +#ifndef _LIBCPP_HAS_NO_STDOUT ostream* cout_ptr = reinterpret_cast(cout); wostream* wcout_ptr = reinterpret_cast(wcout); cout_ptr->flush(); wcout_ptr->flush(); +#endif ostream* clog_ptr = reinterpret_cast(clog); wostream* wclog_ptr = reinterpret_cast(wclog); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index cb78fcf2..707acd1d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -43,6 +43,8 @@ if (LIT_EXECUTABLE) pythonize_bool(LIBCXX_ENABLE_SHARED) pythonize_bool(LIBCXX_BUILD_32_BITS) pythonize_bool(LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE) + pythonize_bool(LIBCXX_ENABLE_STDIN) + pythonize_bool(LIBCXX_ENABLE_STDOUT) pythonize_bool(LIBCXX_ENABLE_THREADS) pythonize_bool(LIBCXX_ENABLE_MONOTONIC_CLOCK) # The tests shouldn't link to any ABI library when it has been linked into diff --git a/test/libcxx/test/config.py b/test/libcxx/test/config.py index 71cc9f01..b86a1ef4 100644 --- a/test/libcxx/test/config.py +++ b/test/libcxx/test/config.py @@ -349,6 +349,8 @@ class Configuration(object): self.configure_compile_flags_exceptions() self.configure_compile_flags_rtti() self.configure_compile_flags_no_global_filesystem_namespace() + self.configure_compile_flags_no_stdin() + self.configure_compile_flags_no_stdout() enable_32bit = self.get_lit_bool('enable_32bit', False) if enable_32bit: self.cxx.flags += ['-m32'] @@ -406,6 +408,18 @@ class Configuration(object): self.cxx.compile_flags += [ '-D_LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE'] + def configure_compile_flags_no_stdin(self): + enable_stdin = self.get_lit_bool('enable_stdin', True) + if not enable_stdin: + self.config.available_features.add('libcpp-has-no-stdin') + self.cxx.compile_flags += ['-D_LIBCPP_HAS_NO_STDIN'] + + def configure_compile_flags_no_stdout(self): + enable_stdout = self.get_lit_bool('enable_stdout', True) + if not enable_stdout: + self.config.available_features.add('libcpp-has-no-stdout') + self.cxx.compile_flags += ['-D_LIBCPP_HAS_NO_STDOUT'] + def configure_compile_flags_no_threads(self): self.cxx.compile_flags += ['-D_LIBCPP_HAS_NO_THREADS'] self.config.available_features.add('libcpp-has-no-threads') diff --git a/test/lit.site.cfg.in b/test/lit.site.cfg.in index db79581f..31eb73be 100644 --- a/test/lit.site.cfg.in +++ b/test/lit.site.cfg.in @@ -9,6 +9,8 @@ config.enable_rtti = "@LIBCXX_ENABLE_RTTI@" config.enable_shared = "@LIBCXX_ENABLE_SHARED@" config.enable_32bit = "@LIBCXX_BUILD_32_BITS@" config.enable_global_filesystem_namespace = "@LIBCXX_ENABLE_GLOBAL_FILESYSTEM_NAMESPACE@" +config.enable_stdin = "@LIBCXX_ENABLE_STDIN@" +config.enable_stdout = "@LIBCXX_ENABLE_STDOUT@" config.enable_threads = "@LIBCXX_ENABLE_THREADS@" config.enable_monotonic_clock = "@LIBCXX_ENABLE_MONOTONIC_CLOCK@" config.cxx_abi = "@LIBCXX_CXX_ABI_LIBNAME@" diff --git a/test/std/input.output/file.streams/c.files/cstdio.pass.cpp b/test/std/input.output/file.streams/c.files/cstdio.pass.cpp index 2ea09bc7..ec4ad8a3 100644 --- a/test/std/input.output/file.streams/c.files/cstdio.pass.cpp +++ b/test/std/input.output/file.streams/c.files/cstdio.pass.cpp @@ -88,31 +88,17 @@ int main() std::size_t s = 0; char* cp = 0; std::va_list va; -#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); -#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); -#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); -#endif static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); @@ -121,13 +107,7 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); -#if _LIBCPP_STD_VER <= 11 - static_assert((std::is_same::value), ""); -#endif static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); @@ -140,4 +120,29 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + +#ifndef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +#endif + +#ifndef _LIBCPP_HAS_NO_STDIN + static_assert((std::is_same::value), ""); +#if _LIBCPP_STD_VER <= 11 + static_assert((std::is_same::value), ""); +#endif + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +#endif + +#ifndef _LIBCPP_HAS_NO_STDOUT + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +#endif } diff --git a/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.pass.cpp b/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.pass.cpp index 9206d173..cdf53f86 100644 --- a/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.pass.cpp +++ b/test/std/input.output/iostream.objects/narrow.stream.objects/cerr.pass.cpp @@ -18,8 +18,12 @@ int main() { #if 0 std::cerr << "Hello World!\n"; +#else +#ifdef _LIBCPP_HAS_NO_STDOUT + assert(std::cerr.tie() == NULL); #else assert(std::cerr.tie() == &std::cout); +#endif assert(std::cerr.flags() & std::ios_base::unitbuf); #endif // 0 } diff --git a/test/std/input.output/iostream.objects/narrow.stream.objects/cin.pass.cpp b/test/std/input.output/iostream.objects/narrow.stream.objects/cin.pass.cpp index 3481598a..1ce04ffb 100644 --- a/test/std/input.output/iostream.objects/narrow.stream.objects/cin.pass.cpp +++ b/test/std/input.output/iostream.objects/narrow.stream.objects/cin.pass.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +// XFAIL: libcpp-has-no-stdin + // // istream cin; @@ -23,6 +25,10 @@ int main() std::cin >> i; std::cout << "The number is : " << i << '\n'; #else // 0 +#ifdef _LIBCPP_HAS_NO_STDOUT + assert(std::cin.tie() == NULL); +#else assert(std::cin.tie() == &std::cout); #endif +#endif } diff --git a/test/std/input.output/iostream.objects/narrow.stream.objects/cout.pass.cpp b/test/std/input.output/iostream.objects/narrow.stream.objects/cout.pass.cpp index 6000ae27..e5887e16 100644 --- a/test/std/input.output/iostream.objects/narrow.stream.objects/cout.pass.cpp +++ b/test/std/input.output/iostream.objects/narrow.stream.objects/cout.pass.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +// XFAIL: libcpp-has-no-stdout + // // istream cout; diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.pass.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.pass.cpp index 19a1dcdc..b0507816 100644 --- a/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.pass.cpp +++ b/test/std/input.output/iostream.objects/wide.stream.objects/wcerr.pass.cpp @@ -18,8 +18,12 @@ int main() { #if 0 std::wcerr << L"Hello World!\n"; +#else +#ifdef _LIBCPP_HAS_NO_STDOUT + assert(std::wcerr.tie() == NULL); #else assert(std::wcerr.tie() == &std::wcout); +#endif assert(std::wcerr.flags() & std::ios_base::unitbuf); #endif // 0 } diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wcin.pass.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wcin.pass.cpp index 90a56685..6abd6afa 100644 --- a/test/std/input.output/iostream.objects/wide.stream.objects/wcin.pass.cpp +++ b/test/std/input.output/iostream.objects/wide.stream.objects/wcin.pass.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +// XFAIL: libcpp-has-no-stdin + // // istream wcin; @@ -23,6 +25,10 @@ int main() std::wcin >> i; std::wcout << L"The number is : " << i << L'\n'; #else // 0 +#ifdef _LIBCPP_HAS_NO_STDOUT + assert(std::wcin.tie() == NULL); +#else assert(std::wcin.tie() == &std::wcout); #endif +#endif } diff --git a/test/std/input.output/iostream.objects/wide.stream.objects/wcout.pass.cpp b/test/std/input.output/iostream.objects/wide.stream.objects/wcout.pass.cpp index 7a546aa5..6543e0aa 100644 --- a/test/std/input.output/iostream.objects/wide.stream.objects/wcout.pass.cpp +++ b/test/std/input.output/iostream.objects/wide.stream.objects/wcout.pass.cpp @@ -7,6 +7,8 @@ // //===----------------------------------------------------------------------===// +// XFAIL: libcpp-has-no-stdout + // // istream wcout; diff --git a/test/std/strings/c.strings/cwchar.pass.cpp b/test/std/strings/c.strings/cwchar.pass.cpp index d0481b70..c3d868fb 100644 --- a/test/std/strings/c.strings/cwchar.pass.cpp +++ b/test/std/strings/c.strings/cwchar.pass.cpp @@ -50,19 +50,13 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); - static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); @@ -106,4 +100,16 @@ int main() static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); static_assert((std::is_same::value), ""); + +#ifndef _LIBCPP_HAS_NO_STDIN + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +#endif + +#ifndef _LIBCPP_HAS_NO_STDOUT + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); + static_assert((std::is_same::value), ""); +#endif }