| @@ -1,384 +1,380 @@ | | | @@ -1,384 +1,380 @@ |
1 | /* $NetBSD: d_c99_init.c,v 1.24 2021/03/30 14:25:28 rillig Exp $ */ | | 1 | /* $NetBSD: d_c99_init.c,v 1.25 2021/03/30 15:05:05 rillig Exp $ */ |
2 | # 3 "d_c99_init.c" | | 2 | # 3 "d_c99_init.c" |
3 | | | 3 | |
4 | /* | | 4 | /* |
5 | * Test C99 initializers. | | 5 | * Test C99 initializers. |
6 | * | | 6 | * |
7 | * See C99 6.7.8 "Initialization". | | 7 | * See C99 6.7.8 "Initialization". |
8 | */ | | 8 | */ |
9 | | | 9 | |
10 | | | 10 | |
11 | void use(const void *); | | 11 | void use(const void *); |
12 | | | 12 | |
13 | typedef struct any { | | 13 | typedef struct any { |
14 | const void *value; | | 14 | const void *value; |
15 | } any; | | 15 | } any; |
16 | | | 16 | |
17 | | | 17 | |
18 | // C99 6.7.8p11 says "optionally enclosed in braces". There is no limitation | | 18 | // C99 6.7.8p11 says "optionally enclosed in braces". There is no limitation |
19 | // on the number of brace pairs. | | 19 | // on the number of brace pairs. |
20 | int scalar_without_braces = 3; | | 20 | int scalar_without_braces = 3; |
21 | int scalar_with_optional_braces = { 3 }; | | 21 | int scalar_with_optional_braces = { 3 }; |
22 | int scalar_with_too_many_braces = {{ 3 }}; | | 22 | int scalar_with_too_many_braces = {{ 3 }}; |
23 | int scalar_with_too_many_initializers = { 3, 5 }; /* expect: 174 */ | | 23 | int scalar_with_too_many_initializers = { 3, 5 }; /* expect: 174 */ |
24 | | | 24 | |
25 | | | 25 | |
26 | // See init_expr, 'handing over to ASSIGN'. | | 26 | // See init_expr, 'handing over to ASSIGN'. |
27 | void | | 27 | void |
28 | struct_initialization_via_assignment(any arg) | | 28 | struct_initialization_via_assignment(any arg) |
29 | { | | 29 | { |
30 | any local = arg; | | 30 | any local = arg; |
31 | use(&local); | | 31 | use(&local); |
32 | } | | 32 | } |
33 | | | 33 | |
34 | | | 34 | |
35 | // See init_expr, initialization_init_array_using_string. | | 35 | // See init_expr, initialization_init_array_using_string. |
36 | char static_duration[] = "static duration"; | | 36 | char static_duration[] = "static duration"; |
37 | signed char static_duration_signed[] = "static duration"; | | 37 | signed char static_duration_signed[] = "static duration"; |
38 | unsigned char static_duration_unsigned[] = "static duration"; | | 38 | unsigned char static_duration_unsigned[] = "static duration"; |
39 | int static_duration_wchar[] = L"static duration"; | | 39 | int static_duration_wchar[] = L"static duration"; |
40 | | | 40 | |
41 | // See init_expr. | | 41 | // See init_expr. |
42 | void | | 42 | void |
43 | initialization_by_braced_string(void) | | 43 | initialization_by_braced_string(void) |
44 | { | | 44 | { |
45 | any local = { "hello" }; | | 45 | any local = { "hello" }; |
46 | use(&local); | | 46 | use(&local); |
47 | } | | 47 | } |
48 | | | 48 | |
49 | void | | 49 | void |
50 | initialization_by_redundantly_braced_string(void) | | 50 | initialization_by_redundantly_braced_string(void) |
51 | { | | 51 | { |
52 | any local = {{{{ "hello" }}}}; | | 52 | any local = {{{{ "hello" }}}}; |
53 | use(&local); | | 53 | use(&local); |
54 | } | | 54 | } |
55 | | | 55 | |
56 | /* | | 56 | /* |
57 | * Only scalar expressions and string literals may be enclosed by additional | | 57 | * Only scalar expressions and string literals may be enclosed by additional |
58 | * braces. Since 'arg' is a struct, this is a compile-time error. | | 58 | * braces. Since 'arg' is a struct, this is a compile-time error. |
59 | */ | | 59 | */ |
60 | void | | 60 | void |
61 | initialization_with_too_many_braces(any arg) | | 61 | initialization_with_too_many_braces(any arg) |
62 | { | | 62 | { |
63 | any local = { arg }; /* expect: 185 */ | | 63 | any local = { arg }; /* expect: 185 */ |
64 | use(&arg); | | 64 | use(&arg); |
65 | } | | 65 | } |
66 | | | 66 | |
67 | // Some of the following examples are mentioned in the introduction comment | | 67 | // Some of the following examples are mentioned in the introduction comment |
68 | // in init.c. | | 68 | // in init.c. |
69 | | | 69 | |
70 | int number = 12345; | | 70 | int number = 12345; |
71 | | | 71 | |
72 | int number_with_braces_and_comma = { | | 72 | int number_with_braces_and_comma = { |
73 | 12345, | | 73 | 12345, |
74 | }; | | 74 | }; |
75 | | | 75 | |
76 | int array_with_fixed_size[3] = { | | 76 | int array_with_fixed_size[3] = { |
77 | 111, | | 77 | 111, |
78 | 222, | | 78 | 222, |
79 | 333, | | 79 | 333, |
80 | 444, /* expect: too many array initializers */ | | 80 | 444, /* expect: too many array initializers */ |
81 | }; | | 81 | }; |
82 | | | 82 | |
83 | // See initialization_set_set_of_unknown_array. | | 83 | // See initialization_set_set_of_unknown_array. |
84 | int array_of_unknown_size[] = { | | 84 | int array_of_unknown_size[] = { |
85 | 111, | | 85 | 111, |
86 | 222, | | 86 | 222, |
87 | 333, | | 87 | 333, |
88 | }; | | 88 | }; |
89 | | | 89 | |
90 | int array_flat[2][2] = { | | 90 | int array_flat[2][2] = { |
91 | 11, | | 91 | 11, |
92 | 12, | | 92 | 12, |
93 | 21, | | 93 | 21, |
94 | 22 | | 94 | 22 |
95 | }; | | 95 | }; |
96 | | | 96 | |
97 | int array_nested[2][2] = { | | 97 | int array_nested[2][2] = { |
98 | { | | 98 | { |
99 | 11, | | 99 | 11, |
100 | 12 | | 100 | 12 |
101 | }, | | 101 | }, |
102 | { | | 102 | { |
103 | 21, | | 103 | 21, |
104 | 22 | | 104 | 22 |
105 | } | | 105 | } |
106 | }; | | 106 | }; |
107 | | | 107 | |
108 | int array_with_designators[] = { | | 108 | int array_with_designators[] = { |
109 | ['1'] = 111, | | 109 | ['1'] = 111, |
110 | ['5'] = 555, | | 110 | ['5'] = 555, |
111 | ['9'] = 999 | | 111 | ['9'] = 999 |
112 | }; | | 112 | }; |
113 | | | 113 | |
114 | int array_with_some_designators[] = { | | 114 | int array_with_some_designators[] = { |
115 | ['1'] = 111, | | 115 | ['1'] = 111, |
116 | 222, | | 116 | 222, |
117 | ['9'] = 999 | | 117 | ['9'] = 999 |
118 | }; | | 118 | }; |
119 | | | 119 | |
120 | struct point { | | 120 | struct point { |
121 | int x; | | 121 | int x; |
122 | int y; | | 122 | int y; |
123 | }; | | 123 | }; |
124 | | | 124 | |
125 | struct point point = { | | 125 | struct point point = { |
126 | 3, | | 126 | 3, |
127 | 4 | | 127 | 4 |
128 | }; | | 128 | }; |
129 | | | 129 | |
130 | struct point point_with_designators = { | | 130 | struct point point_with_designators = { |
131 | .y = 4, | | 131 | .y = 4, |
132 | .x = 3, | | 132 | .x = 3, |
133 | }; | | 133 | }; |
134 | | | 134 | |
135 | struct point point_with_mixed_designators = { | | 135 | struct point point_with_mixed_designators = { |
136 | .x = 3, | | 136 | .x = 3, |
137 | 4, | | 137 | 4, |
138 | /* TODO: remove me */ | | 138 | /* TODO: remove me */ |
139 | 5, /* expect: too many struct/union initializers */ | | 139 | 5, /* expect: too many struct/union initializers */ |
140 | .x = 3, | | 140 | .x = 3, |
141 | }; | | 141 | }; |
142 | | | 142 | |
143 | int array_with_designator[] = { | | 143 | int array_with_designator[] = { |
144 | 111, | | 144 | 111, |
145 | .member = 222, /* expect: 249 */ | | 145 | .member = 222, /* expect: 249 */ |
146 | 333, | | 146 | 333, |
147 | }; | | 147 | }; |
148 | | | 148 | |
149 | /* | | 149 | /* |
150 | * C99 6.7.8p11 says that the initializer of a scalar can be "optionally | | 150 | * C99 6.7.8p11 says that the initializer of a scalar can be "optionally |
151 | * enclosed in braces". It does not explicitly set an upper limit on the | | 151 | * enclosed in braces". It does not explicitly set an upper limit on the |
152 | * number of braces. It also doesn't restrict the term "initializer" to only | | 152 | * number of braces. It also doesn't restrict the term "initializer" to only |
153 | * mean the "outermost initializer". Both GCC 10 and Clang 8 already warn | | 153 | * mean the "outermost initializer". Both GCC 10 and Clang 8 already warn |
154 | * about this, so there is no extra work for lint to do. | | 154 | * about this, so there is no extra work for lint to do. |
155 | */ | | 155 | */ |
156 | struct point scalar_with_several_braces = { | | 156 | struct point scalar_with_several_braces = { |
157 | {{{3}}}, | | 157 | {{{3}}}, |
158 | {{{{4}}}}, | | 158 | {{{{4}}}}, |
159 | }; | | 159 | }; |
160 | | | 160 | |
161 | struct rectangle { | | 161 | struct rectangle { |
162 | struct point top_left; | | 162 | struct point top_left; |
163 | struct point bottom_right; | | 163 | struct point bottom_right; |
164 | }; | | 164 | }; |
165 | | | 165 | |
166 | /* C99 6.7.8p18 */ | | 166 | /* C99 6.7.8p18 */ |
167 | struct rectangle screen = { | | 167 | struct rectangle screen = { |
168 | .bottom_right = { | | 168 | .bottom_right = { |
169 | 1920, | | 169 | 1920, |
170 | 1080, | | 170 | 1080, |
171 | } | | 171 | } |
172 | }; | | 172 | }; |
173 | | | 173 | |
174 | /* | | 174 | /* |
175 | * C99 6.7.8p22 says: At the _end_ of its initializer list, the array no | | 175 | * C99 6.7.8p22 says: At the _end_ of its initializer list, the array no |
176 | * longer has incomplete type. | | 176 | * longer has incomplete type. |
177 | */ | | 177 | */ |
178 | struct point points[] = { | | 178 | struct point points[] = { |
179 | { | | 179 | { |
180 | /* | | 180 | /* |
181 | * At this point, the size of the object 'points' is not known | | 181 | * At this point, the size of the object 'points' is not known |
182 | * yet since its type is still incomplete. Lint could warn | | 182 | * yet since its type is still incomplete. Lint could warn |
183 | * about this, but GCC and Clang already do. | | 183 | * about this, but GCC and Clang already do. |
184 | * | | 184 | * |
185 | * This test case demonstrates that in | | 185 | * This test case demonstrates that in |
186 | * extend_if_array_of_unknown_size, setcomplete is called too | | 186 | * extend_if_array_of_unknown_size, setcomplete is called too |
187 | * early. | | 187 | * early. |
188 | */ | | 188 | */ |
189 | sizeof points, | | 189 | sizeof points, |
190 | 4 | | 190 | 4 |
191 | } | | 191 | } |
192 | }; | | 192 | }; |
193 | | | 193 | |
194 | | | 194 | |
195 | struct triangle { | | 195 | struct triangle { |
196 | struct point points[3]; | | 196 | struct point points[3]; |
197 | }; | | 197 | }; |
198 | | | 198 | |
199 | struct pentagon { | | 199 | struct pentagon { |
200 | struct point points[5]; | | 200 | struct point points[5]; |
201 | }; | | 201 | }; |
202 | | | 202 | |
203 | struct geometry { | | 203 | struct geometry { |
204 | struct pentagon pentagons[6]; | | 204 | struct pentagon pentagons[6]; |
205 | struct triangle triangles[10]; | | 205 | struct triangle triangles[10]; |
206 | struct point points[3][5][2]; | | 206 | struct point points[3][5][2]; |
207 | }; | | 207 | }; |
208 | | | 208 | |
209 | /* | | 209 | /* |
210 | * Initialization of a complex struct containing nested arrays and nested | | 210 | * Initialization of a complex struct containing nested arrays and nested |
211 | * structs. | | 211 | * structs. |
212 | */ | | 212 | */ |
213 | struct geometry geometry = { | | 213 | struct geometry geometry = { |
214 | /* TODO: remove me */ | | 214 | /* TODO: remove me */ |
215 | .pentagons[0].points[4].x = 1, | | 215 | .pentagons[0].points[4].x = 1, |
216 | .points[0][0][0] = { 0, 0 }, | | 216 | .points[0][0][0] = { 0, 0 }, |
217 | .points[2][4][1] = {301, 302 }, | | 217 | .points[2][4][1] = {301, 302 }, |
218 | /* TODO: expect+1: array index 3 must be between 0 and 2 */ | | 218 | /* TODO: expect+1: array index 3 must be between 0 and 2 */ |
219 | .points[3][0][0] = {3001, 3002 }, | | 219 | .points[3][0][0] = {3001, 3002 }, |
220 | /* TODO: expect+1: array index 5 must be between 0 and 4 */ | | 220 | /* TODO: expect+1: array index 5 must be between 0 and 4 */ |
221 | .points[0][5][0] = {501, 502 }, | | 221 | .points[0][5][0] = {501, 502 }, |
222 | /* TODO: expect+1: array index 2 must be between 0 and 1 */ | | 222 | /* TODO: expect+1: array index 2 must be between 0 and 1 */ |
223 | .points[0][0][2] = {21, 22 }, | | 223 | .points[0][0][2] = {21, 22 }, |
224 | }; | | 224 | }; |
225 | | | 225 | |
226 | struct ends_with_unnamed_bit_field { | | 226 | struct ends_with_unnamed_bit_field { |
227 | int member; | | 227 | int member; |
228 | int : 0; | | 228 | int : 0; |
229 | } ends_with_unnamed_bit_field = { | | 229 | } ends_with_unnamed_bit_field = { |
230 | 12345, | | 230 | 12345, |
231 | /* expect+1: too many struct/union initializers */ | | 231 | /* expect+1: too many struct/union initializers */ |
232 | 23456, | | 232 | 23456, |
233 | }; | | 233 | }; |
234 | | | 234 | |
235 | char prefixed_message[] = { | | 235 | char prefixed_message[] = { |
236 | 'E', ':', ' ', | | 236 | 'E', ':', ' ', |
237 | /* expect+1: illegal combination of integer (char) and pointer */ | | 237 | /* expect+1: illegal combination of integer (char) and pointer */ |
238 | "message\n", | | 238 | "message\n", |
239 | }; | | 239 | }; |
240 | | | 240 | |
241 | char message_with_suffix[] = { | | 241 | char message_with_suffix[] = { |
242 | "message", /* expect: illegal combination */ | | 242 | "message", /* expect: illegal combination */ |
243 | /* */ | | 243 | /* */ |
244 | '\n', | | 244 | '\n', |
245 | }; | | 245 | }; |
246 | | | 246 | |
247 | struct ten { | | 247 | struct ten { |
248 | int i0; | | 248 | int i0; |
249 | int i1; | | 249 | int i1; |
250 | int i2; | | 250 | int i2; |
251 | int i3; | | 251 | int i3; |
252 | int i4; | | 252 | int i4; |
253 | int i5; | | 253 | int i5; |
254 | int i6; | | 254 | int i6; |
255 | int i7; | | 255 | int i7; |
256 | int i8; | | 256 | int i8; |
257 | int i9; | | 257 | int i9; |
258 | }; | | 258 | }; |
259 | | | 259 | |
260 | struct ten ten = { | | 260 | struct ten ten = { |
261 | .i3 = 3, | | 261 | .i3 = 3, |
262 | 4, | | 262 | 4, |
263 | // FIXME: assertion "level->bl_type->t_tspec == ARRAY" failed in brace_level_extend_if_array_of_unknown_size | | 263 | 5, |
264 | // 5, | | 264 | 6, |
265 | // 6, | | | |
266 | }; | | 265 | }; |
267 | | | 266 | |
268 | int c99_6_7_8_p26_example3[4][3] = { | | 267 | int c99_6_7_8_p26_example3[4][3] = { |
269 | { 1, 3, 5 }, | | 268 | { 1, 3, 5 }, |
270 | { 2, 4, 6 }, | | 269 | { 2, 4, 6 }, |
271 | { 3, 5, 7 }, | | 270 | { 3, 5, 7 }, |
272 | }; | | 271 | }; |
273 | | | 272 | |
274 | int c99_6_7_8_p27_example4[4][3] = { | | 273 | int c99_6_7_8_p27_example4[4][3] = { |
275 | { 1 }, { 2 }, { 3 }, { 4 } | | 274 | { 1 }, { 2 }, { 3 }, { 4 } |
276 | }; | | 275 | }; |
277 | | | 276 | |
278 | struct { | | 277 | struct { |
279 | int a[3], b; | | 278 | int a[3], b; |
280 | } c99_6_7_8_p28_example5[] = { | | 279 | } c99_6_7_8_p28_example5[] = { |
281 | { 1 }, | | 280 | { 1 }, |
282 | 2, /* XXX *//* expect: cannot initialize */ | | 281 | 2, /* XXX *//* expect: cannot initialize */ |
283 | }; | | 282 | }; |
284 | | | 283 | |
285 | short c99_6_7_8_p29_example6a[4][3][2] = { | | 284 | short c99_6_7_8_p29_example6a[4][3][2] = { |
286 | { 1 }, | | 285 | { 1 }, |
287 | { 2, 3 }, | | 286 | { 2, 3 }, |
288 | { 4, 5, 6 }, | | 287 | { 4, 5, 6 }, |
289 | }; | | 288 | }; |
290 | | | 289 | |
291 | short c99_6_7_8_p29_example6b[4][3][2] = { | | 290 | short c99_6_7_8_p29_example6b[4][3][2] = { |
292 | 1, 0, 0, 0, 0, 0, | | 291 | 1, 0, 0, 0, 0, 0, |
293 | 2, 3, 0, 0, 0, 0, | | 292 | 2, 3, 0, 0, 0, 0, |
294 | 4, 5, 6, 0, 0, 0, | | 293 | 4, 5, 6, 0, 0, 0, |
295 | }; | | 294 | }; |
296 | | | 295 | |
297 | short c99_6_7_8_p29_example6c[4][3][2] = { | | 296 | short c99_6_7_8_p29_example6c[4][3][2] = { |
298 | { | | 297 | { |
299 | { 1 }, | | 298 | { 1 }, |
300 | }, | | 299 | }, |
301 | { | | 300 | { |
302 | { 2, 3 }, | | 301 | { 2, 3 }, |
303 | }, | | 302 | }, |
304 | { | | 303 | { |
305 | { 4, 5 }, | | 304 | { 4, 5 }, |
306 | { 6 }, | | 305 | { 6 }, |
307 | } | | 306 | } |
308 | }; | | 307 | }; |
309 | | | 308 | |
310 | /* | | 309 | /* |
311 | * During initialization of an object of type array of unknown size, the type | | 310 | * During initialization of an object of type array of unknown size, the type |
312 | * information on the symbol is updated in-place. Ensure that this happens on | | 311 | * information on the symbol is updated in-place. Ensure that this happens on |
313 | * a copy of the type. | | 312 | * a copy of the type. |
314 | */ | | 313 | */ |
315 | void | | 314 | void |
316 | ensure_array_type_is_not_modified_during_initialization(void) | | 315 | ensure_array_type_is_not_modified_during_initialization(void) |
317 | { | | 316 | { |
318 | typedef int array_of_unknown_size[]; | | 317 | typedef int array_of_unknown_size[]; |
319 | | | 318 | |
320 | array_of_unknown_size a1 = { 1, 2, 3}; | | 319 | array_of_unknown_size a1 = { 1, 2, 3}; |
321 | | | 320 | |
322 | switch (4) { | | 321 | switch (4) { |
323 | case sizeof(array_of_unknown_size): | | 322 | case sizeof(array_of_unknown_size): |
324 | case 0: /* expect: duplicate case in switch: 0 */ | | 323 | case 0: /* expect: duplicate case in switch: 0 */ |
325 | case 3: | | 324 | case 3: |
326 | case 4: | | 325 | case 4: |
327 | case 12: | | 326 | case 12: |
328 | break; | | 327 | break; |
329 | } | | 328 | } |
330 | } | | 329 | } |
331 | | | 330 | |
332 | struct point unknown_member_name_beginning = { | | 331 | struct point unknown_member_name_beginning = { |
333 | /* TODO: remove me */ | | | |
334 | .r = 5, /* expect: undefined struct/union member: r */ | | 332 | .r = 5, /* expect: undefined struct/union member: r */ |
335 | .x = 4, | | 333 | .x = 4, |
336 | .y = 3, | | 334 | .y = 3, |
337 | }; | | 335 | }; |
338 | | | 336 | |
339 | struct point unknown_member_name_middle = { | | 337 | struct point unknown_member_name_middle = { |
340 | .x = 4, | | 338 | .x = 4, |
341 | .r = 5, /* expect: undefined struct/union member: r */ | | 339 | .r = 5, /* expect: undefined struct/union member: r */ |
342 | .y = 3, | | 340 | .y = 3, |
343 | }; | | 341 | }; |
344 | | | 342 | |
345 | struct point unknown_member_name_end = { | | 343 | struct point unknown_member_name_end = { |
346 | .x = 4, | | 344 | .x = 4, |
347 | .y = 3, | | 345 | .y = 3, |
348 | .r = 5, /* expect: undefined struct/union member: r */ | | 346 | .r = 5, /* expect: undefined struct/union member: r */ |
349 | }; | | 347 | }; |
350 | | | 348 | |
351 | union value { | | 349 | union value { |
352 | int int_value; | | 350 | int int_value; |
353 | void *pointer_value; | | 351 | void *pointer_value; |
354 | }; | | 352 | }; |
355 | | | 353 | |
356 | union value unknown_union_member_name_first = { | | 354 | union value unknown_union_member_name_first = { |
357 | /* TODO: remove me */ | | | |
358 | .unknown_value = 4, /* expect: undefined struct/union member */ | | 355 | .unknown_value = 4, /* expect: undefined struct/union member */ |
359 | .int_value = 3, | | 356 | .int_value = 3, |
360 | }; | | 357 | }; |
361 | | | 358 | |
362 | union value unknown_union_member_name_second = { | | 359 | union value unknown_union_member_name_second = { |
363 | .int_value = 3, | | 360 | .int_value = 3, |
364 | /* TODO: remove me */ | | | |
365 | .unknown_value = 4, /* expect: undefined struct/union member */ | | 361 | .unknown_value = 4, /* expect: undefined struct/union member */ |
366 | }; | | 362 | }; |
367 | | | 363 | |
368 | struct point designators_with_subscript = { | | 364 | struct point designators_with_subscript = { |
369 | [0] = 3, /* expect: only for arrays */ | | 365 | [0] = 3, /* expect: only for arrays */ |
370 | .member[0][0].member = 4, /* expect: undefined struct/union member */ | | 366 | .member[0][0].member = 4, /* expect: undefined struct/union member */ |
371 | .x.y.z = 5, /* intentionally not caught, see designator_look_up */ | | 367 | .x.y.z = 5, /* intentionally not caught, see designator_look_up */ |
372 | }; | | 368 | }; |
373 | | | 369 | |
374 | struct { | | 370 | struct { |
375 | int : 16; | | 371 | int : 16; |
376 | } struct_with_only_unnamed_members = { /* expect: has no named members */ | | 372 | } struct_with_only_unnamed_members = { /* expect: has no named members */ |
377 | 123, /* expect: too many struct/union initializers */ | | 373 | 123, /* expect: too many struct/union initializers */ |
378 | }; | | 374 | }; |
379 | | | 375 | |
380 | union { | | 376 | union { |
381 | int : 16; | | 377 | int : 16; |
382 | } union_with_only_unnamed_members = { /* expect: has no named members */ | | 378 | } union_with_only_unnamed_members = { /* expect: has no named members */ |
383 | 123, /* expect: too many struct/union initializers */ | | 379 | 123, /* expect: too many struct/union initializers */ |
384 | }; | | 380 | }; |