Bug 9792 – length field of a const SortedRange

Status
NEW
Severity
normal
Priority
P3
Component
phobos
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-03-23T07:50:35Z
Last change time
2024-12-01T16:17:05Z
Keywords
rejects-valid
Assigned to
No Owner
Creator
bearophile_hugs
Depends on
7521
See also
https://issues.dlang.org/show_bug.cgi?id=7521
Moved to GitHub: phobos#9964 →

Comments

Comment #0 by bearophile_hugs — 2013-03-23T07:50:35Z
I'd like this code to work: import std.algorithm: sort; void main() { const data = [1, 5, 2].sort(); auto len = data.length; } DMD 2.063alpha gives: temp.d(4): Error: mutable method std.range.SortedRange!(int[], "a < b").SortedRange.length is not callable using a const object
Comment #1 by justin — 2014-02-03T16:25:48Z
(In reply to comment #0) > I'd like this code to work: > > > import std.algorithm: sort; > void main() { > const data = [1, 5, 2].sort(); > auto len = data.length; > } > > > DMD 2.063alpha gives: > > temp.d(4): Error: mutable method std.range.SortedRange!(int[], "a < > b").SortedRange.length is not callable using a const object Additionally `contains`, and probably `lowerBound`, `equalRange`, and `upperBound`.
Comment #2 by peter.alexander.au — 2014-02-07T13:31:03Z
This is easy to fix in the library, but we'd need special code to handle it correctly, which would need to be duplicated for every function. Once Issue 7521 is implemented, it will be solved automatically (the const will be inferred, when possible).
Comment #3 by acehreli — 2020-02-26T23:00:06Z
I ran into this in a post condition code: import std.algorithm; auto foo() out (result; result.length == 1) { // <-- ERROR return [ 0 ].sort; } void main() { } Error: mutable method `std.range.SortedRange!(int[], "a < b").SortedRange.length` is not callable using a `const` object Consider adding `const` or `inout` to std.range.SortedRange!(int[], "a < b").SortedRange.length Ali
Comment #4 by witold.baryluk+d — 2020-04-30T13:46:20Z
I got similar issues with constness, in other cirumstances. `opIndex` and `opSlice` could be made const too, if they return const range or SortedRange, and underlying Range is const. I have a method like this: void search(Range, T)(in T[] needles, in SortedRange!(Range) haystack, long[] ret, const long index_offset) { it is called as search(needles, assumeSorted(kaystack), ret, 0); but the body of this function does pose issues: search.d:67:7: error: mutable method std.range.SortedRange!(const(int)[], "a < b").SortedRange.length is not callable using a const object 67 | if (haystack.length == 0) { | ^ search.d:83:17: error: mutable method std.range.SortedRange!(const(int)[], "a < b").SortedRange.opIndex is not callable using a const object 83 | if (haystack[i] == needles[j]) { This is with gdc 9.3.0-11 and libgphobos76 9.3.0-11. It looks like automatic inference of const methods, or specialization of const and non-const (at the cost of repeating the same code twice) is required to make it work.
Comment #5 by witold.baryluk+d — 2020-04-30T14:27:00Z
Same issue with `SortedRange.trisect` too.
Comment #6 by robert.schadek — 2024-12-01T16:17:05Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/phobos/issues/9964 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB