The range interfaces (InputRange, OutputRange, etc) and their helper creation functions hide the @safe-ness. This makes it problematic to use them in what would otherwise be @safe code. For instance, in std/algorithm.d: unittest { // joiner() should work for non-forward ranges too. InputRange!string r = inputRangeObject(["abc", "def"]); assert (equal(joiner(r, "xyz"), "abcxyzdef")); } yields: std/algorithm.d(3927): Error: safe function 'std.algorithm.__unittestL3923_114' cannot call system function 'std.algorithm.joiner!(InputRange!string, string).joiner' std/algorithm.d(3927): Error: safe function 'std.algorithm.__unittestL3923_114' cannot call system function 'std.algorithm.equal!().equal!(Result, string).equal'
pass in 2.069
That unittest, now in std/algorithm/iteration.d, isn't marked pure yet. Looking at std.range.interfaces, only one test is marked @pure. For this to be closed, unit tests are needed.
(In reply to Brad Roberts from comment #2) > That unittest, now in std/algorithm/iteration.d, isn't marked pure yet. > Looking at std.range.interfaces, only one test is marked @pure. For this to > be closed, unit tests are needed. I presume you meant @safe, not @pure. The unittest is indeed now marked as @safe.