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-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03, c++11, c++14, c++17
10
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

source code of libcxx/test/std/concepts/concepts.lang/concept.constructible/constructible_from.compile.pass.cpp