[Issue 13808] Scoped import in struct body hijacks UFCS

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Thu Dec 4 07:04:26 PST 2014


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

--- Comment #4 from Kenji Hara <k.hara.pg at gmail.com> ---
(In reply to hsteoh from comment #2)
> Argh... yet another scoped import pathological behaviour. Apparently putting
> an import in the body of a struct S pulls symbols into the struct's
> namespace, so that S.symbol now refers to the imported symbol.

Any imported symbols in struct body scope should not be visible via the struct
instance object.

> This is really nasty, and greatly limits the usefulness of scoped imports,
> for example:
> 
> -----
> // mod.d
> module mod;
> struct S {
>     // This is necessary for myFunc, and we can't move it inside myFunc,
>     // because we need it in the sig constraint
>     import std.range.primitives : isInputRange;
> 
>     auto myFunc(R)(R input)
>         if (isInputRange!R)
>     { ... }
> }
> 
> // main.d
> import mod;
> void main() {
>     S s;
>     static if (s.isInputRange!(int[])) { // this actually works :-(
>        ...
>     }
>     static if (isInputRange!(int[])) { // whereas this doesn't compile
>     }
> }
> -----

My import mechanism improvement will disallow the weird name lookup
`s.isInputRange!(int[])`.

https://github.com/D-Programming-Language/dmd/pull/3407

--


More information about the Digitalmars-d-bugs mailing list