Fixing cyclic import static construction problems

Jason House jason.james.house at gmail.com
Sat Dec 1 19:18:11 PST 2012


On Thursday, 29 November 2012 at 02:34:11 UTC, Walter Bright 
wrote:
> For discussion:
>
> Cyclical Imports
>
> Problem:
>
> ---- a.d ----
>     module a;
>     import b;
>     static this () { ... }
> ---- b.d ----
>     module b;
>     import a;
>     static this() { ... }
> -------------
>
> Static constructors for a module are only run after static 
> constructors
> for all its imports are run. Circular imports, such as the 
> above, are
> detected at run time and the program is aborted.
>
> This can in general be solved by moving the static 
> constructor(s) into
> a third module, c.d, which does not import a or b. But, people 
> find this
> to be unnatural.
>
> Proposed Solution:
>
> Add a pragma,
>
>     pragma(cyclic_imports);
>
> This can appear anywhere in a module, and applies globally to 
> that module.
> It means that static constructors from imports that are not 
> part of the cycle
> are run first, and that the static constructor for this module 
> may be run before
> the static constructors of other modules that are part of the 
> cycle.
>
> If any static constructors in such a module with the pragma have
> the @safe attribute, that is a compile time error.

While more complex, would it be possible to declare which 
imported modules can be constructed after the current one? That 
allows catching any other unintended cyclic imports. For example:

static this {
   pragma(cyclic_import, b);
   // code that does not depend on
   // static constructor(s) in module b
}


More information about the Digitalmars-d mailing list