Bug 7878 – A problem with purity and general templated algorithms
Status
RESOLVED
Resolution
FIXED
Severity
enhancement
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-04-09T10:54:00Z
Last change time
2012-06-04T03:01:13Z
Keywords
pull
Assigned to
nobody
Creator
bearophile_hugs
Comments
Comment #0 by bearophile_hugs — 2012-04-09T10:54:17Z
This is a spinoff of the closed Issue 7864 , see there for more info.
This is not a bug report and it's not even a real enhancement request, it's just a note to not forget a small but what I think real problem in D+Phobos. At the moment I don't have suggestions to how improve the situation. Ideas are welcome.
This is wrong D2 code:
class C {
string str;
this(string str_) {
this.str = str_;
}
override int opCmp(Object o) const {
import std.string;
auto rhs = cast(C)o;
assert(rhs);
return cmp(str, rhs.str);
}
}
struct S {
C c;
int opCmp()(const auto ref S rhs) const pure {
if (c < rhs.c) return -1;
if (c > rhs.c) return 1;
return 0;
}
}
void main() {
import std.algorithm;
S[] stuff;
sort(stuff);
}
DMD 2.059beta4 gives:
...\dmd2\src\phobos\std\algorithm.d(6802): Error: static assert "Invalid predicate passed to sort: a < b"
test.d(29): instantiated from here: sort!("a < b",cast(SwapStrategy)0,S[])
The error message looks correct, but it's really too much general, it doesn't give enough information to the
programmer, that is left to guess why the code doesn't work. This is quite bad.
To fix this program the first opCmp too must be pure:
override int opCmp(Object o) const pure {
But in a little more complex program it risks being not easy to find such bugs.
Comment #1 by k.hara.pg — 2012-04-10T03:32:39Z
It is std.functional.binaryFun and std.algorithm.sort problem, not compiler's.
If the instantiation of predicate "a < b" that given to sort template function is failed, they hide actual errors and instead print their own error messages by static assert.
Comment #2 by issues.dlang — 2012-04-10T10:14:26Z
That may be, but if overloaded operators are wrong (especially opEquals and opCmp), I would expect the compiler to give errors for those types before any instantiation of sort was even attempted, and clearly, that's not happening.