aboutsummaryrefslogtreecommitdiff
path: root/libphobos/src/std/algorithm
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-12-10 03:14:20 +0100
committerIain Buclaw <ibuclaw@gdcproject.org>2021-12-10 05:25:41 +0100
commit9c7d5e8846edb28e5421211ee8eaad93e234de2c (patch)
tree36b78f03305b82ef82ec5ecfaf29844fadd86ddc /libphobos/src/std/algorithm
parent38c60e5075f89265a560eab166d43247624a7535 (diff)
downloadgcc-9c7d5e8846edb28e5421211ee8eaad93e234de2c.zip
gcc-9c7d5e8846edb28e5421211ee8eaad93e234de2c.tar.gz
gcc-9c7d5e8846edb28e5421211ee8eaad93e234de2c.tar.bz2
d: Merge upstream dmd 3982604c5, druntime bc58b1e9, phobos 12329adb6.
D front-end changes: - Import dmd mainline development. - Split off enum EXP from enum TOK. - Integer promotions now follow C integral promotions by default. - Implements __traits(initSymbol). - Lowering of array construction has been moved to the dmd front-end. - Fix segfault in dmd.lexer from unaligned read (PR103529). Druntime changes: - Import druntime mainline development. - Define SIG_BLOCK for Solaris (PR103528). Phobos changes: - Import phobos mainline development. gcc/d/ChangeLog: PR d/103529 * dmd/MERGE: Merge upstream dmd 3982604c5. * Make-lang.in (D_FRONTEND_OBJS): Add d/root-optional.o. * d-attribs.cc (build_attributes): Update for new front-end interface. * d-codegen.cc (d_build_call): Likewise. * d-compiler.cc (Compiler::paintAsType): Likewise. * d-lang.cc (d_handle_option): Remove OPT_fpreview_intpromote, add handling of OPT_frevert_intpromote. * d-port.cc (Port::valcpy): Assert buffer is aligned. * d-target.cc (Target::isVectorOpSupported): Update for new front-end interface. * decl.cc (layout_class_initializer): Likewise. * expr.cc (lvalue_p): Likewise. (binop_assignment): Likewise. (ExprVisitor::visit): Likewise. (ExprVisitor::visit (AssignExp *)): Remove generation of _d_arrayctor and _d_arraysetctor library helpers. (ExprVisitor::visit (VarExp *)): Support __traits(initSymbol). * intrinsics.cc (expand_intrinsic_rotate): Update for new front-end interface. * lang.opt (fpreview=intpromote): Remove. (frevert=intpromote): New. * runtime.def (ARRAYCTOR): Remove. (ARRAYSETCTOR): Remove. * toir.cc (IRVisitor::visit): Update for new front-end interface. * types.cc (layout_aggregate_members): Likewise. * dmd/root/optional.d: New file. * dmd/root/optional.h: New file. libphobos/ChangeLog: PR d/103528 * libdruntime/MERGE: Merge upstream druntime bc58b1e9. * libdruntime/Makefile.am (DRUNTIME_DSOURCES_LINUX): Remove core/sys/linux/syscalls.d. * libdruntime/Makefile.in: Regenerate. * src/MERGE: Merge upstream phobos 12329adb6. * testsuite/libphobos.config/config.exp: Add test22523. * libdruntime/core/sys/linux/syscalls.d: Removed. * testsuite/libphobos.config/test22523.d: New test.
Diffstat (limited to 'libphobos/src/std/algorithm')
-rw-r--r--libphobos/src/std/algorithm/iteration.d52
-rw-r--r--libphobos/src/std/algorithm/mutation.d29
-rw-r--r--libphobos/src/std/algorithm/sorting.d26
3 files changed, 56 insertions, 51 deletions
diff --git a/libphobos/src/std/algorithm/iteration.d b/libphobos/src/std/algorithm/iteration.d
index 9e728e4..af665c4 100644
--- a/libphobos/src/std/algorithm/iteration.d
+++ b/libphobos/src/std/algorithm/iteration.d
@@ -3595,7 +3595,6 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR)
assert(res.equal("cba"));
}
-
/// Ditto
auto joiner(RoR)(RoR r)
if (isInputRange!RoR && isInputRange!(ElementType!RoR))
@@ -3621,14 +3620,32 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
_currentBack = typeof(_currentBack).init;
}
+ void replaceCurrent(typeof(_current) current) @trusted
+ {
+ import core.lifetime : move;
+
+ current.move(_current);
+ }
+
+ static if (isBidirectional)
+ {
+ void replaceCurrentBack(typeof(_currentBack) currentBack) @trusted
+ {
+ import core.lifetime : move;
+
+ currentBack.move(_currentBack);
+ }
+ }
+
public:
this(RoR r)
{
_items = r;
+ // field _current must be initialized in constructor, because it is nested struct
+ _current = typeof(_current).init;
static if (isBidirectional && hasNested!Result)
_currentBack = typeof(_currentBack).init;
- // field _current must be initialized in constructor, because it is nested struct
mixin(popFrontEmptyElements);
static if (isBidirectional)
mixin(popBackEmptyElements);
@@ -3673,13 +3690,13 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
// consumed when a .save'd copy of ourselves is iterated over. So
// we need to .save each subrange we traverse.
static if (isForwardRange!RoR && isForwardRange!(ElementType!RoR))
- _current = _items.front.save;
+ replaceCurrent(_items.front.save);
else
- _current = _items.front;
+ replaceCurrent(_items.front);
}
else
{
- _current = typeof(_current).init;
+ replaceCurrent(typeof(_current).init);
}
};
@@ -3696,9 +3713,9 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
static if (isBidirectional)
{
static if (is(typeof(null) : typeof(_currentBack)))
- r._currentBack = _currentBack is null ? null : _currentBack.save;
+ r.replaceCurrentBack(_currentBack is null ? null : _currentBack.save);
else
- r._currentBack = _currentBack.save;
+ r.replaceCurrentBack(_currentBack.save);
r.reachedFinalElement = reachedFinalElement;
}
return r;
@@ -3784,22 +3801,22 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
static if (isForwardRange!RoR && isForwardRange!(ElementType!RoR))
{
if (reachedFinalElement)
- _current = _items.back.save;
+ replaceCurrent(_items.back.save);
else
- _currentBack = _items.back.save;
+ replaceCurrentBack(_items.back.save);
}
else
{
if (reachedFinalElement)
- _current = _items.back;
+ replaceCurrent(_items.back);
else
- _currentBack = _items.back;
+ replaceCurrentBack(_items.back);
}
}
else
{
- _current = typeof(_current).init;
- _currentBack = typeof(_currentBack).init;
+ replaceCurrent(typeof(_current).init);
+ replaceCurrentBack(typeof(_currentBack).init);
}
};
@@ -4232,6 +4249,15 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
assert([[0]].joiner.save.back == 0);
}
+// https://issues.dlang.org/show_bug.cgi?id=22561
+@safe pure unittest
+{
+ import std.range : only;
+
+ static immutable struct S { int[] array; }
+ assert([only(S(null))].joiner.front == S(null));
+}
+
/++
Implements the homonym function (also known as `accumulate`, $(D
compress), `inject`, or `foldl`) present in various programming
diff --git a/libphobos/src/std/algorithm/mutation.d b/libphobos/src/std/algorithm/mutation.d
index 07cbb9b..22b7b98 100644
--- a/libphobos/src/std/algorithm/mutation.d
+++ b/libphobos/src/std/algorithm/mutation.d
@@ -886,31 +886,13 @@ if (isInputRange!Range && hasLvalueElements!Range && hasAssignableElements!Range
static if (hasElaborateAssign!T)
{
import std.algorithm.internal : addressOf;
- //Elaborate opAssign. Must go the memcpy road.
- //We avoid calling emplace here, because our goal is to initialize to
- //the static state of T.init,
- //So we want to avoid any un-necassarilly CC'ing of T.init
+ //Elaborate opAssign. Must go the memcpy/memset road.
static if (!__traits(isZeroInit, T))
{
- auto p = typeid(T).initializer();
for ( ; !range.empty ; range.popFront() )
{
- static if (__traits(isStaticArray, T))
- {
- // static array initializer only contains initialization
- // for one element of the static array.
- auto elemp = cast(void *) addressOf(range.front);
- auto endp = elemp + T.sizeof;
- while (elemp < endp)
- {
- memcpy(elemp, p.ptr, p.length);
- elemp += p.length;
- }
- }
- else
- {
- memcpy(addressOf(range.front), p.ptr, T.sizeof);
- }
+ import core.internal.lifetime : emplaceInitializer;
+ emplaceInitializer(range.front);
}
}
else
@@ -1456,10 +1438,7 @@ private void moveEmplaceImpl(T)(ref scope T target, ref return scope T source)
static if (__traits(isZeroInit, T))
() @trusted { memset(&source, 0, sz); }();
else
- {
- auto init = typeid(T).initializer();
- () @trusted { memcpy(&source, init.ptr, sz); }();
- }
+ () @trusted { memcpy(&source, __traits(initSymbol, T).ptr, sz); }();
}
}
else static if (isStaticArray!T)
diff --git a/libphobos/src/std/algorithm/sorting.d b/libphobos/src/std/algorithm/sorting.d
index f2877cc..ee68b23 100644
--- a/libphobos/src/std/algorithm/sorting.d
+++ b/libphobos/src/std/algorithm/sorting.d
@@ -3121,14 +3121,14 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R &&
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.stdc.stdlib : malloc;
+ import core.memory : pureMalloc;
bool overflow;
const nbytes = mulu(len, T.sizeof, overflow);
if (overflow) assert(false, "multiplication overflowed");
- T[] result = (cast(T*) malloc(nbytes))[0 .. len];
+ T[] result = (cast(T*) pureMalloc(nbytes))[0 .. len];
static if (hasIndirections!T)
{
import core.memory : GC;
@@ -3145,15 +3145,15 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R &&
{
foreach (i; 0 .. length) collectException(destroy(xform1[i]));
}
- static void trustedFree(T[] p) @trusted
+ static void trustedFree()(T[] p) @trusted
{
- import core.stdc.stdlib : free;
+ import core.memory : pureFree;
static if (hasIndirections!T)
{
import core.memory : GC;
GC.removeRange(p.ptr);
}
- free(p.ptr);
+ pureFree(p.ptr);
}
trustedFree(xform1);
}
@@ -3186,7 +3186,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
}
///
-@safe unittest
+@safe pure unittest
{
import std.algorithm.iteration : map;
import std.numeric : entropy;
@@ -3207,7 +3207,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
assert(isSorted!("a > b")(map!(entropy)(arr)));
}
-@safe unittest
+@safe pure unittest
{
import std.algorithm.iteration : map;
import std.numeric : entropy;
@@ -3228,7 +3228,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
assert(isSorted!("a < b")(map!(entropy)(arr)));
}
-@safe unittest
+@safe pure unittest
{
// binary transform function
string[] strings = [ "one", "two", "three" ];
@@ -3237,7 +3237,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
}
// https://issues.dlang.org/show_bug.cgi?id=4909
-@safe unittest
+@safe pure unittest
{
import std.typecons : Tuple;
Tuple!(char)[] chars;
@@ -3245,7 +3245,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
}
// https://issues.dlang.org/show_bug.cgi?id=5924
-@safe unittest
+@safe pure unittest
{
import std.typecons : Tuple;
Tuple!(char)[] chars;
@@ -3253,7 +3253,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
}
// https://issues.dlang.org/show_bug.cgi?id=13965
-@safe unittest
+@safe pure unittest
{
import std.typecons : Tuple;
Tuple!(char)[] chars;
@@ -3261,7 +3261,7 @@ if (isRandomAccessRange!R && hasLength!R && hasSwappableElements!R)
}
// https://issues.dlang.org/show_bug.cgi?id=13965
-@safe unittest
+@safe pure unittest
{
import std.algorithm.iteration : map;
import std.numeric : entropy;