diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-04-30 14:07:28 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-04-30 14:33:19 +0100 |
commit | aa475c4ac80733f85ba47b109fc1900f05e810e2 (patch) | |
tree | d8a24aef9026d5d67e999a1884510e487567867e /libstdc++-v3/testsuite/27_io/basic_istream | |
parent | 0d501c338548152f9d2728d383eec3e9cef16784 (diff) | |
download | gcc-aa475c4ac80733f85ba47b109fc1900f05e810e2.zip gcc-aa475c4ac80733f85ba47b109fc1900f05e810e2.tar.gz gcc-aa475c4ac80733f85ba47b109fc1900f05e810e2.tar.bz2 |
libstdc++: Implement LWG 1203 for rvalue iostreams
This implements the resolution of LWG 1203 so that the constraints for
rvalue stream insertion/extraction are simpler, and the return type is
the original rvalue stream type not its base class.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/std/istream (operator>>(Istream&&, x&)): Simplify, as
per LWG 1203.
* include/std/ostream (operator<<(Ostream&&, const x&)):
Likewise.
* testsuite/27_io/basic_istream/extractors_character/char/lwg2499_neg.cc:
Adjust dg-error pattern.
* testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499_neg.cc:
Likewise.
* testsuite/27_io/basic_istream/extractors_other/char/4.cc: Define
is_extractable trait to replace std::__is_extractable. Make it
work with rvalue streams as well as lvalues, to replace f() and
g() helper functions.
* testsuite/27_io/basic_istream/extractors_other/wchar_t/4.cc:
Likewise.
* testsuite/27_io/basic_ostream/inserters_other/char/6.cc:
Define is_insertable trait to replace std::__is_insertable. Make
it work with rvalue streams as well as lvalues, to replace f()
and g() helper functions.
* testsuite/27_io/basic_ostream/inserters_other/wchar_t/6.cc:
Likewise.
* testsuite/27_io/filesystem/path/io/dr2989.cc: Prune additional
errors from new constraints.
* testsuite/27_io/rvalue_streams-2.cc: Remove PR 80675 checks,
which are no longer expected to compile.
* testsuite/27_io/rvalue_streams.cc: Adjust existing test.
Verify LWG 1203 changes.
Diffstat (limited to 'libstdc++-v3/testsuite/27_io/basic_istream')
4 files changed, 62 insertions, 108 deletions
diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/lwg2499_neg.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/lwg2499_neg.cc index 7a39e7c..abd68af 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/lwg2499_neg.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/lwg2499_neg.cc @@ -26,9 +26,9 @@ void test01(std::istream& in, char* pc, signed char* sc, unsigned char* uc) { - in >> pc; // { dg-error "here" } - in >> sc; // { dg-error "here" } - in >> uc; // { dg-error "here" } + in >> pc; // { dg-error "no match" } + in >> sc; // { dg-error "no match" } + in >> uc; // { dg-error "no match" } } struct CT : std::char_traits<char> { }; @@ -37,9 +37,9 @@ void test02(std::basic_istream<char, CT>& in, char* pc, signed char* sc, unsigned char* uc) { - in >> pc; // { dg-error "here" } - in >> sc; // { dg-error "here" } - in >> uc; // { dg-error "here" } + in >> pc; // { dg-error "no match" } + in >> sc; // { dg-error "no match" } + in >> uc; // { dg-error "no match" } } // { dg-excess-errors "" } diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499_neg.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499_neg.cc index bc8dfac..214f8d6 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499_neg.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499_neg.cc @@ -26,7 +26,7 @@ void test01(std::wistream& in, wchar_t* wc) { - in >> wc; // { dg-error "here" } + in >> wc; // { dg-error "no match" } } struct WT : std::char_traits<wchar_t> { }; @@ -34,7 +34,7 @@ struct WT : std::char_traits<wchar_t> { }; void test02(std::basic_istream<wchar_t, WT>& in, wchar_t* wc) { - in >> wc; // { dg-error "here" } + in >> wc; // { dg-error "no match" } } // { dg-excess-errors "" } diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/4.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/4.cc index 5ad1c1b..9f1e293 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/4.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/4.cc @@ -21,6 +21,21 @@ #include <sstream> +template<typename Istream, typename T, typename = void> + struct is_extractable : std::false_type + { }; + +template<typename> using void_t = void; + +template<typename Istream, typename T> + using extract_result + = decltype(std::declval<Istream>() >> std::declval<const T&>()); + +template<typename Istream, typename T> + struct is_extractable<Istream, T, void_t<extract_result<Istream, T>>> + : std::true_type + { }; + struct X {}; std::istream& operator>>(std::istream&, X&) = delete; @@ -30,20 +45,6 @@ std::istream& operator>>(std::istream& is, Y&&) {return is;} struct Z{}; -template <class T> -auto f(T&&) -> decltype(void(std::declval<std::istream&>() - >> std::declval<T&&>()), - std::true_type()); - -std::false_type f(...); - -template <class T> -auto g(T&&) -> decltype(void(std::declval<std::istream&&>() - >> std::declval<T&&>()), - std::true_type()); - -std::false_type g(...); - void test01() { Y y; @@ -52,42 +53,18 @@ void test01() is >> Y(); std::istringstream() >> y; std::istringstream() >> Y(); - static_assert(!std::__is_extractable<std::istream&, X&>::value, ""); - static_assert(!std::__is_extractable<std::istream&&, X&>::value, ""); - static_assert(!std::__is_extractable<std::istream&, X&&>::value, ""); - static_assert(!std::__is_extractable<std::istream&&, X&&>::value, ""); - static_assert(std::__is_extractable<std::istream&, Y&>::value, ""); - static_assert(std::__is_extractable<std::istream&&, Y&>::value, ""); - static_assert(std::__is_extractable<std::istream&, Y&&>::value, ""); - static_assert(std::__is_extractable<std::istream&&, Y&&>::value, ""); - static_assert(!std::__is_extractable<std::istream&, Z&>::value, ""); - static_assert(!std::__is_extractable<std::istream&&, Z&>::value, ""); - static_assert(!std::__is_extractable<std::istream&, Z&&>::value, ""); - static_assert(!std::__is_extractable<std::istream&&, Z&&>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<X&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<X&&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Y&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Y&&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Z&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Z&&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<X&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<X&&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Y&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Y&&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Z&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Z&&>())), - std::false_type>::value, ""); + static_assert(!is_extractable<std::istream&, X&>::value, ""); + static_assert(!is_extractable<std::istream&&, X&>::value, ""); + static_assert(!is_extractable<std::istream&, X&&>::value, ""); + static_assert(!is_extractable<std::istream&&, X&&>::value, ""); + static_assert(is_extractable<std::istream&, Y&>::value, ""); + static_assert(is_extractable<std::istream&&, Y&>::value, ""); + static_assert(is_extractable<std::istream&, Y&&>::value, ""); + static_assert(is_extractable<std::istream&&, Y&&>::value, ""); + static_assert(!is_extractable<std::istream&, Z&>::value, ""); + static_assert(!is_extractable<std::istream&&, Z&>::value, ""); + static_assert(!is_extractable<std::istream&, Z&&>::value, ""); + static_assert(!is_extractable<std::istream&&, Z&&>::value, ""); } int main() diff --git a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/wchar_t/4.cc b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/wchar_t/4.cc index 94f2d9d..fc7f550 100644 --- a/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/wchar_t/4.cc +++ b/libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/wchar_t/4.cc @@ -21,6 +21,21 @@ #include <sstream> +template<typename Istream, typename T, typename = void> + struct is_extractable : std::false_type + { }; + +template<typename> using void_t = void; + +template<typename Istream, typename T> + using extract_result + = decltype(std::declval<Istream>() >> std::declval<const T&>()); + +template<typename Istream, typename T> + struct is_extractable<Istream, T, void_t<extract_result<Istream, T>>> + : std::true_type + { }; + struct X {}; std::wistream& operator>>(std::wistream&, X&) = delete; @@ -30,20 +45,6 @@ std::wistream& operator>>(std::wistream& is, Y&&) {return is;} struct Z{}; -template <class T> -auto f(T&&) -> decltype(void(std::declval<std::wistream&>() - >> std::declval<T&&>()), - std::true_type()); - -std::false_type f(...); - -template <class T> -auto g(T&&) -> decltype(void(std::declval<std::wistream&&>() - >> std::declval<T&&>()), - std::true_type()); - -std::false_type g(...); - void test01() { Y y; @@ -52,42 +53,18 @@ void test01() is >> Y(); std::wistringstream() >> y; std::wistringstream() >> Y(); - static_assert(!std::__is_extractable<std::wistream&, X&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&&, X&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&, X&&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&&, X&&>::value, ""); - static_assert(std::__is_extractable<std::wistream&, Y&>::value, ""); - static_assert(std::__is_extractable<std::wistream&&, Y&>::value, ""); - static_assert(std::__is_extractable<std::wistream&, Y&&>::value, ""); - static_assert(std::__is_extractable<std::wistream&&, Y&&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&, Z&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&&, Z&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&, Z&&>::value, ""); - static_assert(!std::__is_extractable<std::wistream&&, Z&&>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<X&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<X&&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Y&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Y&&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Z&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(f(std::declval<Z&&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<X&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<X&&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Y&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Y&&>())), - std::true_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Z&>())), - std::false_type>::value, ""); - static_assert(std::is_same<decltype(g(std::declval<Z&&>())), - std::false_type>::value, ""); + static_assert(!is_extractable<std::wistream&, X&>::value, ""); + static_assert(!is_extractable<std::wistream&&, X&>::value, ""); + static_assert(!is_extractable<std::wistream&, X&&>::value, ""); + static_assert(!is_extractable<std::wistream&&, X&&>::value, ""); + static_assert(is_extractable<std::wistream&, Y&>::value, ""); + static_assert(is_extractable<std::wistream&&, Y&>::value, ""); + static_assert(is_extractable<std::wistream&, Y&&>::value, ""); + static_assert(is_extractable<std::wistream&&, Y&&>::value, ""); + static_assert(!is_extractable<std::wistream&, Z&>::value, ""); + static_assert(!is_extractable<std::wistream&&, Z&>::value, ""); + static_assert(!is_extractable<std::wistream&, Z&&>::value, ""); + static_assert(!is_extractable<std::wistream&&, Z&&>::value, ""); } int main() |