68 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>12// concept default_initializable = constructible_from<T> &&13// requires { T{}; } &&14// is-default-initializable<T>;15 16#include <concepts>17#include <cassert>18 19#include "test_macros.h"20 21template<class T>22concept brace_initializable = requires { T{}; };23 24void test() {25 // LWG314926 // Changed the concept from constructible_from<T>27 // to constructible_from<T> &&28 // requires { T{}; } && is-default-initializable <T>29 struct S0 { explicit S0() = default; };30 S0 x0;31 S0 y0{};32 static_assert(std::constructible_from<S0>);33 static_assert(brace_initializable<S0>);34 LIBCPP_STATIC_ASSERT(std::__default_initializable<S0>);35 static_assert(std::default_initializable<S0>);36 37 struct S1 { S0 x; }; // Note: aggregate38 S1 x1;39 S1 y1{}; // expected-error {{chosen constructor is explicit in copy-initialization}}40 static_assert(std::constructible_from<S1>);41 static_assert(!brace_initializable<S1>);42 LIBCPP_STATIC_ASSERT(std::__default_initializable<S1>);43 static_assert(!std::default_initializable<S1>);44 45 const int x2; // expected-error {{default initialization of an object of const type 'const int'}}46 const int y2{};47 48 static_assert(std::constructible_from<const int>);49 static_assert(brace_initializable<const int>);50 LIBCPP_STATIC_ASSERT(!std::__default_initializable<const int>);51 static_assert(!std::default_initializable<const int>);52 53 const int x3[1]; // expected-error-re {{default initialization of an object of const type 'const int{{[ ]*}}[1]'}}54 const int y3[1]{};55 static_assert(std::constructible_from<const int[1]>);56 static_assert(brace_initializable<const int[1]>);57 LIBCPP_STATIC_ASSERT(!std::__default_initializable<const int[1]>);58 static_assert(!std::default_initializable<const int[1]>);59 60 // Zero-length array extension61 const int x4[]; // expected-error {{definition of variable with array type needs an explicit size or an initializer}}62 const int y4[]{};63 static_assert(!std::constructible_from<const int[]>);64 static_assert(brace_initializable<const int[]>);65 LIBCPP_STATIC_ASSERT(!std::__default_initializable<const int[]>);66 static_assert(!std::default_initializable<const int[]>);67}68