Scoped import bug?

Kenji Hara k.hara.pg at gmail.com
Thu May 9 02:52:09 PDT 2013


On Thursday, 9 May 2013 at 05:01:15 UTC, Mike Linford wrote:
> I'm not sure whether or not I've encountered a bug or whether 
> my understanding of scoped imports is just faulty.
>
> blah.d:
>
>   1 module blah;
>   2
>   3 version(A)
>   4 {
>   5    import std.range;
>   6 }
>   7
>   8 struct Blah(R)
>   9 {
>  10    version(B)
>  11    {
>  12       import std.range;
>  13    }
>  14    static assert(isInputRange!R);
>  15
>  16    void blah(R r)
>  17    {
>  18       version(C)
>  19       {
>  20          assert(r.front == 'h');
>  21       }
>  22    }
>  23 }
>  24
>  25 void main()
>  26 {
>  27    Blah!string blah;
>  28    blah.blah("hello");
>  29 }
>
> Results:
> rdmd -version=A -version=C blah
> Compiles fine. Module-level import works for the static assert 
> on line 14 and the runtime assert on line 20
>
> rdmd -version=B blah
> Compiles fine! Struct-level import works for the static assert 
> on line 14
>
> rdmd -version=B -version=C blah
> Fails to compile. I get the following error messages:
> blah.d(20): Error: no property 'front' for type 'string'
> blah.d(27): Error: template instance blah.Blah!(string) error 
> instantiating
>
> So it appears that when my import is at the struct level like 
> line 12 I'm able to use the static assert but *not* the runtime 
> assert. Why cant the function Blah.blah() find the array 
> implementation of front?

This is a known UFCS name look-up issue.
In 2.063dev, the bug is fixed. Please wait the release.

Kenji Hara


More information about the Digitalmars-d-learn mailing list