68 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++17, c++2010 11// friend constexpr iterator operator-(iterator i, difference_type n);12// friend constexpr difference_type operator-(const iterator& x, const iterator& y);13 14#include <cassert>15#include <concepts>16#include <cstddef>17#include <ranges>18 19constexpr bool test() {20 // <iterator> - difference_type21 {22 using Iter = std::ranges::iterator_t<std::ranges::repeat_view<int>>;23 std::ranges::repeat_view<int> v(0);24 Iter iter = v.begin() + 10;25 assert(iter - 5 == v.begin() + 5);26 static_assert(std::same_as<decltype(iter - 5), Iter>);27 }28 29 // <iterator> - <iterator>30 {31 // unbound32 {33 std::ranges::repeat_view<int> v(0);34 auto iter1 = v.begin() + 10;35 auto iter2 = v.begin() + 5;36 assert(iter1 - iter2 == 5);37 static_assert(std::same_as<decltype(iter1 - iter2), ptrdiff_t>);38 }39 40 // bound && signed bound sentinel41 {42 std::ranges::repeat_view<int, int> v(0, 20);43 auto iter1 = v.begin() + 10;44 auto iter2 = v.begin() + 5;45 assert(iter1 - iter2 == 5);46 static_assert(std::same_as<decltype(iter1 - iter2), int>);47 }48 49 // bound && unsigned bound sentinel50 {51 std::ranges::repeat_view<int, unsigned> v(0, 20);52 auto iter1 = v.begin() + 10;53 auto iter2 = v.begin() + 5;54 assert(iter1 - iter2 == 5);55 static_assert(sizeof(decltype(iter1 - iter2)) > sizeof(unsigned));56 }57 }58 59 return true;60}61 62int main(int, char**) {63 test();64 static_assert(test());65 66 return 0;67}68