On Thursday, 16 October 2014 at 11:54:09 UTC, Chris wrote:

Ok, I've found the flaw in my program. It's code that was left over after refactoring some modules. It looks like this (simplified):

I import a module and access an enum in that module. However, I never use the accessed element

module politician.answer;

enum { Statement = "Blah" }

mixin template PressConference {
  int STATEMENT_LEN;
  // ...
}

-------------

module press.article;

mixin PressConference;
this() {
STATEMENT_LEN = Statement.length; // Not good! Left over code from refactoring.
}

Even worse, I never use STATEMENT_LEN in this class. The whole logic is non-sense and is due to my not cleaning up the constructor.

So the optimizer optimized this away, seeing that it is never used, but it is still accessed in the class constructor.

My question now is, shouldn't the optimizer have noticed that it is still being accessed? Or what did the optimizer actually do.

This helped me to find "dead code" at least.

Update on the above. I actually do use the variable STATEMENT_LEN later in the mixed in code. This escapes the optimizer.

mixin template PressConference {
  int STATEMENT_LEN;
  // ...
  void someFunction() {
    // uses STATEMENT_LEN
  }
}

Hm.

Reply via email to