72 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// Test that views that use __movable_box do not overwrite overlapping subobjects.12// https://llvm.org/PR7050613 14#include <cassert>15#include <ranges>16 17#include "test_macros.h"18 19struct Pred {20 alignas(128) bool a{};21 22 Pred() noexcept = default;23 Pred(const Pred&) noexcept = default;24 Pred(Pred&&) noexcept = default;25 26 Pred& operator=(const Pred&) = delete;27 Pred& operator=(Pred&&) = delete;28 29 constexpr bool operator()(const auto&...) const { return true; }30};31 32struct View : std::ranges::view_base {33 constexpr int* begin() const { return nullptr; }34 constexpr int* end() const { return nullptr; }35};36 37template <class View>38struct S {39 [[no_unique_address]] View view{};40 char c = 42;41};42 43template <class View>44constexpr void testOne() {45 S<View> s1;46 assert(s1.c == 42);47 s1.view = View{};48 assert(s1.c == 42);49}50 51constexpr bool test() {52 testOne<std::ranges::transform_view<View, Pred>>();53 testOne<std::ranges::filter_view<View, Pred>>();54 testOne<std::ranges::drop_while_view<View, Pred>>();55 testOne<std::ranges::take_while_view<View, Pred>>();56 testOne<std::ranges::single_view<Pred>>();57 58#if TEST_STD_VER >= 2359 testOne<std::ranges::chunk_by_view<View, Pred>>();60 testOne<std::ranges::repeat_view<Pred>>();61 testOne<std::ranges::zip_transform_view<Pred, View>>();62#endif63 return true;64}65 66int main(int, char**) {67 static_assert(test());68 test();69 70 return 0;71}72