digitalmars.D.bugs - [Issue 20467] New: initializerSemantic() is run multiple times for a
- d-bugmail puremagic.com (57/57) Dec 25 2019 https://issues.dlang.org/show_bug.cgi?id=20467
https://issues.dlang.org/show_bug.cgi?id=20467 Issue ID: 20467 Summary: initializerSemantic() is run multiple times for a single Initializer Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: b2.temp gmx.com If you add a flag to dmd.init.Initializer and set this flag when initializerSemantic() is run you'll notice that the same Initializer instance will go through initializerSemantic() several times. conveniancy patch to highlight the problem: --- diff --git a/src/dmd/init.d b/src/dmd/init.d index e2e690899..9f5d61b09 100644 --- a/src/dmd/init.d +++ b/src/dmd/init.d -55,6 +55,7 extern (C++) class Initializer : ASTNode { Loc loc; InitKind kind; + bool semaDone; extern (D) this(const ref Loc loc, InitKind kind) diff --git a/src/dmd/initsem.d b/src/dmd/initsem.d index 728932377..16bdb7b56 100644 --- a/src/dmd/initsem.d +++ b/src/dmd/initsem.d -92,6 +92,17 Lno: */ extern(C++) Initializer initializerSemantic(Initializer init, Scope* sc, Type t, NeedInterpret needInterpret) { + + assert(init); + if (init.semaDone) + { + printf("init sema for `%s` already done\n", init.toChars()); + return init; + } + + scope(exit) + init.semaDone = true; + Initializer visitVoid(VoidInitializer i) { i.type = t; --- The test suite passes when using the flag to return earlier (although dmd.dsymbol.PASS would be more appropriated... in case someone wants to make a PR). --
Dec 25 2019