brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 7bd1adc Raw
64 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//10// This test pins down the ABI of std::pair with respect to being "trivially copyable".11//12 13// This test doesn't work when the deprecated ABI to turn off pair triviality is enabled.14// See libcxx/test/libcxx/utilities/utility/pairs/pairs.pair/abi.non_trivial_copy_move.pass.cpp instead.15// UNSUPPORTED: libcpp-deprecated-abi-disable-pair-trivial-copy-ctor16 17#include <type_traits>18#include <utility>19 20#include "test_macros.h"21 22struct trivially_copyable {23  int arr[4];24};25 26struct trivially_copyable_no_copy_assignment {27  int arr[4];28  trivially_copyable_no_copy_assignment& operator=(const trivially_copyable_no_copy_assignment&) = delete;29};30static_assert(std::is_trivially_copyable<trivially_copyable_no_copy_assignment>::value, "");31 32struct trivially_copyable_no_move_assignment {33  int arr[4];34  trivially_copyable_no_move_assignment& operator=(const trivially_copyable_no_move_assignment&) = delete;35};36static_assert(std::is_trivially_copyable<trivially_copyable_no_move_assignment>::value, "");37 38struct trivially_copyable_no_construction {39  int arr[4];40  trivially_copyable_no_construction()                                                     = default;41  trivially_copyable_no_construction(const trivially_copyable_no_construction&)            = delete;42  trivially_copyable_no_construction& operator=(const trivially_copyable_no_construction&) = default;43};44static_assert(std::is_trivially_copyable<trivially_copyable_no_construction>::value, "");45 46static_assert(!std::is_trivially_copyable<std::pair<int&, int> >::value, "");47static_assert(!std::is_trivially_copyable<std::pair<int, int&> >::value, "");48static_assert(!std::is_trivially_copyable<std::pair<int&, int&> >::value, "");49 50static_assert(!std::is_trivially_copyable<std::pair<int, int> >::value, "");51static_assert(!std::is_trivially_copyable<std::pair<int, char> >::value, "");52static_assert(!std::is_trivially_copyable<std::pair<char, int> >::value, "");53static_assert(!std::is_trivially_copyable<std::pair<std::pair<char, char>, int> >::value, "");54static_assert(!std::is_trivially_copyable<std::pair<trivially_copyable, int> >::value, "");55static_assert(!std::is_trivially_copyable<std::pair<trivially_copyable_no_copy_assignment, int> >::value, "");56static_assert(!std::is_trivially_copyable<std::pair<trivially_copyable_no_move_assignment, int> >::value, "");57static_assert(!std::is_trivially_copyable<std::pair<trivially_copyable_no_construction, int> >::value, "");58 59static_assert(std::is_trivially_copy_constructible<std::pair<int, int> >::value, "");60static_assert(std::is_trivially_move_constructible<std::pair<int, int> >::value, "");61static_assert(!std::is_trivially_copy_assignable<std::pair<int, int> >::value, "");62static_assert(!std::is_trivially_move_assignable<std::pair<int, int> >::value, "");63static_assert(std::is_trivially_destructible<std::pair<int, int> >::value, "");64