Bug 5786 – std.algorithm.sort does not work with std.container.Array: Range violation

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2011-03-27T01:16:00Z
Last change time
2012-04-23T18:23:00Z
Assigned to
andrei
Creator
issues.dlang

Comments

Comment #0 by issues.dlang — 2011-03-27T01:16:18Z
This program import std.algorithm; import std.container; void main() { Array!int arr; arr.insert([1, 7, 2, 8, 3]); sort(arr[]); } throws this AssertError when it runs: [email protected](1709): Range violation ---------------- ./test(onRangeError+0x28) [0x80b3ec8] ./test(_d_array_bounds+0x16) [0x80acc96] ./test(_D3std9container7__arrayZ+0x12) [0x80aec26] ./test(_D3std9container12__T5ArrayTiZ5Array5Range6moveAtMFkZi+0x95) [0x80a33a1] ./test(_D3std5range53__T6moveAtTS3std9container12__T5ArrayTiZ5Array5RangeZ6moveAtFS3std9container12__T5ArrayTiZ5Array5RangekZi+0x12) [0x80a8f06] ./test(_D3std9algorithm53__T6swapAtTS3std9container12__T5ArrayTiZ5Array5RangeZ6swapAtFS3std9container12__T5ArrayTiZ5Array5RangekkZv+0x3e) [0x80a8e9e] ./test(_D3std9algorithm168__T8sortImplS793std10functional54__T13binaryFunImplVAyaa5_61203c2062VAyaa1_61VAyaa1_62Z6resultVE3std9algorithm12SwapStrategy0TS3std9container12__T5ArrayTiZ5Array5RangeZ8sortImplFS3std9container12__T5ArrayTiZ5Array5RangeZv+0x61) [0x80a8ca9] ./test(_D3std9algorithm99__T4sortVAyaa5_61203c2062VE3std9algorithm12SwapStrategy0TS3std9container12__T5ArrayTiZ5Array5RangeZ4sortFS3std9container12__T5ArrayTiZ5Array5RangeZS3std5range76__T11SortedRangeTS3std9container12__T5ArrayTiZ5Array5RangeVAyaa5_61203c2062Z11SortedRange+0x28) [0x80a8718] ./test(_Dmain+0x56) [0x80a2aaa] ./test(_D2rt6dmain24mainUiPPaZi7runMainMFZv+0x1a) [0x80acdf6] ./test(_D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv+0x20) [0x80acd88] ./test(_D2rt6dmain24mainUiPPaZi6runAllMFZv+0x32) [0x80ace3a] ./test(_D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv+0x20) [0x80acd88] ./test(main+0x94) [0x80acd34] /usr/lib32/libc.so.6(__libc_start_main+0xe6) [0xf758bdb6] ./test() [0x80a29a1]
Comment #1 by kennytm — 2011-03-27T05:42:36Z
The function which emits the error is T moveAt(size_t i) { i += _a; enforce(i < _b && !empty); return move(_outer._data._payload[_a + i]); // <--- } That line should really read return move(_outer._data._payload[i]);
Comment #2 by andrei — 2011-03-28T12:11:43Z
Thanks Jonathan for reporting and Kenny for finding this bug.
Comment #3 by lovelydear — 2012-04-23T03:23:26Z
Compiles and runs fine with 2.059 Win32.