124dd2d2fSChristopher Di Bella //===----------------------------------------------------------------------===//
224dd2d2fSChristopher Di Bella //
324dd2d2fSChristopher Di Bella // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
424dd2d2fSChristopher Di Bella // See https://llvm.org/LICENSE.txt for license information.
524dd2d2fSChristopher Di Bella // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
624dd2d2fSChristopher Di Bella //
724dd2d2fSChristopher Di Bella //===----------------------------------------------------------------------===//
824dd2d2fSChristopher Di Bella
924dd2d2fSChristopher Di Bella // UNSUPPORTED: c++03, c++11, c++14, c++17
1024dd2d2fSChristopher Di Bella
11e39095a3SLouis Dionne // We voluntarily use std::default_initializable on types that have redundant
12e39095a3SLouis Dionne // or ignored cv-qualifiers -- don't warn about it.
1364addd65SStephan T. Lavavej // ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-ignored-qualifiers
14e39095a3SLouis Dionne
1524dd2d2fSChristopher Di Bella // template<class T>
1624dd2d2fSChristopher Di Bella // concept default_initializable = constructible_from<T> &&
1724dd2d2fSChristopher Di Bella // requires { T{}; } &&
1824dd2d2fSChristopher Di Bella // is-default-initializable<T>;
1924dd2d2fSChristopher Di Bella
2024dd2d2fSChristopher Di Bella #include <array>
2124dd2d2fSChristopher Di Bella #include <concepts>
2224dd2d2fSChristopher Di Bella #include <deque>
2324dd2d2fSChristopher Di Bella #include <forward_list>
2424dd2d2fSChristopher Di Bella #include <list>
2524dd2d2fSChristopher Di Bella #include <map>
2624dd2d2fSChristopher Di Bella #include <memory>
2724dd2d2fSChristopher Di Bella #include <queue>
2824dd2d2fSChristopher Di Bella #include <set>
2924dd2d2fSChristopher Di Bella #include <span>
3024dd2d2fSChristopher Di Bella #include <stack>
3124dd2d2fSChristopher Di Bella #include <string>
3224dd2d2fSChristopher Di Bella #include <string_view>
3324dd2d2fSChristopher Di Bella #include <unordered_map>
3424dd2d2fSChristopher Di Bella #include <unordered_set>
3524dd2d2fSChristopher Di Bella #include <vector>
3624dd2d2fSChristopher Di Bella
3724dd2d2fSChristopher Di Bella #include "test_macros.h"
3824dd2d2fSChristopher Di Bella
3924dd2d2fSChristopher Di Bella struct Empty {};
4024dd2d2fSChristopher Di Bella
4124dd2d2fSChristopher Di Bella struct CtorDefaulted {
4224dd2d2fSChristopher Di Bella CtorDefaulted() = default;
4324dd2d2fSChristopher Di Bella };
4424dd2d2fSChristopher Di Bella struct CtorDeleted {
4524dd2d2fSChristopher Di Bella CtorDeleted() = delete;
4624dd2d2fSChristopher Di Bella };
4724dd2d2fSChristopher Di Bella struct DtorDefaulted {
4824dd2d2fSChristopher Di Bella ~DtorDefaulted() = default;
4924dd2d2fSChristopher Di Bella };
5024dd2d2fSChristopher Di Bella struct DtorDeleted {
5124dd2d2fSChristopher Di Bella ~DtorDeleted() = delete;
5224dd2d2fSChristopher Di Bella };
5324dd2d2fSChristopher Di Bella
5424dd2d2fSChristopher Di Bella struct Noexcept {
5524dd2d2fSChristopher Di Bella ~Noexcept() noexcept;
5624dd2d2fSChristopher Di Bella };
5724dd2d2fSChristopher Di Bella struct NoexceptTrue {
5824dd2d2fSChristopher Di Bella ~NoexceptTrue() noexcept(true);
5924dd2d2fSChristopher Di Bella };
6024dd2d2fSChristopher Di Bella struct NoexceptFalse {
6124dd2d2fSChristopher Di Bella ~NoexceptFalse() noexcept(false);
6224dd2d2fSChristopher Di Bella };
6324dd2d2fSChristopher Di Bella
6424dd2d2fSChristopher Di Bella struct CtorProtected {
6524dd2d2fSChristopher Di Bella protected:
6624dd2d2fSChristopher Di Bella CtorProtected() = default;
6724dd2d2fSChristopher Di Bella };
6824dd2d2fSChristopher Di Bella struct CtorPrivate {
6924dd2d2fSChristopher Di Bella private:
7024dd2d2fSChristopher Di Bella CtorPrivate() = default;
7124dd2d2fSChristopher Di Bella };
7224dd2d2fSChristopher Di Bella struct DtorProtected {
7324dd2d2fSChristopher Di Bella protected:
7424dd2d2fSChristopher Di Bella ~DtorProtected() = default;
7524dd2d2fSChristopher Di Bella };
7624dd2d2fSChristopher Di Bella struct DtorPrivate {
7724dd2d2fSChristopher Di Bella private:
7824dd2d2fSChristopher Di Bella ~DtorPrivate() = default;
7924dd2d2fSChristopher Di Bella };
8024dd2d2fSChristopher Di Bella
8124dd2d2fSChristopher Di Bella template <class T>
8224dd2d2fSChristopher Di Bella struct NoexceptDependant {
8324dd2d2fSChristopher Di Bella ~NoexceptDependant() noexcept(std::is_same_v<T, int>);
8424dd2d2fSChristopher Di Bella };
8524dd2d2fSChristopher Di Bella
8624dd2d2fSChristopher Di Bella struct CtorExplicit {
8724dd2d2fSChristopher Di Bella explicit CtorExplicit() = default;
8824dd2d2fSChristopher Di Bella };
8924dd2d2fSChristopher Di Bella struct CtorArgument {
CtorArgumentCtorArgument9024dd2d2fSChristopher Di Bella CtorArgument(int) {}
9124dd2d2fSChristopher Di Bella };
9224dd2d2fSChristopher Di Bella struct CtorDefaultArgument {
CtorDefaultArgumentCtorDefaultArgument9324dd2d2fSChristopher Di Bella CtorDefaultArgument(int = 0) {}
9424dd2d2fSChristopher Di Bella };
9524dd2d2fSChristopher Di Bella struct CtorExplicitDefaultArgument {
CtorExplicitDefaultArgumentCtorExplicitDefaultArgument9624dd2d2fSChristopher Di Bella explicit CtorExplicitDefaultArgument(int = 0) {}
9724dd2d2fSChristopher Di Bella };
9824dd2d2fSChristopher Di Bella
9924dd2d2fSChristopher Di Bella struct Derived : public Empty {};
10024dd2d2fSChristopher Di Bella
10124dd2d2fSChristopher Di Bella class Abstract {
10224dd2d2fSChristopher Di Bella virtual void foo() = 0;
10324dd2d2fSChristopher Di Bella };
10424dd2d2fSChristopher Di Bella
10524dd2d2fSChristopher Di Bella class AbstractDestructor {
10624dd2d2fSChristopher Di Bella virtual ~AbstractDestructor() = 0;
10724dd2d2fSChristopher Di Bella };
10824dd2d2fSChristopher Di Bella
10924dd2d2fSChristopher Di Bella class OperatorNewDeleted {
11024dd2d2fSChristopher Di Bella void* operator new(std::size_t) = delete;
11124dd2d2fSChristopher Di Bella void operator delete(void* ptr) = delete;
11224dd2d2fSChristopher Di Bella };
11324dd2d2fSChristopher Di Bella
__anon017509f20102(const int&, int&&, double)11424dd2d2fSChristopher Di Bella [[maybe_unused]] auto Lambda = [](const int&, int&&, double){};
11524dd2d2fSChristopher Di Bella
11624dd2d2fSChristopher Di Bella template<class T>
test_not_const()11724dd2d2fSChristopher Di Bella void test_not_const()
11824dd2d2fSChristopher Di Bella {
11924dd2d2fSChristopher Di Bella static_assert( std::default_initializable< T>);
12024dd2d2fSChristopher Di Bella static_assert(!std::default_initializable<const T>);
12124dd2d2fSChristopher Di Bella static_assert( std::default_initializable< volatile T>);
12224dd2d2fSChristopher Di Bella static_assert(!std::default_initializable<const volatile T>);
12324dd2d2fSChristopher Di Bella }
12424dd2d2fSChristopher Di Bella
12524dd2d2fSChristopher Di Bella template<class T>
test_true()12624dd2d2fSChristopher Di Bella void test_true()
12724dd2d2fSChristopher Di Bella {
12824dd2d2fSChristopher Di Bella static_assert( std::default_initializable< T>);
12924dd2d2fSChristopher Di Bella static_assert( std::default_initializable<const T>);
13024dd2d2fSChristopher Di Bella static_assert( std::default_initializable< volatile T>);
13124dd2d2fSChristopher Di Bella static_assert( std::default_initializable<const volatile T>);
13224dd2d2fSChristopher Di Bella }
13324dd2d2fSChristopher Di Bella
13424dd2d2fSChristopher Di Bella template<class T>
test_false()13524dd2d2fSChristopher Di Bella void test_false()
13624dd2d2fSChristopher Di Bella {
13724dd2d2fSChristopher Di Bella static_assert(!std::default_initializable< T>);
13824dd2d2fSChristopher Di Bella static_assert(!std::default_initializable<const T>);
13924dd2d2fSChristopher Di Bella static_assert(!std::default_initializable< volatile T>);
14024dd2d2fSChristopher Di Bella static_assert(!std::default_initializable<const volatile T>);
14124dd2d2fSChristopher Di Bella }
14224dd2d2fSChristopher Di Bella
test()14324dd2d2fSChristopher Di Bella void test()
14424dd2d2fSChristopher Di Bella {
14524dd2d2fSChristopher Di Bella test_not_const<bool>();
14624dd2d2fSChristopher Di Bella test_not_const<char>();
14724dd2d2fSChristopher Di Bella test_not_const<int>();
14824dd2d2fSChristopher Di Bella test_not_const<double>();
14924dd2d2fSChristopher Di Bella
15024dd2d2fSChristopher Di Bella test_false <void>();
15124dd2d2fSChristopher Di Bella test_not_const<void*>();
15224dd2d2fSChristopher Di Bella
15324dd2d2fSChristopher Di Bella test_not_const<int*>();
15424dd2d2fSChristopher Di Bella test_false <int[]>();
15524dd2d2fSChristopher Di Bella test_not_const<int[1]>();
15624dd2d2fSChristopher Di Bella test_false <int&>();
15724dd2d2fSChristopher Di Bella test_false <int&&>();
15824dd2d2fSChristopher Di Bella
15924dd2d2fSChristopher Di Bella test_true <Empty>();
16024dd2d2fSChristopher Di Bella
16124dd2d2fSChristopher Di Bella test_true <CtorDefaulted>();
16224dd2d2fSChristopher Di Bella test_false <CtorDeleted>();
16324dd2d2fSChristopher Di Bella test_true <DtorDefaulted>();
16424dd2d2fSChristopher Di Bella test_false <DtorDeleted>();
16524dd2d2fSChristopher Di Bella
16624dd2d2fSChristopher Di Bella test_true <Noexcept>();
16724dd2d2fSChristopher Di Bella test_true <NoexceptTrue>();
16824dd2d2fSChristopher Di Bella test_false <NoexceptFalse>();
16924dd2d2fSChristopher Di Bella
17024dd2d2fSChristopher Di Bella test_false <CtorProtected>();
17124dd2d2fSChristopher Di Bella test_false <CtorPrivate>();
17224dd2d2fSChristopher Di Bella test_false <DtorProtected>();
17324dd2d2fSChristopher Di Bella test_false <DtorPrivate>();
17424dd2d2fSChristopher Di Bella
17524dd2d2fSChristopher Di Bella test_true <NoexceptDependant<int>>();
17624dd2d2fSChristopher Di Bella test_false <NoexceptDependant<double>>();
17724dd2d2fSChristopher Di Bella
17824dd2d2fSChristopher Di Bella test_true <CtorExplicit>();
17924dd2d2fSChristopher Di Bella test_false <CtorArgument>();
18024dd2d2fSChristopher Di Bella test_true <CtorDefaultArgument>();
18124dd2d2fSChristopher Di Bella test_true <CtorExplicitDefaultArgument>();
18224dd2d2fSChristopher Di Bella
18324dd2d2fSChristopher Di Bella test_true <Derived>();
18424dd2d2fSChristopher Di Bella test_false <Abstract>();
18524dd2d2fSChristopher Di Bella test_false <AbstractDestructor>();
18624dd2d2fSChristopher Di Bella
18724dd2d2fSChristopher Di Bella test_true <OperatorNewDeleted>();
18824dd2d2fSChristopher Di Bella
18924dd2d2fSChristopher Di Bella test_true <decltype(Lambda)>();
19024dd2d2fSChristopher Di Bella test_not_const<void(*)(const int&)>();
19124dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) >();
19224dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) const >();
19324dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) volatile>();
19424dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) const volatile>();
19524dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) &>();
19624dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) &&>();
19724dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) noexcept>();
19824dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) noexcept(true)>();
19924dd2d2fSChristopher Di Bella test_not_const<void(Empty::*)(const int&) noexcept(false)>();
20024dd2d2fSChristopher Di Bella
20124dd2d2fSChristopher Di Bella // Sequence containers
202*70bcd81eSLouis Dionne test_true <std::array< int, 0>>();
20324dd2d2fSChristopher Di Bella test_not_const<std::array< int, 1>>();
20424dd2d2fSChristopher Di Bella test_false <std::array<const int, 1>>();
20524dd2d2fSChristopher Di Bella test_not_const<std::array< volatile int, 1>>();
20624dd2d2fSChristopher Di Bella test_false <std::array<const volatile int, 1>>();
20724dd2d2fSChristopher Di Bella test_true <std::deque< int>>();
20824dd2d2fSChristopher Di Bella test_true <std::forward_list<int>>();
20924dd2d2fSChristopher Di Bella test_true <std::list<int>>();
21024dd2d2fSChristopher Di Bella test_true <std::vector<int>>();
21124dd2d2fSChristopher Di Bella
21224dd2d2fSChristopher Di Bella // Associative containers
21324dd2d2fSChristopher Di Bella test_true <std::set<int>>();
21424dd2d2fSChristopher Di Bella test_true <std::map<int, int>>();
21524dd2d2fSChristopher Di Bella test_true <std::multiset<int>>();
21624dd2d2fSChristopher Di Bella test_true <std::multimap<int, int>>();
21724dd2d2fSChristopher Di Bella
21824dd2d2fSChristopher Di Bella // Unordered associative containers
21924dd2d2fSChristopher Di Bella test_true <std::unordered_set<int>>();
22024dd2d2fSChristopher Di Bella test_true <std::unordered_map<int, int>>();
22124dd2d2fSChristopher Di Bella test_true <std::unordered_multiset<int>>();
22224dd2d2fSChristopher Di Bella test_true <std::unordered_multimap<int, int>>();
22324dd2d2fSChristopher Di Bella
22424dd2d2fSChristopher Di Bella // Container adaptors
22524dd2d2fSChristopher Di Bella test_true <std::stack< int>>();
22624dd2d2fSChristopher Di Bella test_true <std::queue<int>>();
22724dd2d2fSChristopher Di Bella test_true <std::priority_queue<int>>();
22824dd2d2fSChristopher Di Bella
22924dd2d2fSChristopher Di Bella test_true <std::span< int>>();
23024dd2d2fSChristopher Di Bella test_true <std::span<const int>>();
23124dd2d2fSChristopher Di Bella test_true <std::span< volatile int>>();
23224dd2d2fSChristopher Di Bella test_true <std::span<const volatile int>>();
23324dd2d2fSChristopher Di Bella
23424dd2d2fSChristopher Di Bella // Strings
23524dd2d2fSChristopher Di Bella test_true <std::string>();
236f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
23724dd2d2fSChristopher Di Bella test_true <std::wstring>();
238f4c1258dSLouis Dionne #endif
23924dd2d2fSChristopher Di Bella test_true <std::u8string>();
24024dd2d2fSChristopher Di Bella test_true <std::u16string>();
24124dd2d2fSChristopher Di Bella test_true <std::u32string>();
24224dd2d2fSChristopher Di Bella
24324dd2d2fSChristopher Di Bella // String views
24424dd2d2fSChristopher Di Bella test_true <std::string_view>();
245f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
24624dd2d2fSChristopher Di Bella test_true <std::wstring_view>();
247f4c1258dSLouis Dionne #endif
24824dd2d2fSChristopher Di Bella test_true <std::u8string_view>();
24924dd2d2fSChristopher Di Bella test_true <std::u16string_view>();
25024dd2d2fSChristopher Di Bella test_true <std::u32string_view>();
25124dd2d2fSChristopher Di Bella
25224dd2d2fSChristopher Di Bella // Smart pointers
25324dd2d2fSChristopher Di Bella test_true <std::unique_ptr<int>>();
25424dd2d2fSChristopher Di Bella test_true <std::shared_ptr<int>>();
25524dd2d2fSChristopher Di Bella test_true <std::weak_ptr<int>>();
25624dd2d2fSChristopher Di Bella
25724dd2d2fSChristopher Di Bella }
258