summaryrefslogtreecommitdiff
path: root/libphobos/libdruntime/core/internal/lifetime.d
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/libdruntime/core/internal/lifetime.d
parent38c60e5075f89265a560eab166d43247624a7535 (diff)
downloadgcc-9c7d5e8846edb28e5421211ee8eaad93e234de2c.tar.gz
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/libdruntime/core/internal/lifetime.d')
-rw-r--r--libphobos/libdruntime/core/internal/lifetime.d49
1 files changed, 20 insertions, 29 deletions
diff --git a/libphobos/libdruntime/core/internal/lifetime.d b/libphobos/libdruntime/core/internal/lifetime.d
index 7e9b5f2ad48..a7446debae6 100644
--- a/libphobos/libdruntime/core/internal/lifetime.d
+++ b/libphobos/libdruntime/core/internal/lifetime.d
@@ -89,44 +89,35 @@ Emplaces T.init.
In contrast to `emplaceRef(chunk)`, there are no checks for disabled default
constructors etc.
+/
-template emplaceInitializer(T)
+void emplaceInitializer(T)(scope ref T chunk) nothrow pure @trusted
if (!is(T == const) && !is(T == immutable) && !is(T == inout))
{
- import core.internal.traits : hasElaborateAssign, Unqual;
+ import core.internal.traits : hasElaborateAssign;
- // Avoid stack allocation by hacking to get to the struct/union init symbol.
- static if (is(T == struct) || is(T == union))
+ static if (__traits(isZeroInit, T))
{
- pragma(mangle, "_D" ~ Unqual!T.mangleof[1..$] ~ "6__initZ")
- __gshared extern immutable T initializer;
+ import core.stdc.string : memset;
+ memset(cast(void*) &chunk, 0, T.sizeof);
}
-
- void emplaceInitializer(scope ref T chunk) nothrow pure @trusted
+ else static if (__traits(isScalar, T) ||
+ T.sizeof <= 16 && !hasElaborateAssign!T && __traits(compiles, (){ T chunk; chunk = T.init; }))
{
- static if (__traits(isZeroInit, T))
- {
- import core.stdc.string : memset;
- memset(cast(void*) &chunk, 0, T.sizeof);
- }
- else static if (__traits(isScalar, T) ||
- T.sizeof <= 16 && !hasElaborateAssign!T && __traits(compiles, (){ T chunk; chunk = T.init; }))
- {
- chunk = T.init;
- }
- else static if (__traits(isStaticArray, T))
- {
- // For static arrays there is no initializer symbol created. Instead, we emplace elements one-by-one.
- foreach (i; 0 .. T.length)
- {
- emplaceInitializer(chunk[i]);
- }
- }
- else
+ chunk = T.init;
+ }
+ else static if (__traits(isStaticArray, T))
+ {
+ // For static arrays there is no initializer symbol created. Instead, we emplace elements one-by-one.
+ foreach (i; 0 .. T.length)
{
- import core.stdc.string : memcpy;
- memcpy(cast(void*)&chunk, &initializer, T.sizeof);
+ emplaceInitializer(chunk[i]);
}
}
+ else
+ {
+ import core.stdc.string : memcpy;
+ const initializer = __traits(initSymbol, T);
+ memcpy(cast(void*)&chunk, initializer.ptr, initializer.length);
+ }
}
@safe unittest