[Issue 19655] DMD generates wrong code for some circular dependencies

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Mar 21 12:11:52 UTC 2019


https://issues.dlang.org/show_bug.cgi?id=19655

Dlang Bot <dlang-bot at dlang.rocks> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |FIXED

--- Comment #3 from Dlang Bot <dlang-bot at dlang.rocks> ---
dlang/dmd pull request #9471 "Fix issues 19655, 19656, 19657, 19746 & 19750"
was merged into stable:

- 592d0c790b90be5aab9d011200b98efa539b4a27 by Puneet Goel:
  Fix issues 19655, 19656, 19657, 19746 & 19750

  The Semantic (pass 1) analysis for classes is handled by
visit(ClassDeclaration ) method of DsymbolSemanticVisitor class. For a given
class, this method may be run multiple times in order to resolve forward
references. The method incrementally tries to resolve the types referred to by
the members of the class.

  The subsequent calls to this method are short-circuited if the class members
have been fully analyzed. For this the code tests that it is not the first/main
call to the method (semanticRun == PASS.init else branch), scx is not set, and
that the cldec.symtab is already set. If all these conditions are met, the
method returns. But before returning, the method was setting cldec.semanticRun
to PASS.semanticdone. It should not set semanticRun since the class has not
been fully analyzed yet. The base class analysis for this class could be
pending and as a result vtable may not have been fully created.

  This fake setting of semanticRun results in the semantic analyzer to believe
that the class has been fully analyzed. As exposed by the issues 19656, 19657,
19746 and 19750, it may result in compile time errors when a derived type class
is getting analyzed and because of this fake semanticdone on the base class,
the semantic analysis construes that an overridden method is not defined in the
base class. Issue 19655 exposes a scenario where a buggy vtable may be created
and a call to class method may result in execution of some adhoc code.

https://github.com/dlang/dmd/pull/9471

--


More information about the Digitalmars-d-bugs mailing list