167 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
| // See https://llvm.org/LICENSE.txt for license information.
 | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| // UNSUPPORTED: c++03, c++11
 | |
| 
 | |
| // <iomanip>
 | |
| 
 | |
| // std::quoted
 | |
| //   Verify that the result type of std::quoted can be streamed to
 | |
| //   (and from) ostreams with the correct CharTraits, and not those
 | |
| //   with the wrong CharTraits. To avoid our having to create working
 | |
| //   ostreams with weird CharTraits, this is a compile-only test.
 | |
| 
 | |
| #include <iomanip>
 | |
| #include <istream>
 | |
| #include <ostream>
 | |
| #include <string>
 | |
| #include <string_view>
 | |
| #include <type_traits>
 | |
| 
 | |
| #include "test_allocator.h"
 | |
| #include "test_macros.h"
 | |
| 
 | |
| template<class IS, class Q>
 | |
| decltype(std::declval<IS>() >> std::declval<Q>(), std::true_type())
 | |
| has_rightshift_impl(int) { return std::true_type(); }
 | |
| 
 | |
| template<class IS, class Q>
 | |
| std::false_type
 | |
| has_rightshift_impl(long) { return std::false_type(); }
 | |
| 
 | |
| template<class IS, class Q>
 | |
| struct HasRightShift : decltype(has_rightshift_impl<IS, Q>(0)) {};
 | |
| 
 | |
| template<class OS, class Q>
 | |
| decltype(std::declval<OS>() << std::declval<Q>(), std::true_type())
 | |
| has_leftshift_impl(int) { return std::true_type(); }
 | |
| 
 | |
| template<class OS, class Q>
 | |
| std::false_type
 | |
| has_leftshift_impl(long) { return std::false_type(); }
 | |
| 
 | |
| template<class OS, class Q>
 | |
| struct HasLeftShift : decltype(has_leftshift_impl<OS, Q>(0)) {};
 | |
| 
 | |
| template<class CharT>
 | |
| struct FakeCharTraits : std::char_traits<CharT> {};
 | |
| 
 | |
| void test_string_literal()
 | |
| {
 | |
|   using Q = decltype(std::quoted("hello"));
 | |
|   static_assert( HasLeftShift<std::ostream&, Q>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, Q>::value, "");
 | |
|   static_assert( HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, Q>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, Q>::value, "");
 | |
| 
 | |
| #ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | |
|   using WQ = decltype(std::quoted(L"hello"));
 | |
|   static_assert( HasLeftShift<std::wostream&, WQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::wistream&, WQ>::value, "");
 | |
|   static_assert( HasLeftShift<std::basic_ostream<wchar_t, FakeCharTraits<wchar_t>>&, WQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<wchar_t, FakeCharTraits<wchar_t>>&, WQ>::value, "");
 | |
| 
 | |
|   static_assert(!HasLeftShift<std::ostream&, WQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::wostream&, Q>::value, "");
 | |
| #endif // TEST_HAS_NO_WIDE_CHARACTERS
 | |
| }
 | |
| 
 | |
| void test_std_string()
 | |
