mirror of
https://github.com/dlang/phobos.git
synced 2025-05-11 14:41:08 +03:00
Fix Issue 21183 - schwartzSort does not strip const
Fixed by using the unqualified type if possible
This commit is contained in:
parent
1f1a80d0a0
commit
255f9496d1
1 changed files with 38 additions and 2 deletions
|
@ -2981,18 +2981,25 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R &&
|
||||||
static if (is(typeof(unaryFun!transform(r.front))))
|
static if (is(typeof(unaryFun!transform(r.front))))
|
||||||
{
|
{
|
||||||
alias transformFun = unaryFun!transform;
|
alias transformFun = unaryFun!transform;
|
||||||
alias T = typeof(transformFun(r.front));
|
alias TB = typeof(transformFun(r.front));
|
||||||
enum isBinary = false;
|
enum isBinary = false;
|
||||||
}
|
}
|
||||||
else static if (is(typeof(binaryFun!transform(r.front, 0))))
|
else static if (is(typeof(binaryFun!transform(r.front, 0))))
|
||||||
{
|
{
|
||||||
alias transformFun = binaryFun!transform;
|
alias transformFun = binaryFun!transform;
|
||||||
alias T = typeof(transformFun(r.front, 0));
|
alias TB = typeof(transformFun(r.front, 0));
|
||||||
enum isBinary = true;
|
enum isBinary = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
static assert(false, "unsupported `transform` alias");
|
static assert(false, "unsupported `transform` alias");
|
||||||
|
|
||||||
|
// The `transform` function might return a qualified type, e.g. const(int).
|
||||||
|
// Strip qualifiers if possible s.t. the temporary array is sortable.
|
||||||
|
static if (is(TB : Unqual!TB))
|
||||||
|
alias T = Unqual!TB;
|
||||||
|
else
|
||||||
|
static assert(false, "`transform` returns an unsortable qualified type: " ~ TB.stringof);
|
||||||
|
|
||||||
static trustedMalloc(size_t len) @trusted
|
static trustedMalloc(size_t len) @trusted
|
||||||
{
|
{
|
||||||
import core.checkedint : mulu;
|
import core.checkedint : mulu;
|
||||||
|
@ -3168,6 +3175,35 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
|
||||||
assert(arr.isSorted());
|
assert(arr.isSorted());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://issues.dlang.org/show_bug.cgi?id=21183
|
||||||
|
@safe unittest
|
||||||
|
{
|
||||||
|
static T get(T)(int) { return T.init; }
|
||||||
|
|
||||||
|
// There's no need to actually sort, just checking type interference
|
||||||
|
if (false)
|
||||||
|
{
|
||||||
|
int[] arr;
|
||||||
|
|
||||||
|
// Fine because there are no indirections
|
||||||
|
arr.schwartzSort!(get!(const int));
|
||||||
|
|
||||||
|
// Fine because it decays to immutable(int)*
|
||||||
|
arr.schwartzSort!(get!(immutable int*));
|
||||||
|
|
||||||
|
// Disallowed because it would require a non-const reference
|
||||||
|
static assert(!__traits(compiles, arr.schwartzSort!(get!(const Object))));
|
||||||
|
|
||||||
|
static struct Wrapper
|
||||||
|
{
|
||||||
|
int* ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disallowed because Wrapper.ptr would become mutable
|
||||||
|
static assert(!__traits(compiles, arr.schwartzSort!(get!(const Wrapper))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// partialSort
|
// partialSort
|
||||||
/**
|
/**
|
||||||
Reorders the random-access range `r` such that the range `r[0 .. mid]`
|
Reorders the random-access range `r` such that the range `r[0 .. mid]`
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue