Adding safe to the stable sort unit tests, as follows: @safe unittest { // Showcase stable sorting string[] words = [ "aBc", "a", "abc", "b", "ABC", "c" ]; sort!("toUpper(a) < toUpper(b)", SwapStrategy.stable)(words); assert(words == [ "a", "aBc", "abc", "ABC", "b", "c" ]); } std/algorithm.d(10241): Error: safe function 'std.algorithm.__unittestL10237_301' cannot call system function 'std.algorithm.sort!("toUpper(a) < toUpper(b)", cast(SwapStrategy)2, string[]).sort' I see no direct tests for either the quicksortimpl or timsortimpl, which is itself a problem. Creation of tests for both of those impls and having them marked @safe should be a part of fixing this issue.
This sort() calls TimSortImpl.sort(). It is @system because it calls uninitializedArray(), which is an @system function.
Better test case: @safe void foo() { import std.algorithm; // Showcase stable sorting string[] words = [ "aBc", "a", "abc", "b", "ABC", "c" ]; sort!("toUpper(a) < toUpper(b)", SwapStrategy.stable)(words); assert(words == [ "a", "aBc", "abc", "ABC", "b", "c" ]); }
This will also require https://issues.dlang.org/show_bug.cgi?id=16139 to be fixed first.
This is working in the latest master.