module m1; struct Foo { int x; } module m2; struct Foo { int x; int y; } module m; import M1 = m1; import M2 = x2; // line 4 import M2 = m2; // line 5 M2.Foo convert(M1.Foo foo) { M2.Foo result = void; result.x = foo.x; result.y = foo.y; return result; } m.d(7): Error: identifier 'Foo' of 'M2.Foo' is not defined m.d(7): Error: M2.Foo is used as a type Note that swapping lines 4 and 5 workarounds the issue. But there appears another issue: m.d(11): Error: no property 'y' for type 'Foo' Which one? Error should mention be M1.Foo instead of just Foo. (Shall I move it into separate enhancement issue?)
The first thing it complains about should be that x2 is not found. Or if it is, that M2 is defined twice. I agree about your last comment. It should probably be (and might already be, but I'm not sure) filed as a separate issue.
cat > m1.d << CODE module m1; struct Foo { int x; } CODE cat > m2.d << CODE module m2; struct Foo { int x; int y; } CODE cat > m.d << CODE module m; import M1 = m1; import M2 = x2; // line 4 import M2 = m2; // line 5 M2.Foo convert(M1.Foo foo) { M2.Foo result = void; result.x = foo.x; result.y = foo.y; return result; } CODE dmd -c m.d ---------- With dmd2.057: m.d(4): Error: module x2 is in file 'x2.d' which cannot be read