1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -pedantic-errors 2*67e74705SXin Li 3*67e74705SXin Li struct one { char c[1]; }; 4*67e74705SXin Li struct two { char c[2]; }; 5*67e74705SXin Li 6*67e74705SXin Li namespace std { 7*67e74705SXin Li typedef decltype(sizeof(int)) size_t; 8*67e74705SXin Li 9*67e74705SXin Li // libc++'s implementation 10*67e74705SXin Li template <class _E> 11*67e74705SXin Li class initializer_list 12*67e74705SXin Li { 13*67e74705SXin Li const _E* __begin_; 14*67e74705SXin Li size_t __size_; 15*67e74705SXin Li initializer_list(const _E * __b,size_t __s)16*67e74705SXin Li initializer_list(const _E* __b, size_t __s) 17*67e74705SXin Li : __begin_(__b), 18*67e74705SXin Li __size_(__s) 19*67e74705SXin Li {} 20*67e74705SXin Li 21*67e74705SXin Li public: 22*67e74705SXin Li typedef _E value_type; 23*67e74705SXin Li typedef const _E& reference; 24*67e74705SXin Li typedef const _E& const_reference; 25*67e74705SXin Li typedef size_t size_type; 26*67e74705SXin Li 27*67e74705SXin Li typedef const _E* iterator; 28*67e74705SXin Li typedef const _E* const_iterator; 29*67e74705SXin Li initializer_list()30*67e74705SXin Li initializer_list() : __begin_(nullptr), __size_(0) {} 31*67e74705SXin Li size() const32*67e74705SXin Li size_t size() const {return __size_;} begin() const33*67e74705SXin Li const _E* begin() const {return __begin_;} end() const34*67e74705SXin Li const _E* end() const {return __begin_ + __size_;} 35*67e74705SXin Li }; 36*67e74705SXin Li } 37*67e74705SXin Li 38*67e74705SXin Li namespace integral { 39*67e74705SXin Li initialization()40*67e74705SXin Li void initialization() { 41*67e74705SXin Li { const int a{}; static_assert(a == 0, ""); } 42*67e74705SXin Li { const int a = {}; static_assert(a == 0, ""); } 43*67e74705SXin Li { const int a{1}; static_assert(a == 1, ""); } 44*67e74705SXin Li { const int a = {1}; static_assert(a == 1, ""); } 45*67e74705SXin Li { const int a{1, 2}; } // expected-error {{excess elements}} 46*67e74705SXin Li { const int a = {1, 2}; } // expected-error {{excess elements}} 47*67e74705SXin Li // FIXME: Redundant warnings. 48*67e74705SXin Li { const short a{100000}; } // expected-error {{cannot be narrowed}} expected-note {{insert an explicit cast}} expected-warning {{changes value}} 49*67e74705SXin Li { const short a = {100000}; } // expected-error {{cannot be narrowed}} expected-note {{insert an explicit cast}} expected-warning {{changes value}} 50*67e74705SXin Li { if (const int a{1}) static_assert(a == 1, ""); } 51*67e74705SXin Li { if (const int a = {1}) static_assert(a == 1, ""); } 52*67e74705SXin Li } 53*67e74705SXin Li direct_usage()54*67e74705SXin Li int direct_usage() { 55*67e74705SXin Li int ar[10]; 56*67e74705SXin Li (void) ar[{1}]; // expected-error {{array subscript is not an integer}} 57*67e74705SXin Li 58*67e74705SXin Li return {1}; // expected-warning {{braces around scalar init}} 59*67e74705SXin Li } 60*67e74705SXin Li inline_init()61*67e74705SXin Li void inline_init() { 62*67e74705SXin Li auto v = int{1}; 63*67e74705SXin Li (void) new int{1}; 64*67e74705SXin Li } 65*67e74705SXin Li 66*67e74705SXin Li struct A { 67*67e74705SXin Li int i; Aintegral::A68*67e74705SXin Li A() : i{1} {} 69*67e74705SXin Li }; 70*67e74705SXin Li function_call()71*67e74705SXin Li void function_call() { 72*67e74705SXin Li void takes_int(int); 73*67e74705SXin Li takes_int({1}); // expected-warning {{braces around scalar init}} 74*67e74705SXin Li } 75*67e74705SXin Li overloaded_call()76*67e74705SXin Li void overloaded_call() { 77*67e74705SXin Li one overloaded(int); 78*67e74705SXin Li two overloaded(double); 79*67e74705SXin Li 80*67e74705SXin Li static_assert(sizeof(overloaded({0})) == sizeof(one), "bad overload"); // expected-warning {{braces around scalar init}} 81*67e74705SXin Li static_assert(sizeof(overloaded({0.0})) == sizeof(two), "bad overload"); // expected-warning {{braces around scalar init}} 82*67e74705SXin Li 83*67e74705SXin Li void ambiguous(int, double); // expected-note {{candidate}} 84*67e74705SXin Li void ambiguous(double, int); // expected-note {{candidate}} 85*67e74705SXin Li ambiguous({0}, {0}); // expected-error {{ambiguous}} 86*67e74705SXin Li 87*67e74705SXin Li void emptylist(int); 88*67e74705SXin Li void emptylist(int, int, int); 89*67e74705SXin Li emptylist({}); 90*67e74705SXin Li emptylist({}, {}, {}); 91*67e74705SXin Li } 92*67e74705SXin Li edge_cases()93*67e74705SXin Li void edge_cases() { 94*67e74705SXin Li // FIXME: very poor error message 95*67e74705SXin Li int a({0}); // expected-error {{cannot initialize}} 96*67e74705SXin Li (void) int({0}); // expected-error {{functional-style cast}} 97*67e74705SXin Li new int({0}); // expected-error {{cannot initialize}} 98*67e74705SXin Li } 99*67e74705SXin Li default_argument(int i={})100*67e74705SXin Li void default_argument(int i = {}) { 101*67e74705SXin Li } 102*67e74705SXin Li struct DefaultArgument { default_argumentintegral::DefaultArgument103*67e74705SXin Li void default_argument(int i = {}) { 104*67e74705SXin Li } 105*67e74705SXin Li }; 106*67e74705SXin Li } 107*67e74705SXin Li 108*67e74705SXin Li namespace PR12118 { test()109*67e74705SXin Li void test() { 110*67e74705SXin Li one f(std::initializer_list<int>); 111*67e74705SXin Li two f(int); 112*67e74705SXin Li 113*67e74705SXin Li // to initializer_list is preferred 114*67e74705SXin Li static_assert(sizeof(f({0})) == sizeof(one), "bad overload"); 115*67e74705SXin Li } 116*67e74705SXin Li } 117