brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 66626bc Raw
97 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <string_view>12 13// template<class charT, class traits>14//   constexpr auto operator<=>(basic_string_view<charT, traits> lhs, basic_string_view<charT, traits> rhs);15//16// LWG 343217// [string.view]/418// Mandates: R denotes a comparison category type ([cmp.categories]).19 20#include <string_view>21 22#include "test_macros.h"23 24template <class CharT, class Ordering>25struct traits {26  typedef CharT char_type;27  typedef int int_type;28  typedef std::streamoff off_type;29  typedef std::streampos pos_type;30  typedef std::mbstate_t state_type;31  using comparison_category = Ordering;32 33  static constexpr void assign(char_type&, const char_type&) noexcept;34  static constexpr bool eq(char_type&, const char_type&) noexcept;35  static constexpr bool lt(char_type&, const char_type&) noexcept;36 37  static constexpr int compare(const char_type*, const char_type*, std::size_t) { return 0; }38  static constexpr std::size_t length(const char_type*);39  static constexpr const char_type* find(const char_type*, std::size_t, const char_type&);40  static constexpr char_type* move(char_type*, const char_type*, std::size_t);41  static constexpr char_type* copy(char_type*, const char_type*, std::size_t);42  static constexpr char_type* assign(char_type*, std::size_t, char_type);43 44  static constexpr int_type not_eof(int_type) noexcept;45 46  static constexpr char_type to_char_type(int_type) noexcept;47 48  static constexpr int_type to_int_type(char_type) noexcept;49 50  static constexpr bool eq_int_type(int_type, int_type) noexcept;51 52  static constexpr int_type eof() noexcept;53};54 55template <class CharT, class Ordering, bool Valid>56void test() {57  using type = std::basic_string_view<CharT, traits<CharT, Ordering>>;58  if constexpr (Valid)59    type{} <=> type{};60  else61#ifndef TEST_HAS_NO_WIDE_CHARACTERS62  // These diagnostics are issued for63  // - Every invalid ordering64  // - Every type65  // expected-error-re@string_view:* 15 {{static assertion failed{{.*}}return type is not a comparison category type}}66 67  // This diagnostic is not issued for Ordering == void.68  // expected-error@string_view:* 10 {{no matching conversion for static_cast from}}69#else70  // One less test run when wchar_t is unavailable.71  // expected-error-re@string_view:* 12 {{static assertion failed{{.*}}return type is not a comparison category type}}72  // expected-error@string_view:* 8 {{no matching conversion for static_cast from}}73#endif74    type{} <=> type{};75}76 77template <class CharT>78void test_all_orders() {79  test<CharT, std::strong_ordering, true>();80  test<CharT, std::weak_ordering, true>();81  test<CharT, std::partial_ordering, true>();82 83  test<CharT, void, false>();84  test<CharT, int, false>();85  test<CharT, float, false>();86}87 88void test_all_types() {89  test_all_orders<char>();90#ifndef TEST_HAS_NO_WIDE_CHARACTERS91  test_all_orders<wchar_t>();92#endif93  test_all_orders<char8_t>();94  test_all_orders<char16_t>();95  test_all_orders<char32_t>();96}97