aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/testsuite/27_io/basic_istream
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-04-30 14:07:28 +0100
committerJonathan Wakely <jwakely@redhat.com>2021-04-30 14:33:19 +0100
commitaa475c4ac80733f85ba47b109fc1900f05e810e2 (patch)
treed8a24aef9026d5d67e999a1884510e487567867e /libstdc++-v3/testsuite/27_io/basic_istream
parent0d501c338548152f9d2728d383eec3e9cef16784 (diff)
downloadgcc-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')
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/char/lwg2499_neg.cc12
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/extractors_character/wchar_t/lwg2499_neg.cc4
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/char/4.cc77
-rw-r--r--libstdc++-v3/testsuite/27_io/basic_istream/extractors_other/wchar_t/4.cc77
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()