19d982c67Szoecarver //===----------------------------------------------------------------------===// 29d982c67Szoecarver // 39d982c67Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 49d982c67Szoecarver // See https://llvm.org/LICENSE.txt for license information. 59d982c67Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 69d982c67Szoecarver // 79d982c67Szoecarver //===----------------------------------------------------------------------===// 89d982c67Szoecarver 99d982c67Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17 109d982c67Szoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges 119d982c67Szoecarver 12*fc3923faSArthur O'Dwyer // reverse_view() requires default_initializable<V> = default; 139d982c67Szoecarver 149d982c67Szoecarver #include <ranges> 159d982c67Szoecarver #include <cassert> 169d982c67Szoecarver 179d982c67Szoecarver #include "types.h" 189d982c67Szoecarver 199d982c67Szoecarver enum CtorKind { DefaultCtor, PtrCtor }; 209d982c67Szoecarver template<CtorKind CK> 219d982c67Szoecarver struct BidirRangeWith : std::ranges::view_base { 229d982c67Szoecarver int *ptr_ = nullptr; 239d982c67Szoecarver 249d982c67Szoecarver constexpr BidirRangeWith() requires (CK == DefaultCtor) = default; 259d982c67Szoecarver constexpr BidirRangeWith(int *ptr); 269d982c67Szoecarver beginBidirRangeWith279d982c67Szoecarver constexpr bidirectional_iterator<int*> begin() { return bidirectional_iterator<int*>{ptr_}; } beginBidirRangeWith289d982c67Szoecarver constexpr bidirectional_iterator<const int*> begin() const { return bidirectional_iterator<const int*>{ptr_}; } endBidirRangeWith299d982c67Szoecarver constexpr bidirectional_iterator<int*> end() { return bidirectional_iterator<int*>{ptr_ + 8}; } endBidirRangeWith309d982c67Szoecarver constexpr bidirectional_iterator<const int*> end() const { return bidirectional_iterator<const int*>{ptr_ + 8}; } 319d982c67Szoecarver }; 329d982c67Szoecarver test()339d982c67Szoecarverconstexpr bool test() { 349d982c67Szoecarver { 359d982c67Szoecarver static_assert( std::default_initializable<std::ranges::reverse_view<BidirRangeWith<DefaultCtor>>>); 369d982c67Szoecarver static_assert(!std::default_initializable<std::ranges::reverse_view<BidirRangeWith<PtrCtor>>>); 379d982c67Szoecarver } 389d982c67Szoecarver 399d982c67Szoecarver { 409d982c67Szoecarver std::ranges::reverse_view<BidirRangeWith<DefaultCtor>> rev; 419d982c67Szoecarver assert(rev.base().ptr_ == nullptr); 429d982c67Szoecarver } 439d982c67Szoecarver { 449d982c67Szoecarver const std::ranges::reverse_view<BidirRangeWith<DefaultCtor>> rev; 459d982c67Szoecarver assert(rev.base().ptr_ == nullptr); 469d982c67Szoecarver } 479d982c67Szoecarver 489d982c67Szoecarver return true; 499d982c67Szoecarver } 509d982c67Szoecarver main(int,char **)519d982c67Szoecarverint main(int, char**) { 529d982c67Szoecarver test(); 539d982c67Szoecarver static_assert(test()); 549d982c67Szoecarver 559d982c67Szoecarver return 0; 569d982c67Szoecarver } 579d982c67Szoecarver 58