[Issue 15925] -transition=[check]imports ignores import declaration from mixin templates

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Tue Jul 19 14:21:29 PDT 2016


https://issues.dlang.org/show_bug.cgi?id=15925

--- Comment #18 from Mathias Lang <mathias.lang at sociomantic.com> ---
(In reply to Steven Schveighoffer from comment #17)
> (In reply to Mathias Lang from comment #16)
> > The details of the bug were wrong (it should be ignored unlike what I
> > originally believed)
> 
> While this has your attention, can you point me at the rationale to why this
> is so? See my earlier comment 14.

Sorry, I forgot to reply to c14.

The rationale is that this behavior allowed symbol hijacking.

The behavior of the compiler was changed to perform 2 passes for symbol
resolution, the first one on local symbol, the second one on imports.

E.g. the infamous:

```
static immutable text = "Hello world";

void main ()
{
  import std.conv;
  writeln(text);
}
```

Used to print nothing because the imported 'std.conv.text' symbol used to take
priority. This proved to be a frequent source of confusion for developers.
See https://issues.dlang.org/show_bug.cgi?id=10378 for the actual issue.

Now there is something special about 'mixin template' and 'class' / 'interface'
declaration: they are the only remote (as in, outside of the module) symbol one
can inherit it's scope from. 

But inheriting the imports leads to the same issues 10378 describe: you can end
up in a situation where adding a symbol to module 'foo' which is 'protected
import' of class 'A' will suddenly change which symbol is selected in subclass
'B : A'. However, if you have both imports at the same level, you'll get a
conflict.

The only kind of hijacking I can think of ATM is when an import which is more
nested than another one introduce an already-used symbol.

E.g. if this class used 'b.myFunc' before and a new library introduce
'd.myFunc': 
```
import b;

class Foo
{
    import d;
    pragma(msg, typeof(myFunc));
}
```

Hope that was clear enough. Feel free to reach out to me by email if not.


> BTW, we shouldn't rename or repurpose bugs like this.

I generally agree. In this case, the P.R. was already merged and appeared in
the changelog. It created confusion (
https://forum.dlang.org/post/nl2bgi$2oim$1@digitalmars.com ), so I took the
pragmatic road and just fixed stuff.

--


More information about the Digitalmars-d-bugs mailing list