1*02540b2fSLouis Dionne //===----------------------------------------------------------------------===// 2*02540b2fSLouis Dionne // 3*02540b2fSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*02540b2fSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5*02540b2fSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*02540b2fSLouis Dionne // 7*02540b2fSLouis Dionne //===----------------------------------------------------------------------===// 8*02540b2fSLouis Dionne 9*02540b2fSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17 10*02540b2fSLouis Dionne 11*02540b2fSLouis Dionne // <ranges> 12*02540b2fSLouis Dionne // 13*02540b2fSLouis Dionne // Range adaptors that take predicates should support predicates that return a non-boolean 14*02540b2fSLouis Dionne // value as long as the returned type is implicitly convertible to bool. 15*02540b2fSLouis Dionne 16*02540b2fSLouis Dionne #include <ranges> 17*02540b2fSLouis Dionne 18*02540b2fSLouis Dionne #include "boolean_testable.h" 19*02540b2fSLouis Dionne 20*02540b2fSLouis Dionne template <std::ranges::view View> use(View view)21*02540b2fSLouis Dionneconstexpr void use(View view) { 22*02540b2fSLouis Dionne // Just use the view in a few ways. Our goal here is to trigger the instantiation 23*02540b2fSLouis Dionne // of various functions related to the view and its iterators in the hopes that we 24*02540b2fSLouis Dionne // instantiate functions that might have incorrect implementations w.r.t. predicates. 25*02540b2fSLouis Dionne auto first = std::ranges::begin(view); 26*02540b2fSLouis Dionne auto last = std::ranges::end(view); 27*02540b2fSLouis Dionne ++first; 28*02540b2fSLouis Dionne --first; 29*02540b2fSLouis Dionne (void)(first == last); 30*02540b2fSLouis Dionne (void)(first != last); 31*02540b2fSLouis Dionne (void)std::ranges::empty(view); 32*02540b2fSLouis Dionne } 33*02540b2fSLouis Dionne 34*02540b2fSLouis Dionne using Value = StrictComparable<int>; 35*02540b2fSLouis Dionne using Iterator = StrictBooleanIterator<Value*>; 36*02540b2fSLouis Dionne using Range = std::ranges::subrange<Iterator>; 37*02540b2fSLouis Dionne auto pred1 = StrictUnaryPredicate; 38*02540b2fSLouis Dionne auto pred2 = StrictBinaryPredicate; 39*02540b2fSLouis Dionne f(Range in)40*02540b2fSLouis Dionnevoid f(Range in) { 41*02540b2fSLouis Dionne (void)pred1; 42*02540b2fSLouis Dionne (void)pred2; 43*02540b2fSLouis Dionne 44*02540b2fSLouis Dionne #if TEST_STD_VER >= 23 45*02540b2fSLouis Dionne { 46*02540b2fSLouis Dionne auto view = std::views::chunk_by(in, pred2); 47*02540b2fSLouis Dionne use(view); 48*02540b2fSLouis Dionne } 49*02540b2fSLouis Dionne #endif 50*02540b2fSLouis Dionne { 51*02540b2fSLouis Dionne auto view = std::views::drop_while(in, pred1); 52*02540b2fSLouis Dionne use(view); 53*02540b2fSLouis Dionne } 54*02540b2fSLouis Dionne { 55*02540b2fSLouis Dionne auto view = std::views::filter(in, pred1); 56*02540b2fSLouis Dionne use(view); 57*02540b2fSLouis Dionne } 58*02540b2fSLouis Dionne { 59*02540b2fSLouis Dionne auto view = std::views::take_while(in, pred1); 60*02540b2fSLouis Dionne use(view); 61*02540b2fSLouis Dionne } 62*02540b2fSLouis Dionne } 63