Comment #0 by bearophile_hugs — 2014-07-06T12:19:22Z
In dmd 2.066beta1 this compiles and works correctly:
void main() pure nothrow @safe @nogc {
import std.algorithm: sort;
import std.math: abs;
int[3] data = [-2, 1, 3];
auto r = data[].sort!q{a.abs < b.abs};
}
But schwartzSort doesn't support each of those tags:
void main() pure nothrow @safe @nogc {
import std.algorithm: schwartzSort;
import std.math: abs;
int[3] data = [-2, 1, 3];
auto r = data[].schwartzSort!abs;
}
temp.d(5,20): Error: pure function 'D main' cannot call impure function 'std.algorithm.schwartzSort!(abs, "a < b", cast(SwapStrategy)0, int[]).schwartzSort'
temp.d(5,20): Error: safe function 'D main' cannot call system function 'std.algorithm.schwartzSort!(abs, "a < b", cast(SwapStrategy)0, int[]).schwartzSort'
temp.d(5,20): Error: @nogc function 'D main' cannot call non-@nogc function 'std.algorithm.schwartzSort!(abs, "a < b", cast(SwapStrategy)0, int[]).schwartzSort'
temp.d(5,20): Error: 'std.algorithm.schwartzSort!(abs, "a < b", cast(SwapStrategy)0, int[]).schwartzSort' is not nothrow
temp.d(1,6): Error: function 'D main' is nothrow yet may throw
A schwartzSort has to allocate the mapped items, so perhaps it can't be @nogc (unless you allocate them on the C heap), but I think it can support the other tags.
Comment #3 by stanislav.blinov — 2021-12-08T18:54:42Z
Nowadays schwartzSort infers nothrow @safe and @nogc, but not pure as it seems to rely on its own "trustedMalloc" and "trustedFree" instead of core.memory.pure{Malloc,Free}.
Comment #4 by stanislav.blinov — 2021-12-08T21:37:13Z