[Issue 8368] New: std.algorithm.sort's template constraint is inadequate

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Jul 10 00:24:38 PDT 2012


http://d.puremagic.com/issues/show_bug.cgi?id=8368

           Summary: std.algorithm.sort's template constraint is inadequate
           Product: D
           Version: unspecified
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: jmdavisProg at gmx.com


--- Comment #0 from Jonathan M Davis <jmdavisProg at gmx.com> 2012-07-10 00:24:37 PDT ---
This code fails to compile

import std.algorithm;

void main()
{
    auto str = ["foo", "bar"].map!(x => x);
    auto f = str.sort();
}

giving this string of errors

/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7272): Error:
r[i2] is not an lvalue
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7273): Error:
r[i1] is not an lvalue
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7201): Error:
template instance std.algorithm.swapAt!(Result) error instantiating
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7285):       
instantiated from here: getPivot!(binaryFun,Result)
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7034):       
instantiated from here: sortImpl!(binaryFun,cast(SwapStrategy)0,Result)
q.d(8):        instantiated from here: sort!("a <
b",cast(SwapStrategy)0,Result)
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7285): Error:
template instance std.algorithm.getPivot!(binaryFun,Result) error instantiating
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7034):       
instantiated from here: sortImpl!(binaryFun,cast(SwapStrategy)0,Result)
q.d(8):        instantiated from here: sort!("a <
b",cast(SwapStrategy)0,Result)
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7239): Error:
r[j] is not an lvalue
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7242): Error:
r[j] is not an lvalue
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7357): Error:
template instance std.algorithm.optimisticInsertionSort!(binaryFun,Result)
error instantiating
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7034):       
instantiated from here: sortImpl!(binaryFun,cast(SwapStrategy)0,Result)
q.d(8):        instantiated from here: sort!("a <
b",cast(SwapStrategy)0,Result)
/home/jmdavis/dmd2/linux/bin/../../src/phobos/std/algorithm.d(7034): Error:
template instance std.algorithm.sortImpl!(binaryFun,cast(SwapStrategy)0,Result)
error instantiating
q.d(8):        instantiated from here: sort!("a <
b",cast(SwapStrategy)0,Result)
q.d(8): Error: template instance std.algorithm.sort!("a <
b",cast(SwapStrategy)0,Result) error instantiating

Clearly, sort's template constraint didn't properly catch the fact that the
range being passed to map wouldn't compile with sort. sort fails to even test
that the range is a random-access range! sort needs a proper template
constraint which fails to compile with any range which won't work with it
(either that or static asserts which give informative error messages when the
type isn't going to work with sort). And some of the helper functions should
probably have proper template constraints as well - e.g. the actual line that
fails to compile is in swapAt, which has no template constraint.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list