//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // We voluntarily use std::default_initializable on types that have redundant // or ignored cv-qualifiers -- don't warn about it. // ADDITIONAL_COMPILE_FLAGS(gcc-style-warnings): -Wno-ignored-qualifiers // template // concept default_initializable = constructible_from && // requires { T{}; } && // is-default-initializable; #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "test_macros.h" struct Empty {}; struct CtorDefaulted { CtorDefaulted() = default; }; struct CtorDeleted { CtorDeleted() = delete; }; struct DtorDefaulted { ~DtorDefaulted() = default; }; struct DtorDeleted { ~DtorDeleted() = delete; }; struct Noexcept { ~Noexcept() noexcept; }; struct NoexceptTrue { ~NoexceptTrue() noexcept(true); }; struct NoexceptFalse { ~NoexceptFalse() noexcept(false); }; struct CtorProtected { protected: CtorProtected() = default; }; struct CtorPrivate { private: CtorPrivate() = default; }; struct DtorProtected { protected: ~DtorProtected() = default; }; struct DtorPrivate { private: ~DtorPrivate() = default; }; template struct NoexceptDependant { ~NoexceptDependant() noexcept(std::is_same_v); }; struct CtorExplicit { explicit CtorExplicit() = default; }; struct CtorArgument { CtorArgument(int) {} }; struct CtorDefaultArgument { CtorDefaultArgument(int = 0) {} }; struct CtorExplicitDefaultArgument { explicit CtorExplicitDefaultArgument(int = 0) {} }; struct Derived : public Empty {}; class Abstract { virtual void foo() = 0; }; class AbstractDestructor { virtual ~AbstractDestructor() = 0; }; class OperatorNewDeleted { void* operator new(std::size_t) = delete; void operator delete(void* ptr) = delete; }; [[maybe_unused]] auto Lambda = [](const int&, int&&, double){}; template void test_not_const() { static_assert( std::default_initializable< T>); static_assert(!std::default_initializable); static_assert( std::default_initializable< volatile T>); static_assert(!std::default_initializable); } template void test_true() { static_assert( std::default_initializable< T>); static_assert( std::default_initializable); static_assert( std::default_initializable< volatile T>); static_assert( std::default_initializable); } template void test_false() { static_assert(!std::default_initializable< T>); static_assert(!std::default_initializable); static_assert(!std::default_initializable< volatile T>); static_assert(!std::default_initializable); } void test() { test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_false (); test_not_const(); test_not_const(); test_false (); test_not_const(); test_false (); test_false (); test_true (); test_true (); test_false (); test_true (); test_false (); test_true (); test_true (); test_false (); test_false (); test_false (); test_false (); test_false (); test_true >(); test_false >(); test_true (); test_false (); test_true (); test_true (); test_true (); test_false (); test_false (); test_true (); test_true (); test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_not_const(); test_not_const(); // Sequence containers test_true >(); test_not_const>(); test_false >(); test_not_const>(); test_false >(); test_true >(); test_true >(); test_true >(); test_true >(); // Associative containers test_true >(); test_true >(); test_true >(); test_true >(); // Unordered associative containers test_true >(); test_true >(); test_true >(); test_true >(); // Container adaptors test_true >(); test_true >(); test_true >(); test_true >(); test_true >(); test_true >(); test_true >(); // Strings test_true (); #ifndef TEST_HAS_NO_WIDE_CHARACTERS test_true (); #endif test_true (); test_true (); test_true (); // String views test_true (); #ifndef TEST_HAS_NO_WIDE_CHARACTERS test_true (); #endif test_true (); test_true (); test_true (); // Smart pointers test_true >(); test_true >(); test_true >(); }