Fix testsuite failures caused by the patch implementing LWG 2534.
authorVille Voutilainen <ville.voutilainen@gmail.com>
Wed, 30 Nov 2016 16:32:24 +0000 (18:32 +0200)
committerVille Voutilainen <ville@gcc.gnu.org>
Wed, 30 Nov 2016 16:32:24 +0000 (18:32 +0200)
* include/std/istream (__is_convertible_to_basic_istream):
Change the return types of __check, introduce istream_type.
(operator>>(_Istream&&, _Tp&&)):
Use __is_convertible_to_basic_istream::istream_type as the return type.
* include/std/ostream (__is_convertible_to_basic_ostream):
Change the return types of __check, introduce ostream_type.
(operator>>(_Ostream&&, _Tp&&)):
Use __is_convertible_to_basic_ostream::ostream_type as the return type.

From-SVN: r243036

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/istream
libstdc++-v3/include/std/ostream

index 349a35b235033d151125ccdf718f81d761cdd519..6d3bfcc542b10cf5b89e6a0ffe8dc4dacb531593 100644 (file)
@@ -1,3 +1,15 @@
+2016-11-30  Ville Voutilainen  <ville.voutilainen@gmail.com>
+
+       Fix testsuite failures caused by the patch implementing LWG 2534.
+       * include/std/istream (__is_convertible_to_basic_istream):
+       Change the return types of __check, introduce istream_type.
+       (operator>>(_Istream&&, _Tp&&)):
+       Use __is_convertible_to_basic_istream::istream_type as the return type.
+       * include/std/ostream (__is_convertible_to_basic_ostream):
+       Change the return types of __check, introduce ostream_type.
+       (operator>>(_Ostream&&, _Tp&&)):
+       Use __is_convertible_to_basic_ostream::ostream_type as the return type.
+
 2016-11-30  Tim Shen  <timshen@google.com>
 
        * include/bits/shared_ptr_base.h
index 4f0e940b2aa6064a8f6ab663304c7f840f42f458..319e2264e796dd5290cc84c66483fdb63b173963 100644 (file)
@@ -913,11 +913,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __is_convertible_to_basic_istream
     {
       template<typename _Ch, typename _Up>
-      static true_type __check(basic_istream<_Ch, _Up>*);
+      static basic_istream<_Ch, _Up>& __check(basic_istream<_Ch, _Up>*);
 
-      static false_type __check(void*);
+      static void __check(void*);
     public:
-      using type = decltype(__check(declval<_Tp*>()));
+      using istream_type =
+       decltype(__check(declval<typename remove_reference<_Tp>::type*>()));
+      using type = __not_<is_same<istream_type, void>>;
       constexpr static bool value = type::value;
   };
 
@@ -946,10 +948,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _Istream, typename _Tp>
     inline
     typename enable_if<__and_<__not_<is_lvalue_reference<_Istream>>,
-                             __is_convertible_to_basic_istream<
-                               typename remove_reference<_Istream>::type>,
+                             __is_convertible_to_basic_istream<_Istream>,
                              __is_extractable<_Istream&, _Tp&&>>::value,
-                      _Istream&>::type
+                      typename __is_convertible_to_basic_istream<
+                        _Istream>::istream_type>::type
     operator>>(_Istream&& __is, _Tp&& __x)
     {
       __is >> std::forward<_Tp>(__x);
index a1fe892ccdbcd711149ad0f8c3e030797935480f..70fd10ba954336394438e4d55105576d61449246 100644 (file)
@@ -617,11 +617,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct __is_convertible_to_basic_ostream
   {
     template<typename _Ch, typename _Up>
-    static true_type __check(basic_ostream<_Ch, _Up>*);
+    static basic_ostream<_Ch, _Up>& __check(basic_ostream<_Ch, _Up>*);
 
-    static false_type __check(void*);
+    static void __check(void*);
   public:
-    using type = decltype(__check(declval<_Tp*>()));
+    using ostream_type =
+      decltype(__check(declval<typename remove_reference<_Tp>::type*>()));
+    using type = __not_<is_same<ostream_type, void>>;
     constexpr static bool value = type::value;
   };
 
@@ -647,11 +649,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   template<typename _Ostream, typename _Tp>
     inline
     typename enable_if<__and_<__not_<is_lvalue_reference<_Ostream>>,
-                             __is_convertible_to_basic_ostream<
-                               typename remove_reference<_Ostream>::type>,
+                             __is_convertible_to_basic_ostream<_Ostream>,
                              __is_insertable<_Ostream&, const _Tp&>>::value,
-                      _Ostream&>::type
-                                     //basic_ostream<_CharT, _Traits>&
+                      typename __is_convertible_to_basic_ostream<
+                        _Ostream>::ostream_type>::type
     operator<<(_Ostream&& __os, const _Tp& __x)
     {
       __os << __x;