diff options
| author | Iain Buclaw <ibuclaw@gdcproject.org> | 2023-10-29 16:39:05 +0100 |
|---|---|---|
| committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2023-10-29 16:41:29 +0100 |
| commit | e773c6c7009bb35fa50da034f3537448fd36c7f0 (patch) | |
| tree | 24b60531e9364c16eb2bfd6c2bfea5f287e6afab /libphobos/src | |
| parent | c6929b085580cf00cbc52b0f5b0afe2b9caa2a22 (diff) | |
d: Merge upstream dmd, druntime e48bc0987d, phobos 2458e8f82.
D front-end changes:
- Import dmd v2.106.0-beta.1.
D runtime changes:
- Import druntime v2.106.0-beta.1.
Phobos changes:
- Import phobos v2.106.0-beta.1.
gcc/d/ChangeLog:
* dmd/MERGE: Merge upstream dmd e48bc0987d.
* expr.cc (ExprVisitor::visit (NewExp *)): Update for new front-end
interface.
* runtime.def (NEWARRAYT): Remove.
(NEWARRAYIT): Remove.
libphobos/ChangeLog:
* libdruntime/MERGE: Merge upstream druntime e48bc0987d.
* src/MERGE: Merge upstream phobos 2458e8f82.
Diffstat (limited to 'libphobos/src')
| -rw-r--r-- | libphobos/src/MERGE | 2 | ||||
| -rw-r--r-- | libphobos/src/std/parallelism.d | 2 | ||||
| -rw-r--r-- | libphobos/src/std/range/primitives.d | 10 | ||||
| -rw-r--r-- | libphobos/src/std/traits.d | 57 |
4 files changed, 62 insertions, 9 deletions
diff --git a/libphobos/src/MERGE b/libphobos/src/MERGE index 9a979272d6e..a7bf856d747 100644 --- a/libphobos/src/MERGE +++ b/libphobos/src/MERGE @@ -1,4 +1,4 @@ -d945686a4ff7d9fda0e2ee8d2ee201b66be2a287 +2458e8f82e3004197d8a66239a6b72e17264bb26 The first line of this file holds the git revision number of the last merge done from the dlang/phobos repository. diff --git a/libphobos/src/std/parallelism.d b/libphobos/src/std/parallelism.d index 9b231f3ac8a..3fe8cd61fe0 100644 --- a/libphobos/src/std/parallelism.d +++ b/libphobos/src/std/parallelism.d @@ -1581,7 +1581,7 @@ public: auto logs = new double[10_000_000]; // Parallel foreach works with or without an index - // variable. It can be iterate by ref if range.front + // variable. It can iterate by ref if range.front // returns by ref. // Iterate over logs using work units of size 100. diff --git a/libphobos/src/std/range/primitives.d b/libphobos/src/std/range/primitives.d index ef34a85e5ec..1a3fb06cf99 100644 --- a/libphobos/src/std/range/primitives.d +++ b/libphobos/src/std/range/primitives.d @@ -540,13 +540,9 @@ private void putChar(R, E)(ref R r, E e) if (isSomeChar!E) { // https://issues.dlang.org/show_bug.cgi?id=9186: Can't use (E[]).init - ref const( char)[] cstringInit(); - ref const(wchar)[] wstringInit(); - ref const(dchar)[] dstringInit(); - - enum csCond = is(typeof(doPut(r, cstringInit()))); - enum wsCond = is(typeof(doPut(r, wstringInit()))); - enum dsCond = is(typeof(doPut(r, dstringInit()))); + enum csCond = is(typeof(doPut(r, (){ ref const( char)[] cstringInit(); return cstringInit(); }()))); + enum wsCond = is(typeof(doPut(r, (){ ref const(wchar)[] wstringInit(); return wstringInit(); }()))); + enum dsCond = is(typeof(doPut(r, (){ ref const(dchar)[] dstringInit(); return dstringInit(); }()))); //Use "max" to avoid static type demotion enum ccCond = is(typeof(doPut(r, char.max))); diff --git a/libphobos/src/std/traits.d b/libphobos/src/std/traits.d index 2ed7ee527b0..aa69aacfd10 100644 --- a/libphobos/src/std/traits.d +++ b/libphobos/src/std/traits.d @@ -67,6 +67,7 @@ * $(LREF isAssignable) * $(LREF isCovariantWith) * $(LREF isImplicitlyConvertible) + * $(LREF isQualifierConvertible) * )) * $(TR $(TD Type Constructors) $(TD * $(LREF InoutOf) @@ -5167,6 +5168,62 @@ enum bool isImplicitlyConvertible(From, To) = is(From : To); } /** +Is `From` $(DDSUBLINK spec/const3, implicit_qualifier_conversions, qualifier-convertible) to `To`? +*/ +enum bool isQualifierConvertible(From, To) = + is(immutable From == immutable To) && is(From* : To*); + +/// +@safe unittest +{ + // Mutable and immmutable both convert to const... + static assert( isQualifierConvertible!(char, const(char))); + static assert( isQualifierConvertible!(immutable(char), const(char))); + // ...but const does not convert back to mutable or immutable + static assert(!isQualifierConvertible!(const(char), char)); + static assert(!isQualifierConvertible!(const(char), immutable(char))); +} + +@safe unittest +{ + import std.meta : AliasSeq; + + alias Ts = AliasSeq!(int, const int, shared int, inout int, const shared int, + const inout int, inout shared int, const inout shared int, immutable int); + + // https://dlang.org/spec/const3.html#implicit_qualifier_conversions + enum _ = 0; + static immutable bool[Ts.length][Ts.length] conversions = [ + // m c s i cs ci is cis im + [1, 1, _, _, _, _, _, _, _], // mutable + [_, 1, _, _, _, _, _, _, _], // const + [_, _, 1, _, 1, _, _, _, _], // shared + [_, 1, _, 1, _, 1, _, _, _], // inout + [_, _, _, _, 1, _, _, _, _], // const shared + [_, 1, _, _, _, 1, _, _, _], // const inout + [_, _, _, _, 1, _, 1, 1, _], // inout shared + [_, _, _, _, 1, _, _, 1, _], // const inout shared + [_, 1, _, _, 1, 1, _, 1, 1], // immutable + ]; + + static foreach (i, From; Ts) + { + static foreach (j, To; Ts) + { + static assert(isQualifierConvertible!(From, To) == conversions[i][j], + "`isQualifierConvertible!(" ~ From.stringof ~ ", " ~ To.stringof ~ ")`" + ~ " should be `" ~ (conversions[i][j] ? "true" : "false") ~ "`"); + } + } +} + +@safe unittest +{ + // int* -> void* is not a qualifier conversion + static assert(!isQualifierConvertible!(int, void)); +} + +/** Returns `true` iff a value of type `Rhs` can be assigned to a variable of type `Lhs`. |
