1 | // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s |
2 | // RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s |
3 | // FIXME: Remove the triple when PR27098 is fixed. |
4 | // RUN: %clang_cc1 -std=c++1z -fsyntax-only -verify %s -triple %itanium_abi_triple |
5 | |
6 | namespace std { |
7 | typedef decltype(sizeof(int)) size_t; |
8 | |
9 | template <typename E> |
10 | struct initializer_list |
11 | { |
12 | const E *p; |
13 | size_t n; |
14 | initializer_list(const E *p, size_t n) : p(p), n(n) {} |
15 | }; |
16 | |
17 | struct string { |
18 | string(const char *); |
19 | }; |
20 | |
21 | template<typename A, typename B> |
22 | struct pair { |
23 | pair(const A&, const B&); |
24 | }; |
25 | } |
26 | |
27 | namespace bullet1 { |
28 | double ad[] = { 1, 2.0 }; |
29 | int ai[] = { 1, 2.0 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} |
30 | |
31 | struct S2 { |
32 | int m1; |
33 | double m2, m3; |
34 | }; |
35 | |
36 | S2 s21 = { 1, 2, 3.0 }; |
37 | S2 s22 { 1.0, 2, 3 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} |
38 | S2 s23 { }; |
39 | } |
40 | |
41 | namespace bullet4_example1 { |
42 | struct S { |
43 | S(std::initializer_list<double> d) {} |
44 | S(std::initializer_list<int> i) {} |
45 | S() {} |
46 | }; |
47 | |
48 | S s1 = { 1.0, 2.0, 3.0 }; |
49 | S s2 = { 1, 2, 3 }; |
50 | S s3 = { }; |
51 | } |
52 | |
53 | namespace bullet4_example2 { |
54 | struct Map { |
55 | Map(std::initializer_list<std::pair<std::string,int>>) {} |
56 | }; |
57 | |
58 | Map ship = {{"Sophie",14}, {"Surprise",28}}; |
59 | } |
60 | |
61 | namespace bullet4_example3 { |
62 | struct S { |
63 | S(int, double, double) {} |
64 | S() {} |
65 | }; |
66 | |
67 | S s1 = { 1, 2, 3.0 }; |
68 | S s2 { 1.0, 2, 3 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} |
69 | S s3 {}; |
70 | } |
71 | |
72 | namespace bullet5 { |
73 | int x1 {2}; |
74 | int x2 {2.0}; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} |
75 | } |
76 | |
77 | namespace bullet6 { |
78 | struct S { |
79 | S(std::initializer_list<double>) {} |
80 | S(const std::string &) {} |
81 | }; |
82 | |
83 | const S& r1 = { 1, 2, 3.0 }; |
84 | const S& r2 = { "Spinach" }; |
85 | S& r3 = { 1, 2, 3 }; // expected-error {{non-const lvalue reference to type 'bullet6::S' cannot bind to an initializer list temporary}} |
86 | const int& i1 = { 1 }; |
87 | const int& i2 = { 1.1 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} expected-warning {{implicit conversion}} |
88 | const int (&iar)[2] = { 1, 2 }; |
89 | } |
90 | |
91 | namespace bullet7 { |
92 | int** pp {}; |
93 | } |
94 | |
95 | namespace bullet8 { |
96 | struct A { int i; int j; }; |
97 | A a1 { 1, 2 }; |
98 | A a2 { 1.2 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} expected-warning {{implicit conversion}} |
99 | |
100 | struct B { |
101 | B(std::initializer_list<int> i) {} |
102 | }; |
103 | B b1 { 1, 2 }; |
104 | B b2 { 1, 2.0 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} |
105 | |
106 | struct C { |
107 | C(int i, double j) {} |
108 | }; |
109 | C c1 = { 1, 2.2 }; |
110 | // FIXME: Suppress the narrowing warning in the cases where we issue a narrowing error. |
111 | C c2 = { 1.1, 2 }; // expected-error {{type 'double' cannot be narrowed to 'int' in initializer list}} expected-note {{silence}} expected-warning {{implicit conversion}} |
112 | |
113 | int j { 1 }; |
114 | int k { }; |
115 | } |
116 | |
117 | namespace rdar13395022 { |
118 | struct MoveOnly { // expected-note {{candidate}} |
119 | MoveOnly(MoveOnly&&); // expected-note 2{{copy constructor is implicitly deleted because}} expected-note {{candidate}} |
120 | }; |
121 | |
122 | void test(MoveOnly mo) { |
123 | auto &&list1 = {mo}; // expected-error {{call to implicitly-deleted copy constructor}} expected-note {{in initialization of temporary of type 'std::initializer_list}} |
124 | MoveOnly (&&list2)[1] = {mo}; // expected-error {{call to implicitly-deleted copy constructor}} expected-note {{in initialization of temporary of type 'rdar13395022::MoveOnly [1]'}} |
125 | std::initializer_list<MoveOnly> &&list3 = {}; |
126 | MoveOnly (&&list4)[1] = {}; // expected-error {{no matching constructor}} |
127 | // expected-note@-1 {{in implicit initialization of array element 0 with omitted initializer}} |
128 | // expected-note@-2 {{in initialization of temporary of type 'rdar13395022::MoveOnly [1]' created to list-initialize this reference}} |
129 | } |
130 | } |
131 | |
132 | namespace cxx1z_direct_enum_init { |
133 | enum A {}; |
134 | enum B : char {}; |
135 | enum class C {}; |
136 | enum class D : char {}; |
137 | enum class E : char { k = 5 }; |
138 | |
139 | template<typename T> void good() { |
140 | (void)T{0}; |
141 | T t1{0}; |
142 | T t2 = T{0}; |
143 | |
144 | struct S { T t; }; |
145 | S s{T{0}}; |
146 | |
147 | struct U { T t{0}; } u; // expected-note 0+{{instantiation of}} |
148 | |
149 | struct V { T t; V() : t{0} {} }; // expected-note 0+{{instantiation of}} |
150 | |
151 | void f(T); |
152 | f(T{0}); |
153 | |
154 | char c; |
155 | auto t3 = T{c}; |
156 | } |
157 | #if __cplusplus <= 201402L |
158 | // expected-error@-18 5{{cannot initialize}} |
159 | // expected-error@-18 5{{cannot initialize}} |
160 | // expected-error@-18 5{{cannot initialize}} |
161 | // |
162 | // |
163 | // expected-error@-18 5{{cannot initialize}} |
164 | // |
165 | // expected-error@-18 5{{cannot initialize}} |
166 | // |
167 | // expected-error@-18 5{{cannot initialize}} |
168 | // |
169 | // |
170 | // expected-error@-18 5{{cannot initialize}} |
171 | // |
172 | // |
173 | // expected-error@-18 5{{cannot initialize}} |
174 | #else |
175 | // expected-error@-35 {{cannot initialize}} |
176 | // expected-error@-35 {{cannot initialize}} |
177 | // expected-error@-35 {{cannot initialize}} |
178 | // |
179 | // |
180 | // expected-error@-35 {{cannot initialize}} |
181 | // |
182 | // expected-error@-35 {{cannot initialize}} |
183 | // |
184 | // expected-error@-35 {{cannot initialize}} |
185 | // |
186 | // |
187 | // expected-error@-35 {{cannot initialize}} |
188 | // |
189 | // |
190 | // expected-error@-35 {{cannot initialize}} |
191 | #endif |
192 | |
193 | template<typename T> void bad() { |
194 | T t = {0}; |
195 | |
196 | struct S { T t; }; |
197 | S s1{0}; |
198 | S s2{{0}}; |
199 | |
200 | struct U { T t = {0}; } u; // expected-note 0+{{instantiation of}} |
201 | |
202 | struct V { T t; V() : t({0}) {} }; // expected-note 0+{{instantiation of}} |
203 | |
204 | void f(T); // expected-note 0+{{passing argument}} |
205 | f({0}); |
206 | } |
207 | // expected-error@-13 5{{cannot initialize}} |
208 | // |
209 | // |
210 | // expected-error@-13 5{{cannot initialize}} |
211 | // expected-error@-13 5{{cannot initialize}} |
212 | // |
213 | // expected-error@-13 5{{cannot initialize}} |
214 | // |
215 | // expected-error@-13 5{{cannot initialize}} |
216 | // |
217 | // |
218 | // expected-error@-13 5{{cannot initialize}} |
219 | |
220 | template<typename T> void ugly() { |
221 | extern char c; |
222 | T t1{char('0' + c)}; |
223 | T t2{'0' + c}; |
224 | T t3{1234}; |
225 | } |
226 | #if __cplusplus <= 201402L |
227 | // expected-error@-5 4{{cannot initialize}} |
228 | // expected-error@-5 4{{cannot initialize}} |
229 | // expected-error@-5 4{{cannot initialize}} |
230 | #else |
231 | // expected-error@-8 3{{non-constant-expression cannot be narrowed}} |
232 | // expected-error@-8 3{{constant expression evaluates to 1234 which cannot be narrowed}} expected-warning@-8 {{changes value}} |
233 | #endif |
234 | |
235 | void test() { |
236 | good<A>(); // expected-note 4{{instantiation of}} |
237 | good<B>(); |
238 | good<C>(); |
239 | good<D>(); |
240 | good<E>(); |
241 | #if __cplusplus <= 201402L |
242 | // expected-note@-5 4{{instantiation of}} |
243 | // expected-note@-5 4{{instantiation of}} |
244 | // expected-note@-5 4{{instantiation of}} |
245 | // expected-note@-5 4{{instantiation of}} |
246 | #endif |
247 | |
248 | bad<A>(); // expected-note 4{{instantiation of}} |
249 | bad<B>(); // expected-note 4{{instantiation of}} |
250 | bad<C>(); // expected-note 4{{instantiation of}} |
251 | bad<D>(); // expected-note 4{{instantiation of}} |
252 | bad<E>(); // expected-note 4{{instantiation of}} |
253 | |
254 | ugly<B>(); // expected-note {{instantiation of}} |
255 | ugly<C>(); // ok |
256 | ugly<D>(); // expected-note {{instantiation of}} |
257 | ugly<E>(); // expected-note {{instantiation of}} |
258 | #if __cplusplus <= 201402L |
259 | // expected-note@-4 {{instantiation of}} |
260 | #else |
261 | (void)B{0.0}; // expected-error {{type 'double' cannot be narrowed}} |
262 | #endif |
263 | } |
264 | |
265 | #if __cplusplus > 201402L |
266 | enum class F : unsigned {}; |
267 | F f1(unsigned x) { return F{x}; } |
268 | F f2(const unsigned x) { return F{x}; } |
269 | F f3(bool x) { return F{x}; } |
270 | F f4(const bool x) { return F{x}; } |
271 | #endif |
272 | } |
273 | |