xref: /aosp_15_r20/external/clang/test/SemaCXX/cxx0x-initializer-scalars.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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