Hi,
I came across a issue with the order in which druntime calls the module destructors. I created a small repro case for it:

file a.d:
module a;

import logger;

shared static this()
{
  log("a init");
}

shared static ~this()
{
  log("a deinit");
}

file b.d:
module b;

import mix;

class Foo
{
  mixin logIt;
}

file logger.d:
module logger;

import std.stdio;

shared static this()
{
  writefln("logger init");
}

void log(string message)
{
  writefln(message);
}

shared static ~this()
{
  writefln("logger deinit");
}

file main.d:
module main;


import std.stdio;

import a;

import b;



int main(string[] argv)
{
  auto foo = new Foo();

  writefln("main");

  return 0;

}


mix.d:
module mix;

public import logger;

mixin template logIt()
{
  static shared this()
  {
    log(typeof(this).stringof ~ " init");
  }

  static shared ~this()
  {
    log(typeof(this).stringof ~ " deinit");
  }
}

Compile with: dmd a.d b.d logger.d main.d mix.d -oftest.exe
Running gives the following output:

logger init
a init
shared(Foo) init
main
a deinit
logger deinit
shared(Foo) deinit

That means that the logger module destructor is called before the b module actually gets destructed which leads to the logger beeing used in a destructed state. In my real world case this leads to a fiel operation on a closed file handle. Is this intended behaviour or is this a bug? I assume this happens because of the mixin template and the public import.
I'm using dmd 2.058.

--
Kind Regards
Benjamin Thaut

Reply via email to