masking of module-level functions with local imports

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 8 20:52:18 PDT 2015


Consider these two imports:

a.d:
module a;
void foo(int) {}

b.d:
module b;
void foo(string) {}

Now, we import them and use them:

main.d:
import a;
import b;

void main()
{
    foo(1);
    foo("hi");
}

Works great. Now let's use a local import instead:

main.d:
import a;

void main()
{
    import b;
    foo(1);
    foo("hi");
}

oops, doesn't work. Because b masks all other overloads for foo.

I have to say, this doesn't seem right. What I want when I import inside 
a local scope is to treat all code in that scope as if I *had* imported 
that module at module level.

I realize changing this would mean that existing code would break. But 
what this does, effectively, is destroy any possibility to overload 
functions across modules reliably.

See this regression: https://issues.dlang.org/show_bug.cgi?id=15179

How can we fix this? 'to' really *is* a UFCS function, it shouldn't be a 
member. Do we just say "sorry, please make all your imports local"?

Another *horrendous* issue I have seen:

a.d:
module a;
void foo(int) {}

main.d:

void foo(string) {}
void main()
{
    import main; // yes, you have to import main inside main
    import a;
    foo("hi");
}

Can we fix this?

-Steve


More information about the Digitalmars-d mailing list