+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
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;
};
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);
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;
};
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;