@@ -95,6 +95,11 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
9595{
9696 Type t = tx;
9797
98+ static Initializer err ()
99+ {
100+ return new ErrorInitializer();
101+ }
102+
98103 Initializer visitVoid (VoidInitializer i)
99104 {
100105 i.type = t;
@@ -120,13 +125,11 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
120125 if (sd.hasRegularCtor(true ))
121126 {
122127 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 ();
124129 }
125130 sd.size(i.loc);
126131 if (sd.sizeok != Sizeok.done)
127- {
128- return new ErrorInitializer();
129- }
132+ return err ();
130133 const nfields = sd.nonHiddenFields();
131134 // expandTuples for non-identity arguments?
132135 auto elements = new Expressions(nfields);
@@ -148,7 +151,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
148151 error(initLoc, " `%s` is not a member of `%s`, did you mean %s `%s`?" , id.toChars(), sd.toChars(), s.kind(), s.toChars());
149152 else
150153 error(initLoc, " `%s` is not a member of `%s`" , id.toChars(), sd.toChars());
151- return new ErrorInitializer ();
154+ return err ();
152155 }
153156 s.checkDeprecated(i.loc, sc);
154157
@@ -159,7 +162,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
159162 if (fieldi >= nfields)
160163 {
161164 error(i.loc, " `%s.%s` is not a per-instance initializable field" , sd.toChars(), s.toChars());
162- return new ErrorInitializer ();
165+ return err ();
163166 }
164167 if (s == sd.fields[fieldi])
165168 break ;
@@ -168,7 +171,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
168171 else if (fieldi >= nfields)
169172 {
170173 error(i.loc, " too many initializers for `%s`" , sd.toChars());
171- return new ErrorInitializer ();
174+ return err ();
172175 }
173176 VarDeclaration vd = sd.fields[fieldi];
174177 if ((* elements)[fieldi])
@@ -213,14 +216,10 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
213216 ++ fieldi;
214217 }
215218 if (errors)
216- {
217- return new ErrorInitializer();
218- }
219+ return err ();
219220 auto sle = new StructLiteralExp(i.loc, sd, elements, t);
220221 if (! sd.fill(i.loc, elements, false ))
221- {
222- return new ErrorInitializer();
223- }
222+ return err ();
224223 sle.type = t;
225224 auto ie = new ExpInitializer(i.loc, sle);
226225 return ie.initializerSemantic(sc, t, needInterpret);
@@ -240,7 +239,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
240239 }
241240 if (t.ty != Terror)
242241 error(i.loc, " a struct is not a valid initializer for a `%s`" , t.toChars());
243- return new ErrorInitializer ();
242+ return err ();
244243 }
245244
246245 Initializer visitArray (ArrayInitializer i)
@@ -276,7 +275,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
276275 if (! e)
277276 {
278277 error(i.loc, " cannot use array to initialize `%s`" , t.toChars());
279- goto Lerr ;
278+ return err () ;
280279 }
281280 auto ei = new ExpInitializer(e.loc, e);
282281 return ei.initializerSemantic(sc, t, needInterpret);
@@ -287,7 +286,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
287286 goto default ;
288287 default :
289288 error(i.loc, " cannot use array to initialize `%s`" , t.toChars());
290- goto Lerr ;
289+ return err () ;
291290 }
292291 i.type = t;
293292 length = 0 ;
@@ -343,7 +342,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
343342 if (length == 0 )
344343 {
345344 error(i.loc, " array dimension overflow" );
346- goto Lerr ;
345+ return err () ;
347346 }
348347 if (length > i.dim)
349348 i.dim = length;
@@ -354,24 +353,21 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
354353 if (i.dim > edim)
355354 {
356355 error(i.loc, " array initializer has %u elements, but array length is %llu" , i.dim, edim);
357- goto Lerr ;
356+ return err () ;
358357 }
359358 }
360359 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)
362366 {
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 ();
372369 }
373- Lerr:
374- return new ErrorInitializer();
370+ return i;
375371 }
376372
377373 Initializer visitExp (ExpInitializer i)
@@ -384,9 +380,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
384380 if (needInterpret)
385381 sc = sc.endCTFE();
386382 if (i.exp.op == TOK .error)
387- {
388- return new ErrorInitializer();
389- }
383+ return err ();
390384 uint olderrors = global.errors;
391385 /* Save the expression before ctfe
392386 * 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
427421 if (i.exp.op == TOK .type)
428422 {
429423 i.exp.error(" initializer must be an expression, not `%s`" , i.exp.toChars());
430- return new ErrorInitializer ();
424+ return err ();
431425 }
432426 // Make sure all pointers are constants
433427 if (needInterpret && hasNonConstPointers(i.exp))
434428 {
435429 i.exp.error(" cannot use non-constant CTFE pointer in an initializer `%s`" , currExp.toChars());
436- return new ErrorInitializer ();
430+ return err ();
437431 }
438432 Type tb = t.toBasetype();
439433 Type ti = i.exp.type.toBasetype();
@@ -569,7 +563,7 @@ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, ref Typ
569563 {
570564 // printf("CInitializer::semantic()\n");
571565 error(i.loc, " C initializers not supported yet" );
572- return new ErrorInitializer ();
566+ return err ();
573567 }
574568
575569 final switch (init.kind)
0 commit comments