From 5d6d784c9af460d136a20aa6e30bbd8df79e624c Mon Sep 17 00:00:00 2001 From: Jonathan M Davis Date: Thu, 22 Mar 2018 18:18:18 -0600 Subject: [PATCH] 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). --- std/random.d | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/std/random.d b/std/random.d index 1eee91c5433..aca2e9cd288 100644 --- a/std/random.d +++ b/std/random.d @@ -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;