On Friday, 9 September 2022 at 14:22:51 UTC, Steven Schveighoffer wrote:
>Instead of switch, you can use:
do {
...
} while(false);
And then use a break inside.
Not the same, continue applies to the do then, not an outer loop. Also not clear until the end of the construct that it's not a loop.
>But honestly, all this looks like "I want to avoid goto at all costs". The original looks better to me.
It's easier to reason about switch because you don't have to read the whole function looking for the matching label.
>Another possibility that uses goto, but might be preferred, is:
if (FuncDeclaration func = sc.parent.isFuncDeclaration())
{
tm.symtab = func.localsymtab;
if (!tm.symtab)
{
// Inside template constraint, symtab is not set yet.
goto L1;
}
}
else
{
tm.symtab = sc.parent.isScopeDsymbol().symtab;
}
assert(tm.symtab);
tm.ident = Identifier.generateId(s, tm.symtab.length + 1);
tm.symtab.insert(tm);
L1:
That's an improvement.