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