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?

Reply via email to