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 11*fc3923faSArthur O'Dwyer // reverse_view() requires default_initializable<V> = default; 129d982c67Szoecarver 139d982c67Szoecarver #include <ranges> 149d982c67Szoecarver #include <cassert> 159d982c67Szoecarver 169d982c67Szoecarver #include "types.h" 179d982c67Szoecarver 189d982c67Szoecarver enum CtorKind { DefaultCtor, PtrCtor }; 199d982c67Szoecarver template<CtorKind CK> 209d982c67Szoecarver struct BidirRangeWith : std::ranges::view_base { 219d982c67Szoecarver int *ptr_ = nullptr; 229d982c67Szoecarver 239d982c67Szoecarver constexpr BidirRangeWith() requires (CK == DefaultCtor) = default; 249d982c67Szoecarver constexpr BidirRangeWith(int *ptr); 259d982c67Szoecarver beginBidirRangeWith269d982c67Szoecarver constexpr bidirectional_iterator<int*> begin() { return bidirectional_iterator<int*>{ptr_}; } beginBidirRangeWith279d982c67Szoecarver constexpr bidirectional_iterator<const int*> begin() const { return bidirectional_iterator<const int*>{ptr_}; } endBidirRangeWith289d982c67Szoecarver constexpr bidirectional_iterator<int*> end() { return bidirectional_iterator<int*>{ptr_ + 8}; } endBidirRangeWith299d982c67Szoecarver constexpr bidirectional_iterator<const int*> end() const { return bidirectional_iterator<const int*>{ptr_ + 8}; } 309d982c67Szoecarver }; 319d982c67Szoecarver test()329d982c67Szoecarverconstexpr bool test() { 339d982c67Szoecarver { 349d982c67Szoecarver static_assert( std::default_initializable<std::ranges::reverse_view<BidirRangeWith<DefaultCtor>>>); 359d982c67Szoecarver static_assert(!std::default_initializable<std::ranges::reverse_view<BidirRangeWith<PtrCtor>>>); 369d982c67Szoecarver } 379d982c67Szoecarver 389d982c67Szoecarver { 399d982c67Szoecarver std::ranges::reverse_view<BidirRangeWith<DefaultCtor>> rev; 409d982c67Szoecarver assert(rev.base().ptr_ == nullptr); 419d982c67Szoecarver } 429d982c67Szoecarver { 439d982c67Szoecarver const std::ranges::reverse_view<BidirRangeWith<DefaultCtor>> rev; 449d982c67Szoecarver assert(rev.base().ptr_ == nullptr); 459d982c67Szoecarver } 469d982c67Szoecarver 479d982c67Szoecarver return true; 489d982c67Szoecarver } 499d982c67Szoecarver main(int,char **)509d982c67Szoecarverint main(int, char**) { 519d982c67Szoecarver test(); 529d982c67Szoecarver static_assert(test()); 539d982c67Szoecarver 549d982c67Szoecarver return 0; 559d982c67Szoecarver } 569d982c67Szoecarver 57