Make the filesystem::path constructors SFINAE away for void* arguments, instead of giving an error due to iterator_traits<void*>::reference.
PR libstdc++/90454.cc path construction from void* * include/bits/fs_path.h (path::_Path): Use remove_pointer so that pointers to void are rejected as well as void. * include/experimental/bits/fs_path.h (path::_Path): Likewise. * testsuite/27_io/filesystem/path/construct/80762.cc: Also check pointers to void. * testsuite/experimental/filesystem/path/construct/80762.cc: Likewise. Tested powerpc64le-linux and x86_64-linux, committed to trunk.
commit 8f5ae78f657a521d506fd1d1ce6d70520461deb0 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon May 13 20:53:09 2019 +0100 PR libstdc++/90454.cc path construction from void* Make the filesystem::path constructors SFINAE away for void* arguments, instead of giving an error due to iterator_traits<void*>::reference. PR libstdc++/90454.cc path construction from void* * include/bits/fs_path.h (path::_Path): Use remove_pointer so that pointers to void are rejected as well as void. * include/experimental/bits/fs_path.h (path::_Path): Likewise. * testsuite/27_io/filesystem/path/construct/80762.cc: Also check pointers to void. * testsuite/experimental/filesystem/path/construct/80762.cc: Likewise. diff --git a/libstdc++-v3/include/bits/fs_path.h b/libstdc++-v3/include/bits/fs_path.h index d1ad11a60c4..cec35614b42 100644 --- a/libstdc++-v3/include/bits/fs_path.h +++ b/libstdc++-v3/include/bits/fs_path.h @@ -115,7 +115,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 template<typename _Tp1, typename _Tp2 = void> using _Path = typename std::enable_if<__and_<__not_<is_same<remove_cv_t<_Tp1>, path>>, - __not_<is_void<_Tp1>>, + __not_<is_void<remove_pointer_t<_Tp1>>>, __constructible_from<_Tp1, _Tp2>>::value, path>::type; diff --git a/libstdc++-v3/include/experimental/bits/fs_path.h b/libstdc++-v3/include/experimental/bits/fs_path.h index f81f33ca161..588f06822be 100644 --- a/libstdc++-v3/include/experimental/bits/fs_path.h +++ b/libstdc++-v3/include/experimental/bits/fs_path.h @@ -128,11 +128,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 : decltype(__is_path_src(std::declval<_Source>(), 0)) { }; - template<typename _Tp1, typename _Tp2 = void> + template<typename _Tp1, typename _Tp2 = void, + typename _Tp1_nocv = typename remove_cv<_Tp1>::type, + typename _Tp1_noptr = typename remove_pointer<_Tp1>::type> using _Path = typename - std::enable_if<__and_<__not_<is_same<typename remove_cv<_Tp1>::type, - path>>, - __not_<is_void<_Tp1>>, + std::enable_if<__and_<__not_<is_same<_Tp1_nocv, path>>, + __not_<is_void<_Tp1_noptr>>, __constructible_from<_Tp1, _Tp2>>::value, path>::type; diff --git a/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc b/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc index 71cdaa9d969..e22e3deb56e 100644 --- a/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc +++ b/libstdc++-v3/testsuite/27_io/filesystem/path/construct/80762.cc @@ -22,8 +22,18 @@ using std::filesystem::path; +// PR libstdc++/80762.cc static_assert( !std::is_constructible_v<path, void> ); static_assert( !std::is_constructible_v<path, volatile path> ); static_assert( !std::is_constructible_v<path, volatile path&> ); static_assert( !std::is_constructible_v<path, const volatile path> ); static_assert( !std::is_constructible_v<path, const volatile path&> ); + +// PR libstdc++/90454.cc +static_assert( !std::is_constructible_v<path, void*> ); +static_assert( !std::is_constructible_v<path, const void*> ); +static_assert( !std::is_constructible_v<path, volatile void*> ); +static_assert( !std::is_constructible_v<path, const volatile void*> ); +static_assert( !std::is_constructible_v<path, void*&> ); +static_assert( !std::is_constructible_v<path, void* const&> ); +static_assert( !std::is_constructible_v<path, const void* const&> ); diff --git a/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc index fa4a64feb3e..98dadabcffb 100644 --- a/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc +++ b/libstdc++-v3/testsuite/experimental/filesystem/path/construct/80762.cc @@ -22,8 +22,18 @@ using std::experimental::filesystem::path; +// PR libstdc++/80762.cc static_assert( !std::is_constructible<path, void>::value, "" ); static_assert( !std::is_constructible<path, volatile path>::value, "" ); static_assert( !std::is_constructible<path, volatile path&>::value, "" ); static_assert( !std::is_constructible<path, const volatile path>::value, "" ); static_assert( !std::is_constructible<path, const volatile path&>::value, "" ); + +// PR libstdc++/90454.cc +static_assert( !std::is_constructible<path, void*>::value, "" ); +static_assert( !std::is_constructible<path, const void*>::value, "" ); +static_assert( !std::is_constructible<path, volatile void*>::value, "" ); +static_assert( !std::is_constructible<path, const volatile void*>::value, "" ); +static_assert( !std::is_constructible<path, void*&>::value, "" ); +static_assert( !std::is_constructible<path, void* const&>::value, "" ); +static_assert( !std::is_constructible<path, const void* const&>::value, "" );