www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 20467] New: initializerSemantic() is run multiple times for a

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