mirror of
https://github.com/openRuyi-Project/gcc.git
synced 2026-09-06 14:01:37 +00:00
Synchronizing with the upstream release of v2.109.1. D front-end changes: - Import dmd v2.109.1. - Copying from `const(void)[]' to `void[]' is now disallowed with `-fpreview=fiximmutableconv'. - Import expressions are now treated as hex strings. - Using boolean values other than 0 or 1 in `@safe' code is now deprecated. D runtime changes: - Import dmd v2.109.1. Phobos changes: - Import dmd v2.109.1. gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 66b93fc24a. * dmd/VERSION: Bump version to v2.109.1. * d-builtins.cc (build_frontend_type): Update for new front-end interface. (matches_builtin_type): Likewise. * d-codegen.cc (identity_compare_p): Likewise. (call_side_effect_free_p): Likewise. * d-convert.cc (convert_expr): Likewise. (check_valist_conversion): Likewise. * d-lang.cc (d_types_compatible_p): Likewise. * d-target.cc (Target::isVectorTypeSupported): Likewise. (Target::isReturnOnStack): Likewise. (Target::preferPassByRef): Likewise. * decl.cc (class DeclVisitor): Likewise. * expr.cc (class ExprVisitor): Likewise. * typeinfo.cc (class TypeInfoVisitor): Likewise. * types.cc (class TypeVisitor): Likewise. libphobos/ChangeLog: * libdruntime/MERGE: Merge upstream druntime 66b93fc24a. * src/MERGE: Merge upstream phobos 0c28620c3. * src/Makefile.am (PHOBOS_DSOURCES): Add std/internal/test/sumtype_example_overloads.d. * src/Makefile.in: Regenerate.
164 lines
3.1 KiB
D
164 lines
3.1 KiB
D
/**
|
|
* D binding to C++ <memory>.
|
|
*
|
|
* Copyright: Copyright (c) 2019 D Language Foundation
|
|
* License: Distributed under the
|
|
* $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0).
|
|
* (See accompanying file LICENSE)
|
|
* Authors: Manu Evans
|
|
* Source: $(DRUNTIMESRC core/stdcpp/memory.d)
|
|
*/
|
|
|
|
module core.stdcpp.memory;
|
|
|
|
public import core.stdcpp.allocator;
|
|
|
|
import core.stdcpp.xutility : StdNamespace;
|
|
|
|
extern(C++, (StdNamespace)):
|
|
|
|
///
|
|
unique_ptr!T make_unique(T, Args...)(auto ref Args args)
|
|
{
|
|
import core.lifetime : forward;
|
|
import core.stdcpp.new_ : cpp_new;
|
|
|
|
return unique_ptr!T(cpp_new!T(forward!args));
|
|
}
|
|
|
|
///
|
|
struct default_delete(T)
|
|
{
|
|
///
|
|
alias pointer = ClassOrPtr!T;
|
|
|
|
///
|
|
void opCall()(pointer ptr) const
|
|
{
|
|
import core.stdcpp.new_ : cpp_delete;
|
|
|
|
cpp_delete(ptr);
|
|
}
|
|
}
|
|
|
|
///
|
|
extern(C++, class)
|
|
struct unique_ptr(T, Deleter = default_delete!T)
|
|
{
|
|
extern(D):
|
|
///
|
|
this(this) @disable;
|
|
|
|
///
|
|
~this()
|
|
{
|
|
reset();
|
|
}
|
|
|
|
///
|
|
ref unique_ptr opAssign(typeof(null))
|
|
{
|
|
reset();
|
|
return this;
|
|
}
|
|
|
|
///
|
|
void reset(pointer p = null)
|
|
{
|
|
pointer t = __ptr();
|
|
__ptr() = p;
|
|
if (t)
|
|
get_deleter()(t);
|
|
}
|
|
|
|
nothrow pure @safe @nogc:
|
|
///
|
|
alias pointer = ClassOrPtr!T;
|
|
///
|
|
alias element_type = T;
|
|
///
|
|
alias deleter_type = Deleter;
|
|
|
|
///
|
|
this(pointer ptr)
|
|
{
|
|
__ptr() = ptr;
|
|
}
|
|
|
|
///
|
|
inout(pointer) get() inout nothrow
|
|
{
|
|
return __ptr();
|
|
}
|
|
|
|
///
|
|
bool opCast(T : bool)() const nothrow
|
|
{
|
|
return __ptr() != null;
|
|
}
|
|
|
|
///
|
|
pointer release() nothrow
|
|
{
|
|
pointer t = __ptr();
|
|
__ptr() = null;
|
|
return t;
|
|
}
|
|
|
|
// void swap(ref unique_ptr u) nothrow
|
|
// {
|
|
// __ptr_.swap(__u.__ptr_);
|
|
// }
|
|
|
|
version (CppRuntime_Microsoft)
|
|
{
|
|
///
|
|
ref inout(deleter_type) get_deleter() inout nothrow { return _Mypair._Myval1; }
|
|
|
|
private:
|
|
import core.stdcpp.xutility : _Compressed_pair;
|
|
|
|
ref pointer __ptr() nothrow { return _Mypair._Myval2; }
|
|
inout(pointer) __ptr() inout nothrow { return _Mypair._Myval2; }
|
|
|
|
_Compressed_pair!(Deleter, pointer) _Mypair;
|
|
}
|
|
else version (CppRuntime_GNU)
|
|
{
|
|
///
|
|
ref inout(deleter_type) get_deleter() inout nothrow { return _M_t.get!1; }
|
|
|
|
private:
|
|
import core.stdcpp.tuple : tuple, get;
|
|
|
|
ref pointer __ptr() nothrow { return _M_t.get!0; }
|
|
inout(pointer) __ptr() inout nothrow { return _M_t.get!0; }
|
|
|
|
tuple!(pointer, Deleter) _M_t;
|
|
}
|
|
else version (CppRuntime_LLVM)
|
|
{
|
|
///
|
|
ref inout(deleter_type) get_deleter() inout nothrow { return __ptr_.second; }
|
|
|
|
private:
|
|
import core.stdcpp.xutility : __compressed_pair;
|
|
|
|
ref pointer __ptr() nothrow { return __ptr_.first; }
|
|
inout(pointer) __ptr() inout nothrow { return __ptr_.first; }
|
|
|
|
__compressed_pair!(pointer, deleter_type) __ptr_;
|
|
}
|
|
}
|
|
|
|
|
|
private:
|
|
|
|
template ClassOrPtr(T)
|
|
{
|
|
static if (is(T == class))
|
|
alias ClassOrPtr = T;
|
|
else
|
|
alias ClassOrPtr = T*;
|
|
}
|