Revert fix for 18631.

The fix for 18631 broke code. Ranges cannot be marked with const or
inout in generic code. The range API does not require that any functions
be const or inout. In this case, with the changes, choice requires that
length and opSlice be const, breaking any code that uses a range with
choice that does not have a const length or opSlice (which is going to
be a large percentage of ranges with those functions which aren't
arrays).
This commit is contained in:
Jonathan M Davis 2018-03-22 18:18:18 -06:00
parent b87d28f2c7
commit 5d6d784c9a

View file

@ -2072,8 +2072,7 @@ Returns:
return a `ref` to the $(D range element), otherwise it will return
a copy.
*/
auto ref inout(ElementType!Range) choice(Range, RandomGen = Random)(inout auto ref Range range,
ref RandomGen urng)
auto ref choice(Range, RandomGen = Random)(auto ref Range range, ref RandomGen urng)
if (isRandomAccessRange!Range && hasLength!Range && isUniformRNG!RandomGen)
{
assert(range.length > 0,
@ -2110,13 +2109,6 @@ auto ref choice(Range)(auto ref Range range)
"Choice did not return a valid element from the given Range");
}
@safe unittest // issue 18631
{
const a = [0,1,2];
auto r = choice(a);
auto s = choice(cast(const)[0,1,2]);
}
@safe unittest
{
import std.algorithm.searching : canFind;