18e93aa30SLouis Dionne //===----------------------------------------------------------------------===// 28e93aa30SLouis Dionne // 38e93aa30SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48e93aa30SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 58e93aa30SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68e93aa30SLouis Dionne // 78e93aa30SLouis Dionne //===----------------------------------------------------------------------===// 88e93aa30SLouis Dionne 98e93aa30SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17 10*53406fb6SArthur O'Dwyer // UNSUPPORTED: libcpp-has-no-incomplete-ranges 118e93aa30SLouis Dionne 128e93aa30SLouis Dionne // ranges::next 138e93aa30SLouis Dionne // Make sure we're SFINAE-friendly when the template argument constraints are not met. 148e93aa30SLouis Dionne 158e93aa30SLouis Dionne #include <iterator> 168e93aa30SLouis Dionne 178e93aa30SLouis Dionne #include <cstddef> 188e93aa30SLouis Dionne #include <memory> 198e93aa30SLouis Dionne #include <utility> 209f967eedSLouis Dionne #include "test_iterators.h" 218e93aa30SLouis Dionne 228e93aa30SLouis Dionne template <class ...Args> 239f967eedSLouis Dionne concept has_ranges_next = requires (Args&& ...args) { 248e93aa30SLouis Dionne { std::ranges::next(std::forward<Args>(args)...) }; 258e93aa30SLouis Dionne }; 268e93aa30SLouis Dionne 278e93aa30SLouis Dionne using It = std::unique_ptr<int>; 288e93aa30SLouis Dionne static_assert(!has_ranges_next<It>); 298e93aa30SLouis Dionne static_assert(!has_ranges_next<It, std::ptrdiff_t>); 308e93aa30SLouis Dionne static_assert(!has_ranges_next<It, It>); 318e93aa30SLouis Dionne static_assert(!has_ranges_next<It, std::ptrdiff_t, It>); 328e93aa30SLouis Dionne 338e93aa30SLouis Dionne // Test the test 349f967eedSLouis Dionne using It2 = forward_iterator<int*>; 359f967eedSLouis Dionne static_assert(has_ranges_next<It2>); 369f967eedSLouis Dionne static_assert(has_ranges_next<It2, std::ptrdiff_t>); 379f967eedSLouis Dionne static_assert(has_ranges_next<It2, std::ptrdiff_t, It2>); 38