//===----------------------------------------------------------------------===// // // 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 // template // concept default_initializable = constructible_from && // requires { T{}; } && // is-default-initializable; #include #include #include "test_macros.h" template concept brace_initializable = requires { T{}; }; void test() { // LWG3149 // Changed the concept from constructible_from // to constructible_from && // requires { T{}; } && is-default-initializable struct S0 { explicit S0() = default; }; S0 x0; S0 y0{}; static_assert(std::constructible_from); static_assert(brace_initializable); LIBCPP_STATIC_ASSERT(std::__default_initializable); static_assert(std::default_initializable); struct S1 { S0 x; }; // Note: aggregate S1 x1; S1 y1{}; // expected-error {{chosen constructor is explicit in copy-initialization}} static_assert(std::constructible_from); static_assert(!brace_initializable); LIBCPP_STATIC_ASSERT(std::__default_initializable); static_assert(!std::default_initializable); const int x2; // expected-error {{default initialization of an object of const type 'const int'}} const int y2{}; static_assert(std::constructible_from); static_assert(brace_initializable); LIBCPP_STATIC_ASSERT(!std::__default_initializable); static_assert(!std::default_initializable); const int x3[1]; // expected-error-re {{default initialization of an object of const type 'const int{{[ ]*}}[1]'}} const int y3[1]{}; static_assert(std::constructible_from); static_assert(brace_initializable); LIBCPP_STATIC_ASSERT(!std::__default_initializable); static_assert(!std::default_initializable); // Zero-length array extension const int x4[]; // expected-error {{definition of variable with array type needs an explicit size or an initializer}} const int y4[]{}; static_assert(!std::constructible_from); static_assert(brace_initializable); LIBCPP_STATIC_ASSERT(!std::__default_initializable); static_assert(!std::default_initializable); }