On Friday, 25 February 2022 at 23:17:14 UTC, Paul Backus wrote:
[...]
Currently, selective imports are implemented using `alias`es
under the hood, which means that the compiler sees your `model`
module as having *two* overloads of `read`:
```d
alias read = std.file.read; // from selective import
int read (string filename)
{
// etc.
}
```
When you pass an overload set to a template that isn't written
to handle multiple overloads, it will usually just choose
whichever overload comes first in the source code. And since
the `public import` statement comes earlier in your source file
than the definition of `read`, the `std.file.read` alias is the
one that gets chosen when you write `Parameters!read`.
What about this:
```d
module model; // model.d
import std.file : read; // this line provokes the error
private int read (string filename) // now it's private
{
import std.file;
auto data = std.file.read (filename);
return 0;
}
```
Now dmd reports:
```
main.d(7): Error: undefined identifier `read`
```
Is the lookup and the processing done in different parts/stages
of the compiler?