Skip to content

Commit f1692f5

Browse files
authored
replace gotos in initializerSemantic() with return err() (#12663)
1 parent f92a7a0 commit f1692f5

File tree

1 file changed

+30
-36
lines changed

1 file changed

+30
-36
lines changed

src/dmd/initsem.d

+30-36
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)