brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · e3b58d6 Raw
152 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// template<class T, class... Args>12// concept constructible_from;13//    destructible<T> && is_constructible_v<T, Args...>;14 15#include <array>16#include <concepts>17#include <cstddef>18#include <memory>19#include <string>20#include <type_traits>21 22struct Empty {};23 24struct Defaulted {25  ~Defaulted() = default;26};27struct Deleted {28  ~Deleted() = delete;29};30 31struct Noexcept {32  ~Noexcept() noexcept;33};34struct NoexceptTrue {35  ~NoexceptTrue() noexcept(true);36};37struct NoexceptFalse {38  ~NoexceptFalse() noexcept(false);39};40 41struct Protected {42protected:43  ~Protected() = default;44};45struct Private {46private:47  ~Private() = default;48};49 50template <class T>51struct NoexceptDependant {52  ~NoexceptDependant() noexcept(std::is_same_v<T, int>);53};54 55template <class T, class... Args>56void test() {57  static_assert(std::constructible_from<T, Args...> ==58                (std::destructible<T> && std::is_constructible_v<T, Args...>));59}60 61void test() {62  test<bool>();63  test<bool, bool>();64 65  test<char>();66  test<char, char>();67  test<char, int>();68 69  test<int>();70  test<int, int>();71  test<int, int, int>();72 73  test<double, int>();74  test<double, float>();75  test<double, long double>();76 77  test<void>();78  test<void, bool>();79  test<void, int>();80 81  test<void*>();82  test<void*, std::nullptr_t>();83 84  test<int*>();85  test<int*, std::nullptr_t>();86  test<int[], int, int, int>();87  test<int[1]>();88  test<int[1], int>();89  test<int[1], int, int>();90 91  test<int (*)(int)>();92  test<int (*)(int), int>();93  test<int (*)(int), double>();94  test<int (*)(int), std::nullptr_t>();95  test<int (*)(int), int (*)(int)>();96 97  test<void (Empty::*)(const int&)>();98  test<void (Empty::*)(const int&), std::nullptr_t>();99  test<void (Empty::*)(const int&) const>();100  test<void (Empty::*)(const int&) const, void (Empty::*)(const int&)>();101  test<void (Empty::*)(const int&) volatile>();102  test<void (Empty::*)(const int&) volatile,103       void (Empty::*)(const int&) const volatile>();104  test<void (Empty::*)(const int&) const volatile>();105  test<void (Empty::*)(const int&) const volatile, double>();106  test<void (Empty::*)(const int&)&>();107  test<void (Empty::*)(const int&)&, void (Empty::*)(const int&) &&>();108  test<void (Empty::*)(const int&) &&>();109  test<void (Empty::*)(const int&)&&, void (Empty::*)(const int&)>();110  test<void (Empty::*)(const int&) throw()>();111  test<void (Empty::*)(const int&) throw(),112       void(Empty::*)(const int&) noexcept(true)>();113  test<void (Empty::*)(const int&) noexcept>();114  test<void (Empty::*)(const int&) noexcept(true)>();115  test<void (Empty::*)(const int&) noexcept(true),116       void (Empty::*)(const int&) noexcept(false)>();117  test<void (Empty::*)(const int&) noexcept(false)>();118 119  test<int&>();120  test<int&, int>();121  test<int&&>();122  test<int&&, int>();123 124  test<Empty>();125 126  test<Defaulted>();127  test<Deleted>();128 129  test<NoexceptTrue>();130  test<NoexceptFalse>();131  test<Noexcept>();132 133  test<Protected>();134  test<Private>();135 136  test<NoexceptDependant<int> >();137  test<NoexceptDependant<double> >();138 139  test<std::string, char*>();140  test<std::string, const char*>();141  test<std::string, std::string&>();142  test<std::string, std::initializer_list<char> >();143 144  test<std::unique_ptr<int>, std::unique_ptr<int> >();145  test<std::unique_ptr<int>, std::unique_ptr<int>&>();146  test<std::unique_ptr<int>, std::unique_ptr<int>&&>();147 148  test<std::array<int, 1> >();149  test<std::array<int, 1>, int>();150  test<std::array<int, 1>, int, int>();151}152