www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - imported version specifications fail in some cases

I have a module foody:

--------
version = foody;
--------

Another module looks like this:

--------
import std.stdio;
import foody;

version (foody) {
   int f() { return 77; }
}
version (bardy) {
   int f() { return 3; }
}

void main() {
   writefln(f());
}
--------

This won't compile, saying that f is and undefined identifier.

Doing it the way below works as expected:

--------
import std.stdio;
import foody;

void main() {
version (foody) {
   int f() { return 77; }
}
version (bardy) {
   int f() { return 3; }
}
   writefln(f());
}
--------

Maybe you should specify the rules for version specification lookup? I 
would expect one of two;

1. version specifications are applied after they have been found 
(lexically? not to sure about the wording to use). That is;

-----------
version (foody) { int foo() {return 77;} }
version = foody; // or import with version = foody;
-----------

The version block is kept out of the compilation. Switching the lines 
works. (This is the way it works with the version specification 
statement. Due to the behaviour outlined above, I can't test it with 
imports.)

2. all version specifications are looked up before checking if a block 
should be compiled in or not. I suspect that this solution can lead to a 
  recursive nightmare, as version blocks can hold further specifications 
and imports.

Personally, I think 1 is the correct answer (and that 1 *should* be the 
correct answer) but that the implementation is somewhat lacking.

Lars Ivar Igesund
Jul 26 2004