brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 3b1613e Raw
67 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// constexpr iterator& operator--() requires decrementable<W>;12// constexpr iterator operator--(int) requires decrementable<W>;13 14#include <cassert>15#include <ranges>16#include <type_traits>17 18#include "test_macros.h"19#include "../types.h"20 21template<class T>22concept Decrementable =23  requires(T i) {24    --i;25  } ||26  requires(T i) {27    i--;28  };29 30constexpr bool test() {31  {32    std::ranges::iota_view<int> io(0);33    auto iter1 = std::next(io.begin());34    auto iter2 = std::next(io.begin());35    assert(iter1 == iter2);36    assert(--iter1 != iter2--);37    assert(iter1 == iter2);38 39    static_assert(!std::is_reference_v<decltype(iter2--)>);40    static_assert( std::is_reference_v<decltype(--iter2)>);41    static_assert(std::same_as<std::remove_reference_t<decltype(--iter2)>, decltype(iter2--)>);42  }43  {44    std::ranges::iota_view io(SomeInt(0));45    auto iter1 = std::next(io.begin());46    auto iter2 = std::next(io.begin());47    assert(iter1 == iter2);48    assert(--iter1 != iter2--);49    assert(iter1 == iter2);50 51    static_assert(!std::is_reference_v<decltype(iter2--)>);52    static_assert( std::is_reference_v<decltype(--iter2)>);53    static_assert(std::same_as<std::remove_reference_t<decltype(--iter2)>, decltype(iter2--)>);54  }55 56  static_assert(!Decrementable<std::ranges::iota_view<NotDecrementable>>);57 58  return true;59}60 61int main(int, char**) {62  test();63  static_assert(test());64 65  return 0;66}67