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