module test; struct Foo { } void main() { Foo x; int Foo; Foo y; // Error: Foo is used as a type } Compare the above to this: module a; int Foo; module b; struct Foo { } module main; import a; import b; void main() { Foo m; } main.d(7): Error: a.Foo at a.d(2) conflicts with b.Foo at b.d(2) main.d(7): Error: Foo is used as a type The first code example could instead output: test.d(8): Error: test.Foo at test.d(3) conflicts with test.Foo at test.d(7) test.d(8): Error: Foo is used as a type
But it doesn't conflict. They are in different scopes, one nested inside the other. The nested one overrides the outer one - not conflicts with it.