@@ -95,6 +95,11 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
95
95
{
96
96
Type t = tx;
97
97
98
+ static Initializer err ()
99
+ {
100
+ return new ErrorInitializer();
101
+ }
102
+
98
103
Initializer visitVoid (VoidInitializer i)
99
104
{
100
105
i.type = t;
@@ -120,13 +125,11 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
120
125
if (sd.hasRegularCtor(true ))
121
126
{
122
127
error(i.loc, " %s `%s` has constructors, cannot use `{ initializers }`, use `%s( initializers )` instead" , sd.kind(), sd.toChars(), sd.toChars());
123
- return new ErrorInitializer ();
128
+ return err ();
124
129
}
125
130
sd.size(i.loc);
126
131
if (sd.sizeok != Sizeok.done)
127
- {
128
- return new ErrorInitializer();
129
- }
132
+ return err ();
130
133
const nfields = sd.nonHiddenFields();
131
134
// expandTuples for non-identity arguments?
132
135
auto elements = new Expressions(nfields);
@@ -148,7 +151,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
148
151
error(initLoc, " `%s` is not a member of `%s`, did you mean %s `%s`?" , id.toChars(), sd.toChars(), s.kind(), s.toChars());
149
152
else
150
153
error(initLoc, " `%s` is not a member of `%s`" , id.toChars(), sd.toChars());
151
- return new ErrorInitializer ();
154
+ return err ();
152
155
}
153
156
s.checkDeprecated(i.loc, sc);
154
157
@@ -159,7 +162,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
159
162
if (fieldi >= nfields)
160
163
{
161
164
error(i.loc, " `%s.%s` is not a per-instance initializable field" , sd.toChars(), s.toChars());
162
- return new ErrorInitializer ();
165
+ return err ();
163
166
}
164
167
if (s == sd.fields[fieldi])
165
168
break ;
@@ -168,7 +171,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
168
171
else if (fieldi >= nfields)
169
172
{
170
173
error(i.loc, " too many initializers for `%s`" , sd.toChars());
171
- return new ErrorInitializer ();
174
+ return err ();
172
175
}
173
176
VarDeclaration vd = sd.fields[fieldi];
174
177
if ((* elements)[fieldi])
@@ -213,14 +216,10 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
213
216
++ fieldi;
214
217
}
215
218
if (errors)
216
- {
217
- return new ErrorInitializer();
218
- }
219
+ return err ();
219
220
auto sle = new StructLiteralExp(i.loc, sd, elements, t);
220
221
if (! sd.fill(i.loc, elements, false ))
221
- {
222
- return new ErrorInitializer();
223
- }
222
+ return err ();
224
223
sle.type = t;
225
224
auto ie = new ExpInitializer(i.loc, sle);
226
225
return ie.initializerSemantic(sc, t, needInterpret);
@@ -240,7 +239,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
240
239
}
241
240
if (t.ty != Terror)
242
241
error(i.loc, " a struct is not a valid initializer for a `%s`" , t.toChars());
243
- return new ErrorInitializer ();
242
+ return err ();
244
243
}
245
244
246
245
Initializer visitArray (ArrayInitializer i)
@@ -276,7 +275,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
276
275
if (! e)
277
276
{
278
277
error(i.loc, " cannot use array to initialize `%s`" , t.toChars());
279
- goto Lerr ;
278
+ return err () ;
280
279
}
281
280
auto ei = new ExpInitializer(e.loc, e);
282
281
return ei.initializerSemantic(sc, t, needInterpret);
@@ -287,7 +286,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
287
286
goto default ;
288
287
default :
289
288
error(i.loc, " cannot use array to initialize `%s`" , t.toChars());
290
- goto Lerr ;
289
+ return err () ;
291
290
}
292
291
i.type = t;
293
292
length = 0 ;
@@ -343,7 +342,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
343
342
if (length == 0 )
344
343
{
345
344
error(i.loc, " array dimension overflow" );
346
- goto Lerr ;
345
+ return err () ;
347
346
}
348
347
if (length > i.dim)
349
348
i.dim = length;
@@ -354,24 +353,21 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
354
353
if (i.dim > edim)
355
354
{
356
355
error(i.loc, " array initializer has %u elements, but array length is %llu" , i.dim, edim);
357
- goto Lerr ;
356
+ return err () ;
358
357
}
359
358
}
360
359
if (errors)
361
- goto Lerr;
360
+ return err ();
361
+
362
+ const sz = t.nextOf().size();
363
+ bool overflow;
364
+ const max = mulu(i.dim, sz, overflow);
365
+ if (overflow || max >= amax)
362
366
{
363
- const sz = t.nextOf().size();
364
- bool overflow;
365
- const max = mulu(i.dim, sz, overflow);
366
- if (overflow || max >= amax)
367
- {
368
- error(i.loc, " array dimension %llu exceeds max of %llu" , ulong (i.dim), ulong (amax / sz));
369
- goto Lerr;
370
- }
371
- return i;
367
+ error(i.loc, " array dimension %llu exceeds max of %llu" , ulong (i.dim), ulong (amax / sz));
368
+ return err ();
372
369
}
373
- Lerr:
374
- return new ErrorInitializer();
370
+ return i;
375
371
}
376
372
377
373
Initializer visitExp (ExpInitializer i)
@@ -384,9 +380,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
384
380
if (needInterpret)
385
381
sc = sc.endCTFE();
386
382
if (i.exp.op == TOK .error)
387
- {
388
- return new ErrorInitializer();
389
- }
383
+ return err ();
390
384
uint olderrors = global.errors;
391
385
/* Save the expression before ctfe
392
386
* Otherwise the error message would contain for example "&[0][0]" instead of "new int"
@@ -427,13 +421,13 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
427
421
if (i.exp.op == TOK .type)
428
422
{
429
423
i.exp.error(" initializer must be an expression, not `%s`" , i.exp.toChars());
430
- return new ErrorInitializer ();
424
+ return err ();
431
425
}
432
426
// Make sure all pointers are constants
433
427
if (needInterpret && hasNonConstPointers(i.exp))
434
428
{
435
429
i.exp.error(" cannot use non-constant CTFE pointer in an initializer `%s`" , currExp.toChars());
436
- return new ErrorInitializer ();
430
+ return err ();
437
431
}
438
432
Type tb = t.toBasetype();
439
433
Type ti = i.exp.type.toBasetype();
@@ -569,7 +563,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
569
563
{
570
564
// printf("CInitializer::semantic()\n");
571
565
error(i.loc, " C initializers not supported yet" );
572
- return new ErrorInitializer ();
566
+ return err ();
573
567
}
574
568
575
569
final switch (init.kind)
0 commit comments