Bugs in template constraints
Andrej Mitrovic
andrej.mitrovich at gmail.com
Tue Aug 3 11:59:22 PDT 2010
There seem to be some bugs with template constraints. Here's a reduce example (from TDPL) which will not compile:
import std.stdio;
import std.range;
@property bool empty(T)(T[] a) { return a.length == 0; }
@property ref T front(T)(T[] a) { return a[0]; }
void popFront(T)(ref T[] a) { a = a[1 .. $]; }
V reduce(alias fun, V, R)(V x, R range)
if (is(typeof(x = fun(x, range.front)))
&& is(typeof(range.empty) == bool)
&& is(typeof(range.popFront())))
{
//~ writeln(is(typeof(x = fun(x, range.front))));
//~ writeln(is(typeof(range.empty) == bool));
//~ writeln(is(typeof(range.popFront())));
for ( ; !range.empty; range.popFront()) {
x = fun(x, range.front);
}
return x;
}
unittest {
int[] r = [10, 14, 3, 5, 23];
// compute sum
int sum = reduce!((a, b) { return a + b; })(0, r);
assert(sum == 55);
// compute minimum
int min = reduce!((a, b) { return a < b ? a : b; })(r[0], r);
assert(min == 3);
}
void main()
{
}
Errors:
reduce_original.d(28): Error: template reduce_original.reduce(alias fun,V,R) if (is(typeof(x = fun(x,range.front))) && is(typeof(range.empty) == bool) && is(typeof(range.popFront()))) does not match any function template declaration
reduce_original.d(28): Error: template reduce_original.reduce(alias fun,V,R) if (is(typeof(x = fun(x,range.front))) && is(typeof(range.empty) == bool) && is(typeof(range.popFront()))) cannot deduce template function from argument types !(__dgliteral1)(int,int[])
reduce_original.d(28): Error: template instance errors instantiating template
reduce_original.d(32): Error: template reduce_original.reduce(alias fun,V,R) if (is(typeof(x = fun(x,range.front))) && is(typeof(range.empty) == bool) && is(typeof(range.popFront()))) does not match any function template declaration
reduce_original.d(32): Error: template reduce_original.reduce(alias fun,V,R) if (is(typeof(x = fun(x,range.front))) && is(typeof(range.empty) == bool) && is(typeof(range.popFront()))) cannot deduce template function from argument types !(__dgliteral4)(int,int[])
reduce_original.d(32): Error: template instance errors instantiating template
If I comment out the constraints, and uncomment those writeln's - which are the same as the constraints - like so:
V reduce(alias fun, V, R)(V x, R range)
//~ if (is(typeof(x = fun(x, range.front)))
//~ && is(typeof(range.empty) == bool)
//~ && is(typeof(range.popFront())))
{
writeln(is(typeof(x = fun(x, range.front))));
writeln(is(typeof(range.empty) == bool));
writeln(is(typeof(range.popFront())));
for ( ; !range.empty; range.popFront()) {
x = fun(x, range.front);
}
return x;
}
I will get all true results back:
true
true
true
true
true
true
I'm filing a bug unless something else is to blame here.
More information about the Digitalmars-d
mailing list