On Fri, 17 Sep 2010 17:15:31 -0400, Seth Hoenig <seth.a.hoe...@gmail.com>
wrote:
I have these two minimal programs:
import std.string;
void main()
{
string str = "abc";
int i = str.count("ab");
}
and:
import std.string;
import std.algorithm;
void main()
{
string str = "abc";
int i = str.count("ab");
}
The only difference is line 2, where I import std.algorithm.
The first program compiles fine, but the second program does not compile,
spitting out the error message:
bash-3.2$ dmd -ofdummy dummy.d
/u/sah2659/dmd2/linux/bin/../../src/phobos/std/functional.d(176): Error:
static assert "Bad binary function q{a == b}. You need to use a valid D
expression using symbols a of type dchar and b of type string."
/u/sah2659/dmd2/linux/bin/../../src/phobos/std/functional.d(179):
instantiated from here: Body!(dchar,string)
/u/sah2659/dmd2/linux/bin/../../src/phobos/std/algorithm.d(3410):
instantiated from here: result!(dchar,string)
dummy.d(7): instantiated from here: count!("a == b",string,string)
I can't imagine I'm the first person to notice a bug like this, so is
there
something I am doing wrong?
I see two bugs here. First, this should be an ambiguity error, because
count matches both std.algorithm.count and std.string.count. The compiler
should refuse to compile this I think.
Second, std.algorithm.count looks like this:
size_t count(alias pred = "a == b", Range, E)(Range r, E value) if
(isInputRange!(Range))
So, E can be any type, completely unrelated to strings, I could do:
count!(string, int[]) which makes no sense.
I think the sig should be
size_t count(alias pred = "a == b", Range, E)(Range r, E value) if
(isInputRange!(Range) && isImplicitlyConvertable!(E, ElementType!(Range)))
-Steve