> Hi, > > I am trying to compile the code that was working with dmd 2.050 using > dmd 2.052. > > The code compiles but it gives me errors with message when trying to run: > > Cycle detected between modules with ctors/dtors > > This was not happening earlier with 2.050. I am not able to produce a > smaller test case for this but it is happening with a lot of code > pieces. A few scenarios in which this is happening is if a class passes > its reference to child class for usage. > > I understand that the above might not be a fit datapoint for analysis > but wanted to understand if this is known or someone else has faced this?
It happens when a module imports - directly or indirectly - another module which imports it - directly or indirectly - and they both have static constructors and/or static destructors (it _might_ not happen if one of them has static constructors but not static destructors and the other has static destructors and no static constructors, but if they both have either a static constructor or static destructor, it _will_ happen). This is because the compiler cannot determine which order to run the static constructors/destructors in. It doesn't know whether one depends on the other or whether the order matters, so it just doesn't accept it (though you usually get the error at runtime, not when it compiles; I'm not sure how or why you'd get it at compile time). Now, why you weren't seeing the problem with dmd 2.050 but are now with dmd 2.052, I don't know. The solution is generally to either make it so that one of the modules doesn't have any static constructors or destructors or to offload the initialization to another module (such as std.stdio does with std.stdiobase) by having the new module's static constructor call a function in the original module to do the initialization for that module. But if you do that, you then have the responsibility to make sure that there isn't an actual circular dependency in the static constructors themselves, or you're going to run into trouble. You can find discussions on how to solve the problem in the archives - probably on the D newsgroup. - Jonathan M Davis