From 7fcdbdd21d6adc14421bc8de439bf91b58eae6d1 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 2 Oct 2015 20:38:38 +0100 Subject: [PATCH] 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. From-SVN: r228417 --- libstdc++-v3/ChangeLog | 11 +++++++++++ libstdc++-v3/include/bits/locale_conv.h | 8 ++++---- libstdc++-v3/include/experimental/fs_path.h | 8 ++++++++ libstdc++-v3/src/filesystem/path.cc | 6 +++++- .../experimental/filesystem/path/assign/assign.cc | 4 ++++ .../experimental/filesystem/path/concat/strings.cc | 4 ++++ .../experimental/filesystem/path/construct/range.cc | 9 ++++++--- 7 files changed, 42 insertions(+), 8 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 287768e4132..57b9f470bf5 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,16 @@ 2015-10-02 Jonathan Wakely + * 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. + * testsuite/util/testsuite_fs.h (nonexistent_path): Use less generic name for paths. Prefer snprintf to sprintf. diff --git a/libstdc++-v3/include/bits/locale_conv.h b/libstdc++-v3/include/bits/locale_conv.h index 146f78b38d0..16b48758e77 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 5daef12191d..40462a6ab19 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(); } +#if _GLIBCXX_USE_WCHAR_T inline std::wstring path::wstring() const { return string(); } +#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 a5441b95c9b..e85c9fccd9a 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>(__loc); basic_string __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::_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 6fd24a77cf3..fe4f96cde9b 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 e75e790a491..61ef7e40cfc 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 03e50854772..2e8922913cf 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 } } -- 2.30.2