//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 // UNSUPPORTED: libcpp-has-no-incomplete-ranges // iterator() = default; #include #include #include "../types.h" struct PODIter { int i; // deliberately uninitialised using iterator_category = std::random_access_iterator_tag; using value_type = int; using difference_type = intptr_t; constexpr int operator*() const { return i; } constexpr PODIter& operator++() { return *this; } constexpr void operator++(int) {} friend constexpr bool operator==(const PODIter&, const PODIter&) = default; }; struct IterDefaultCtrView : std::ranges::view_base { PODIter begin() const; PODIter end() const; }; struct IterNoDefaultCtrView : std::ranges::view_base { cpp20_input_iterator begin() const; sentinel_wrapper> end() const; }; template using zip_iter = std::ranges::iterator_t>; static_assert(!std::default_initializable>); static_assert(!std::default_initializable>); static_assert(!std::default_initializable>); static_assert(std::default_initializable>); static_assert(std::default_initializable>); constexpr bool test() { using ZipIter = zip_iter; { ZipIter iter; auto [x] = *iter; assert(x == 0); // PODIter has to be initialised to have value 0 } { ZipIter iter = {}; auto [x] = *iter; assert(x == 0); // PODIter has to be initialised to have value 0 } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }