13818b4dfSMark de Wever //===----------------------------------------------------------------------===//
23818b4dfSMark de Wever //
33818b4dfSMark de Wever // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43818b4dfSMark de Wever // See https://llvm.org/LICENSE.txt for license information.
53818b4dfSMark de Wever // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63818b4dfSMark de Wever //
73818b4dfSMark de Wever //===----------------------------------------------------------------------===//
83818b4dfSMark de Wever
93818b4dfSMark de Wever // UNSUPPORTED: c++03, c++11, c++14, c++17
103818b4dfSMark de Wever
113818b4dfSMark de Wever // <string_view>
123818b4dfSMark de Wever
133818b4dfSMark de Wever // template<class charT, class traits>
143818b4dfSMark de Wever // constexpr auto operator<=>(basic_string_view<charT, traits> lhs, basic_string_view<charT, traits> rhs);
153818b4dfSMark de Wever //
163818b4dfSMark de Wever // LWG 3432
173818b4dfSMark de Wever // [string.view]/4
183818b4dfSMark de Wever // Mandates: R denotes a comparison category type ([cmp.categories]).
193818b4dfSMark de Wever
203818b4dfSMark de Wever #include <string_view>
213818b4dfSMark de Wever
223818b4dfSMark de Wever #include "test_macros.h"
233818b4dfSMark de Wever
243818b4dfSMark de Wever template <class CharT, class Ordering>
253818b4dfSMark de Wever struct traits {
263818b4dfSMark de Wever typedef CharT char_type;
273818b4dfSMark de Wever typedef int int_type;
283818b4dfSMark de Wever typedef std::streamoff off_type;
293818b4dfSMark de Wever typedef std::streampos pos_type;
303818b4dfSMark de Wever typedef std::mbstate_t state_type;
313818b4dfSMark de Wever using comparison_category = Ordering;
323818b4dfSMark de Wever
333818b4dfSMark de Wever static constexpr void assign(char_type&, const char_type&) noexcept;
343818b4dfSMark de Wever static constexpr bool eq(char_type&, const char_type&) noexcept;
353818b4dfSMark de Wever static constexpr bool lt(char_type&, const char_type&) noexcept;
363818b4dfSMark de Wever
comparetraits37fb855eb9SMark de Wever static constexpr int compare(const char_type*, const char_type*, std::size_t) { return 0; }
38fb855eb9SMark de Wever static constexpr std::size_t length(const char_type*);
39fb855eb9SMark de Wever static constexpr const char_type* find(const char_type*, std::size_t, const char_type&);
40fb855eb9SMark de Wever static constexpr char_type* move(char_type*, const char_type*, std::size_t);
41fb855eb9SMark de Wever static constexpr char_type* copy(char_type*, const char_type*, std::size_t);
42fb855eb9SMark de Wever static constexpr char_type* assign(char_type*, std::size_t, char_type);
433818b4dfSMark de Wever
443818b4dfSMark de Wever static constexpr int_type not_eof(int_type) noexcept;
453818b4dfSMark de Wever
463818b4dfSMark de Wever static constexpr char_type to_char_type(int_type) noexcept;
473818b4dfSMark de Wever
483818b4dfSMark de Wever static constexpr int_type to_int_type(char_type) noexcept;
493818b4dfSMark de Wever
503818b4dfSMark de Wever static constexpr bool eq_int_type(int_type, int_type) noexcept;
513818b4dfSMark de Wever
523818b4dfSMark de Wever static constexpr int_type eof() noexcept;
533818b4dfSMark de Wever };
543818b4dfSMark de Wever
553818b4dfSMark de Wever template <class CharT, class Ordering, bool Valid>
test()563818b4dfSMark de Wever void test() {
573818b4dfSMark de Wever using type = std::basic_string_view<CharT, traits<CharT, Ordering>>;
583818b4dfSMark de Wever if constexpr (Valid)
593818b4dfSMark de Wever type{} <=> type{};
603818b4dfSMark de Wever else
613818b4dfSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
623818b4dfSMark de Wever // These diagnostics are issued for
633818b4dfSMark de Wever // - Every invalid ordering
643818b4dfSMark de Wever // - Every type
65*9bb9ec38SLouis Dionne // expected-error-re@string_view:* 15 {{static assertion failed{{.*}}return type is not a comparison category type}}
663818b4dfSMark de Wever
673818b4dfSMark de Wever // This diagnostic is not issued for Ordering == void.
683818b4dfSMark de Wever // expected-error@string_view:* 10 {{no matching conversion for static_cast from}}
693818b4dfSMark de Wever #else
703818b4dfSMark de Wever // One less test run when wchar_t is unavailable.
71*9bb9ec38SLouis Dionne // expected-error-re@string_view:* 12 {{static assertion failed{{.*}}return type is not a comparison category type}}
723818b4dfSMark de Wever // expected-error@string_view:* 8 {{no matching conversion for static_cast from}}
733818b4dfSMark de Wever #endif
743818b4dfSMark de Wever type{} <=> type{};
753818b4dfSMark de Wever }
763818b4dfSMark de Wever
773818b4dfSMark de Wever template <class CharT>
test_all_orders()783818b4dfSMark de Wever void test_all_orders() {
793818b4dfSMark de Wever test<CharT, std::strong_ordering, true>();
803818b4dfSMark de Wever test<CharT, std::weak_ordering, true>();
813818b4dfSMark de Wever test<CharT, std::partial_ordering, true>();
823818b4dfSMark de Wever
833818b4dfSMark de Wever test<CharT, void, false>();
843818b4dfSMark de Wever test<CharT, int, false>();
853818b4dfSMark de Wever test<CharT, float, false>();
863818b4dfSMark de Wever }
873818b4dfSMark de Wever
test_all_types()883818b4dfSMark de Wever void test_all_types() {
893818b4dfSMark de Wever test_all_orders<char>();
903818b4dfSMark de Wever #ifndef TEST_HAS_NO_WIDE_CHARACTERS
913818b4dfSMark de Wever test_all_orders<wchar_t>();
923818b4dfSMark de Wever #endif
933818b4dfSMark de Wever test_all_orders<char8_t>();
943818b4dfSMark de Wever test_all_orders<char16_t>();
953818b4dfSMark de Wever test_all_orders<char32_t>();
963818b4dfSMark de Wever }
97