Fix Issue 20751 - SortedRange with ref predicate parameters fails

isTwoWayCompatible should accept functions with ref parameters.
This commit is contained in:
MoonlightSentinel 2020-04-26 00:43:37 +02:00
parent 9844c34196
commit 54dbc0668c
No known key found for this signature in database
GPG key ID: 1A1A60AECDC956AB
2 changed files with 24 additions and 11 deletions

View file

@ -2067,6 +2067,17 @@ if (((ss == SwapStrategy.unstable && (hasSwappableElements!Range ||
r.sort(); r.sort();
assert(proxySwapCalled); assert(proxySwapCalled);
} }
// https://issues.dlang.org/show_bug.cgi?id=20751
{
static bool refPred(ref int a, ref int b)
{
return a < b;
}
auto sortedArr = [5,4,3,2,1].sort!refPred;
sortedArr.equalRange(3);
}
} }
private void quickSortImpl(alias less, Range)(Range r, size_t depth) private void quickSortImpl(alias less, Range)(Range r, size_t depth)

View file

@ -10540,21 +10540,19 @@ version (none)
Returns true if `fn` accepts variables of type T1 and T2 in any order. Returns true if `fn` accepts variables of type T1 and T2 in any order.
The following code should compile: The following code should compile:
--- ---
T1 foo(); (ref T1 a, ref T2 b)
T2 bar(); {
fn(a, b);
fn(foo(), bar()); fn(b, a);
fn(bar(), foo()); }
--- ---
*/ */
template isTwoWayCompatible(alias fn, T1, T2) template isTwoWayCompatible(alias fn, T1, T2)
{ {
enum isTwoWayCompatible = is(typeof( (){ enum isTwoWayCompatible = is(typeof((ref T1 a, ref T2 b)
T1 foo(); {
T2 bar(); cast(void) fn(a, b);
cast(void) fn(b, a);
cast(void) fn(foo(), bar());
cast(void) fn(bar(), foo());
} }
)); ));
} }
@ -10568,6 +10566,10 @@ template isTwoWayCompatible(alias fn, T1, T2)
static assert(isTwoWayCompatible!(func1, int, int)); static assert(isTwoWayCompatible!(func1, int, int));
static assert(isTwoWayCompatible!(func1, short, int)); static assert(isTwoWayCompatible!(func1, short, int));
static assert(!isTwoWayCompatible!(func2, int, float)); static assert(!isTwoWayCompatible!(func2, int, float));
void func3(ref int a, ref int b);
static assert( isTwoWayCompatible!(func3, int, int));
static assert(!isTwoWayCompatible!(func3, short, int));
} }