On 03/14/2013 06:51 PM, Andrei Alexandrescu wrote:
On 3/14/13 1:48 PM, H. S. Teoh wrote:
I don't agree. Phobos is a prime example. Does Phobos have unittests?
Yes, and lots of them. Does it still have non-compilable template
instantiations? Yes, because unittests can't cover all possibilities --
there are too many possible combinations of template arguments. There
are bound to be untested combinations which don't work but we're unaware
of.
If you found a few, that would be great. I don't think you'll have an
easy time.
Andrei
Challenge accepted. Clearly the Phobos developers do not instantiate
their templates before shipping them. :o)
The following breaks most of std.range, and most of std.algorithm could
likely be broken too, but I am too lazy to investigate.
import std.range, std.algorithm;
struct TrollFace{
@property string front()const{ return "troll"; }
@property string back()const{ return "face"; }
@property bool empty()const{ return true; }
void popFront()const{ }
void popBack()const{ }
@property inout(TrollFace) save()inout{ return this; }
auto opIndex(size_t index){ return front; }
@property size_t length()inout{ return 0; }
int* x;
}
struct TrollierFace{
TrollFace face;
alias face this;
@disable this(this);
@property inout(TrollierFace) save()inout{ return
inout(TrollierFace)(face); }
}
void main(){
immutable TrollFace a,b,c;
a.retro();
a.stride(2);
chain(a,b,c);
roundRobin(a,b,c);
a.radial();
a.radial(0);
a.take(2);
(immutable(TrollierFace)()).takeExactly(2);
(immutable(TrollierFace)()).takeOne();
(immutable(TrollierFace)()).takeNone();
(immutable(TrollierFace)()).drop(2);
(immutable(TrollierFace)()).dropExactly(0);
(immutable(TrollierFace)()).dropOne();
(immutable(TrollierFace)()).repeat();
a.cycle();
a.zip(b);
lockstep((immutable(TrollierFace)()),b);
a.frontTransversal();
a.transversal(0);
a.indexed([0]);
a.chunks(5);
a.filter!(a=>true);
a.map!(a=>a);
// ... (and so on)
}