| {
 | |
|   std::string s = "hello";
 | |
|   const auto& cs = s;
 | |
|   using Q = decltype(std::quoted(s));
 | |
|   using CQ = decltype(std::quoted(cs));
 | |
|   static_assert( HasLeftShift<std::ostream&, Q>::value, "");
 | |
|   static_assert( HasRightShift<std::istream&, Q>::value, "");
 | |
|   static_assert( HasLeftShift<std::ostream&, CQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, CQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, Q>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, Q>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, CQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, CQ>::value, "");
 | |
| 
 | |
|   std::basic_string<char, FakeCharTraits<char>, test_allocator<char>> st = "hello";
 | |
|   const auto& cst = st;
 | |
|   using QT = decltype(std::quoted(st));
 | |
|   using CQT = decltype(std::quoted(cst));
 | |
|   static_assert(!HasLeftShift<std::ostream&, QT>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, QT>::value, "");
 | |
|   static_assert(!HasLeftShift<std::ostream&, CQT>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, CQT>::value, "");
 | |
|   static_assert( HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, QT>::value, "");
 | |
|   static_assert( HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, QT>::value, "");
 | |
|   static_assert( HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, CQT>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, CQT>::value, "");
 | |
| 
 | |
| #ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | |
|   std::wstring ws = L"hello";
 | |
|   const auto& cws = ws;
 | |
|   using WQ = decltype(std::quoted(ws));
 | |
|   using CWQ = decltype(std::quoted(cws));
 | |
|   static_assert( HasLeftShift<std::wostream&, WQ>::value, "");
 | |
|   static_assert( HasRightShift<std::wistream&, WQ>::value, "");
 | |
|   static_assert( HasLeftShift<std::wostream&, CWQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::wistream&, CWQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<wchar_t, FakeCharTraits<wchar_t>>&, WQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<wchar_t, FakeCharTraits<wchar_t>>&, WQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<wchar_t, FakeCharTraits<wchar_t>>&, CWQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<wchar_t, FakeCharTraits<wchar_t>>&, CWQ>::value, "");
 | |
| 
 | |
|   static_assert(!HasLeftShift<std::ostream&, WQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::wostream&, Q>::value, "");
 | |
| #endif // TEST_HAS_NO_WIDE_CHARACTERS
 | |
| }
 | |
| 
 | |
| void test_std_string_view()
 | |
| {
 | |
|   std::string_view s = "hello";
 | |
|   const auto& cs = s;
 | |
|   using Q = decltype(std::quoted(s));
 | |
|   using CQ = decltype(std::quoted(cs));
 | |
|   static_assert( HasLeftShift<std::ostream&, Q>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, Q>::value, "");
 | |
|   static_assert( HasLeftShift<std::ostream&, CQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, CQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, Q>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, Q>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, CQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, CQ>::value, "");
 | |
| 
 | |
|   std::basic_string_view<char, FakeCharTraits<char>> st = "hello";
 | |
|   const auto& cst = st;
 | |
|   using QT = decltype(std::quoted(st));
 | |
|   using CQT = decltype(std::quoted(cst));
 | |
|   static_assert(!HasLeftShift<std::ostream&, QT>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, QT>::value, "");
 | |
|   static_assert(!HasLeftShift<std::ostream&, CQT>::value, "");
 | |
|   static_assert(!HasRightShift<std::istream&, CQT>::value, "");
 | |
|   static_assert( HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, QT>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, QT>::value, "");
 | |
|   static_assert( HasLeftShift<std::basic_ostream<char, FakeCharTraits<char>>&, CQT>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<char, FakeCharTraits<char>>&, CQT>::value, "");
 | |
| 
 | |
| #ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | |
|   std::wstring_view ws = L"hello";
 | |
|   const auto& cws = ws;
 | |
|   using WQ = decltype(std::quoted(ws));
 | |
|   using CWQ = decltype(std::quoted(cws));
 | |
|   static_assert( HasLeftShift<std::wostream&, WQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::wistream&, WQ>::value, "");
 | |
|   static_assert( HasLeftShift<std::wostream&, CWQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::wistream&, CWQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<wchar_t, FakeCharTraits<wchar_t>>&, WQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<wchar_t, FakeCharTraits<wchar_t>>&, WQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::basic_ostream<wchar_t, FakeCharTraits<wchar_t>>&, CWQ>::value, "");
 | |
|   static_assert(!HasRightShift<std::basic_istream<wchar_t, FakeCharTraits<wchar_t>>&, CWQ>::value, "");
 | |
| 
 | |
|   static_assert(!HasLeftShift<std::ostream&, WQ>::value, "");
 | |
|   static_assert(!HasLeftShift<std::wostream&, Q>::value, "");
 | |
| #endif // TEST_HAS_NO_WIDE_CHARACTERS
 | |
| }
 |