//===----------------------------------------------------------------------===// // // 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 // // 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 #include #include #include #include #include #include "test_allocator.h" #include "test_macros.h" template decltype(std::declval() >> std::declval(), std::true_type()) has_rightshift_impl(int) { return std::true_type(); } template std::false_type has_rightshift_impl(long) { return std::false_type(); } template struct HasRightShift : decltype(has_rightshift_impl(0)) {}; template decltype(std::declval() << std::declval(), std::true_type()) has_leftshift_impl(int) { return std::true_type(); } template std::false_type has_leftshift_impl(long) { return std::false_type(); } template struct HasLeftShift : decltype(has_leftshift_impl(0)) {}; template struct FakeCharTraits : std::char_traits {}; void test_string_literal() { using Q = decltype(std::quoted("hello")); static_assert( HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert( HasLeftShift>&, Q>::value, ""); static_assert(!HasRightShift>&, Q>::value, ""); #ifndef TEST_HAS_NO_WIDE_CHARACTERS using WQ = decltype(std::quoted(L"hello")); static_assert( HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert( HasLeftShift>&, WQ>::value, ""); static_assert(!HasRightShift>&, WQ>::value, ""); static_assert(!HasLeftShift::value, ""); static_assert(!HasLeftShift::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::value, ""); static_assert( HasRightShift::value, ""); static_assert( HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert(!HasLeftShift>&, Q>::value, ""); static_assert(!HasRightShift>&, Q>::value, ""); static_assert(!HasLeftShift>&, CQ>::value, ""); static_assert(!HasRightShift>&, CQ>::value, ""); std::basic_string, test_allocator> st = "hello"; const auto& cst = st; using QT = decltype(std::quoted(st)); using CQT = decltype(std::quoted(cst)); static_assert(!HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert(!HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert( HasLeftShift>&, QT>::value, ""); static_assert( HasRightShift>&, QT>::value, ""); static_assert( HasLeftShift>&, CQT>::value, ""); static_assert(!HasRightShift>&, 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::value, ""); static_assert( HasRightShift::value, ""); static_assert( HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert(!HasLeftShift>&, WQ>::value, ""); static_assert(!HasRightShift>&, WQ>::value, ""); static_assert(!HasLeftShift>&, CWQ>::value, ""); static_assert(!HasRightShift>&, CWQ>::value, ""); static_assert(!HasLeftShift::value, ""); static_assert(!HasLeftShift::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::value, ""); static_assert(!HasRightShift::value, ""); static_assert( HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert(!HasLeftShift>&, Q>::value, ""); static_assert(!HasRightShift>&, Q>::value, ""); static_assert(!HasLeftShift>&, CQ>::value, ""); static_assert(!HasRightShift>&, CQ>::value, ""); std::basic_string_view> st = "hello"; const auto& cst = st; using QT = decltype(std::quoted(st)); using CQT = decltype(std::quoted(cst)); static_assert(!HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert(!HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert( HasLeftShift>&, QT>::value, ""); static_assert(!HasRightShift>&, QT>::value, ""); static_assert( HasLeftShift>&, CQT>::value, ""); static_assert(!HasRightShift>&, 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::value, ""); static_assert(!HasRightShift::value, ""); static_assert( HasLeftShift::value, ""); static_assert(!HasRightShift::value, ""); static_assert(!HasLeftShift>&, WQ>::value, ""); static_assert(!HasRightShift>&, WQ>::value, ""); static_assert(!HasLeftShift>&, CWQ>::value, ""); static_assert(!HasRightShift>&, CWQ>::value, ""); static_assert(!HasLeftShift::value, ""); static_assert(!HasLeftShift::value, ""); #endif // TEST_HAS_NO_WIDE_CHARACTERS }