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