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