brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 0ed2b22 Raw
63 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// <bit>12//13// template<class To, class From>14//   constexpr To bit_cast(const From& from) noexcept; // C++2015 16// This test makes sure that std::bit_cast fails when any of the following17// constraints are violated:18//19//      (1.1) sizeof(To) == sizeof(From) is true;20//      (1.2) is_trivially_copyable_v<To> is true;21//      (1.3) is_trivially_copyable_v<From> is true.22//23// Also check that it's ill-formed when the return type would be24// ill-formed, even though that is not explicitly mentioned in the25// specification (but it can be inferred from the synopsis).26 27#include <bit>28#include <concepts>29 30template<class To, class From>31concept bit_cast_is_valid = requires(From from) {32    { std::bit_cast<To>(from) } -> std::same_as<To>;33};34 35// Types are not the same size36namespace ns1 {37    struct To { char a; };38    struct From { char a; char b; };39    static_assert(!bit_cast_is_valid<To, From>);40    static_assert(!bit_cast_is_valid<From&, From>);41}42 43// To is not trivially copyable44namespace ns2 {45    struct To { char a; To(To const&); };46    struct From { char a; };47    static_assert(!bit_cast_is_valid<To, From>);48}49 50// From is not trivially copyable51namespace ns3 {52    struct To { char a; };53    struct From { char a; From(From const&); };54    static_assert(!bit_cast_is_valid<To, From>);55}56 57// The return type is ill-formed58namespace ns4 {59    struct From { char a; char b; };60    static_assert(!bit_cast_is_valid<char[2], From>);61    static_assert(!bit_cast_is_valid<int(), From>);62}63