Bug 13615 – stable sort not usable in @safe code

Status
RESOLVED
Resolution
WORKSFORME
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2014-10-14T06:31:00Z
Last change time
2016-09-14T10:01:11Z
Keywords
safe
Assigned to
nobody
Creator
braddr
Depends on
16139
See also
https://issues.dlang.org/show_bug.cgi?id=16139

Comments

Comment #0 by braddr — 2014-10-14T06:31:28Z
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.
Comment #1 by bugzilla — 2016-06-08T05:43:10Z
This sort() calls TimSortImpl.sort(). It is @system because it calls uninitializedArray(), which is an @system function.
Comment #2 by bugzilla — 2016-06-08T05:58:02Z
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" ]); }
Comment #3 by bugzilla — 2016-06-08T06:06:48Z
This will also require https://issues.dlang.org/show_bug.cgi?id=16139 to be fixed first.
Comment #4 by bugzilla — 2016-09-14T10:01:11Z
This is working in the latest master.