summaryrefslogtreecommitdiff
path: root/libphobos/src
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2023-10-29 16:39:05 +0100
committerIain Buclaw <ibuclaw@gdcproject.org>2023-10-29 16:41:29 +0100
commite773c6c7009bb35fa50da034f3537448fd36c7f0 (patch)
tree24b60531e9364c16eb2bfd6c2bfea5f287e6afab /libphobos/src
parentc6929b085580cf00cbc52b0f5b0afe2b9caa2a22 (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/MERGE2
-rw-r--r--libphobos/src/std/parallelism.d2
-rw-r--r--libphobos/src/std/range/primitives.d10
-rw-r--r--libphobos/src/std/traits.d57
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`.