This guards all uses of wchar_t with _GLIBCXX_USE_WCHAR_T.
There's also a second patch that improves a testsuite helper function slightly. Tested powerpc64le-linux, x86_64dragonfly, powerpc-aix. Committed to trunk.
commit e765e9d79405c7979f656460b995e6237900eea3 Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Oct 2 18:07:27 2015 +0100 Allow Filesystem TS to compile without wchar_t * include/bits/locale_conv.h [!_GLIBCXX_USE_WCHAR_T] (__do_str_codecvt, __str_codecvt_in, __str_codecvt_out): Enable. * include/experimental/fs_path.h [!_GLIBCXX_USE_WCHAR_T] (path::wstring, path::generic_wstring): Disable. * src/filesystem/path.cc (path::_S_convert_loc) [!_GLIBCXX_USE_WCHAR_T]: Skip conversion. * testsuite/experimental/filesystem/path/assign/assign.cc: Check for wchar_t support. * testsuite/experimental/filesystem/path/concat/strings.cc: Likewise. * testsuite/experimental/filesystem/path/construct/range.cc: Likewise. diff --git a/libstdc++-v3/include/bits/locale_conv.h b/libstdc++-v3/include/bits/locale_conv.h index 146f78b..16b4875 100644 --- a/libstdc++-v3/include/bits/locale_conv.h +++ b/libstdc++-v3/include/bits/locale_conv.h @@ -44,8 +44,6 @@ namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION -#ifdef _GLIBCXX_USE_WCHAR_T - /** * @addtogroup locales * @{ @@ -157,6 +155,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __str_codecvt_out(__first, __last, __outstr, __cvt, __state, __n); } +#ifdef _GLIBCXX_USE_WCHAR_T + _GLIBCXX_BEGIN_NAMESPACE_CXX11 /// String conversions @@ -533,10 +533,10 @@ _GLIBCXX_END_NAMESPACE_CXX11 bool _M_always_noconv; }; - /// @} group locales - #endif // _GLIBCXX_USE_WCHAR_T + /// @} group locales + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/include/experimental/fs_path.h b/libstdc++-v3/include/experimental/fs_path.h index 5daef12..40462a6 100644 --- a/libstdc++-v3/include/experimental/fs_path.h +++ b/libstdc++-v3/include/experimental/fs_path.h @@ -279,7 +279,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 string(const _Allocator& __a = _Allocator()) const; std::string string() const; +#if _GLIBCXX_USE_WCHAR_T std::wstring wstring() const; +#endif std::string u8string() const; std::u16string u16string() const; std::u32string u32string() const; @@ -291,7 +293,9 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 generic_string(const _Allocator& __a = _Allocator()) const; std::string generic_string() const; +#if _GLIBCXX_USE_WCHAR_T std::wstring generic_wstring() const; +#endif std::string generic_u8string() const; std::u16string generic_u16string() const; std::u32string generic_u32string() const; @@ -828,8 +832,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 inline std::string path::string() const { return string<char>(); } +#if _GLIBCXX_USE_WCHAR_T inline std::wstring path::wstring() const { return string<wchar_t>(); } +#endif inline std::string path::u8string() const @@ -865,8 +871,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 inline std::string path::generic_string() const { return string(); } +#if _GLIBCXX_USE_WCHAR_T inline std::wstring path::generic_wstring() const { return wstring(); } +#endif inline std::string path::generic_u8string() const { return u8string(); } diff --git a/libstdc++-v3/src/filesystem/path.cc b/libstdc++-v3/src/filesystem/path.cc index a5441b9..e85c9fc 100644 --- a/libstdc++-v3/src/filesystem/path.cc +++ b/libstdc++-v3/src/filesystem/path.cc @@ -437,8 +437,9 @@ path::_M_trim() path::string_type path::_S_convert_loc(const char* __first, const char* __last, - const std::locale& __loc) + const std::locale& __loc) { +#if _GLIBCXX_USE_WCHAR_T auto& __cvt = std::use_facet<codecvt<wchar_t, char, mbstate_t>>(__loc); basic_string<wchar_t> __ws; if (!__str_codecvt_in(__first, __last, __ws, __cvt)) @@ -450,6 +451,9 @@ path::_S_convert_loc(const char* __first, const char* __last, #else return _Cvt<wchar_t>::_S_convert(__ws.data(), __ws.data() + __ws.size()); #endif +#else + return {__first, __last}; +#endif } std::size_t diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/assign/assign.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/assign/assign.cc index 6fd24a7..fe4f96c 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/assign/assign.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/assign/assign.cc @@ -36,6 +36,7 @@ test01() p2 = s.c_str(); compare_paths(p0, p2); +#if _GLIBCXX_USE_WCHAR_T std::wstring ws(s.begin(), s.end()); p3 = ws; @@ -43,6 +44,7 @@ test01() p4 = ws.c_str(); compare_paths(p0, p4); +#endif } } @@ -65,6 +67,7 @@ test02() p4.assign( s.c_str(), s.c_str() + s.size() ); compare_paths(p0, p4); +#if _GLIBCXX_USE_WCHAR_T std::wstring ws(s.begin(), s.end()); p5.assign(ws); @@ -78,6 +81,7 @@ test02() p8.assign( ws.c_str(), ws.c_str() + ws.size() ); compare_paths(p0, p8); +#endif } } diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/concat/strings.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/concat/strings.cc index e75e790..61ef7e4 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/concat/strings.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/concat/strings.cc @@ -35,7 +35,11 @@ test01() VERIFY( p.filename() == "foobar" ); p += '/'; VERIFY( p.parent_path() == "/foobar" && p.filename() == "." ); +#if _GLIBCXX_USE_WCHAR_T p += L"baz.txt"; +#else + p += "baz.txt"; +#endif VERIFY( p.filename() == "baz.txt" ); p.concat("/dir/"); VERIFY( p.parent_path() == "/foobar/baz.txt/dir" && p.filename() == "." ); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/construct/range.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/range.cc index 03e5085..2e892291 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/construct/range.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/range.cc @@ -37,19 +37,22 @@ test01() path p3( s.c_str() ); path p4( s.c_str(), s.c_str() + s.size() ); + compare_paths(p1, p2); + compare_paths(p1, p3); + compare_paths(p1, p4); + +#if _GLIBCXX_USE_WCHAR_T std::wstring ws(s.begin(), s.end()); path p5 = ws; path p6( ws.begin(), ws.end() ); path p7( ws.c_str() ); path p8( ws.c_str(), ws.c_str() + ws.size() ); - compare_paths(p1, p2); - compare_paths(p1, p3); - compare_paths(p1, p4); compare_paths(p1, p5); compare_paths(p1, p6); compare_paths(p1, p7); compare_paths(p1, p8); +#endif } } commit 00e2e9e7053d2d557e832da2055b8ae220f65c74 Author: Jonathan Wakely <jwak...@redhat.com> Date: Fri Oct 2 17:38:08 2015 +0100 * testsuite/util/testsuite_fs.h (nonexistent_path): Use less generic name for paths. Prefer snprintf to sprintf. diff --git a/libstdc++-v3/testsuite/util/testsuite_fs.h b/libstdc++-v3/testsuite/util/testsuite_fs.h index 524972e..44aef11 100644 --- a/libstdc++-v3/testsuite/util/testsuite_fs.h +++ b/libstdc++-v3/testsuite/util/testsuite_fs.h @@ -73,7 +73,7 @@ namespace __gnu_test { std::experimental::filesystem::path p; #if defined(_GNU_SOURCE) || _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200112L - char tmp[] = "test.XXXXXX"; + char tmp[] = "filesystem-ts-test.XXXXXX"; int fd = ::mkstemp(tmp); if (fd == -1) throw std::experimental::filesystem::filesystem_error("mkstemp failed", @@ -83,7 +83,11 @@ namespace __gnu_test p = tmp; #else char buf[64]; - std::sprintf(buf, "test.%lu", (unsigned long)::getpid()); +#if _GLIBCXX_USE_C99 + std::snprintf(buf, 64, "filesystem-ts-test.%lu", (unsigned long)::getpid()); +#else + std::sprintf(buf, "filesystem-ts-test.%lu", (unsigned long)::getpid()); +#endif p = buf; #endif return p;