brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 505ed2e Raw
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