Merge remote-tracking branch 'upstream/stable' into merge_stable

This commit is contained in:
Martin Nowak 2019-08-05 08:51:49 +02:00
commit d2e931f149
5 changed files with 66 additions and 7 deletions

View file

@ -1392,7 +1392,7 @@ private T moveImpl(T)(ref T source)
* source = value to be moved into target * source = value to be moved into target
* target = uninitialized value to be filled by source * target = uninitialized value to be filled by source
*/ */
void moveEmplace(T)(ref T source, ref T target) @system void moveEmplace(T)(ref T source, ref T target) pure @system
{ {
import core.stdc.string : memcpy, memset; import core.stdc.string : memcpy, memset;
import std.traits : hasAliasing, hasElaborateAssign, import std.traits : hasAliasing, hasElaborateAssign,

View file

@ -1061,7 +1061,7 @@ if (!(isImplicitlyConvertible!(S, T) &&
private T toImpl(T, S)(ref S value) private T toImpl(T, S)(ref S value)
if (!(isImplicitlyConvertible!(S, T) && if (!(isImplicitlyConvertible!(S, T) &&
!isEnumStrToStr!(S, T) && !isNullToStr!(S, T)) && !isEnumStrToStr!(S, T) && !isNullToStr!(S, T)) &&
!isInfinite!S && isExactSomeString!T && !isCopyable!S) !isInfinite!S && isExactSomeString!T && !isCopyable!S && !isStaticArray!S)
{ {
import std.array : appender; import std.array : appender;
import std.format : FormatSpec, formatValue; import std.format : FormatSpec, formatValue;
@ -1100,6 +1100,18 @@ if (!(isImplicitlyConvertible!(S, T) &&
assert(to!string(b) == "B(0, false)"); assert(to!string(b) == "B(0, false)");
} }
// Bugzilla 20070
@safe unittest
{
void writeThem(T)(ref inout(T) them)
{
assert(them.to!string == "[1, 2, 3, 4]");
}
const(uint)[4] vals = [ 1, 2, 3, 4 ];
writeThem(vals);
}
/* /*
Check whether type `T` can be used in a switch statement. Check whether type `T` can be used in a switch statement.
This is useful for compile-time generation of switch case statements. This is useful for compile-time generation of switch case statements.

View file

@ -1175,7 +1175,7 @@ auto make(T, Allocator, A...)(auto ref Allocator alloc, auto ref A args)
{ {
// Assume cast is safe as allocation succeeded for `stateSize!T` // Assume cast is safe as allocation succeeded for `stateSize!T`
auto p = () @trusted { return cast(T*) m.ptr; }(); auto p = () @trusted { return cast(T*) m.ptr; }();
emplaceRef(*p, args); emplaceRef!T(*p, args);
return p; return p;
} }
} }
@ -1472,6 +1472,14 @@ if (T.sizeof != 1)
assert(a == [ 42, 42, 42, 42, 42]); assert(a == [ 42, 42, 42, 42, 42]);
} }
//Make shared object
@system unittest
{
import core.atomic : atomicLoad;
auto psi = theAllocator.make!(shared(int))(10);
assert(10 == (*psi).atomicLoad());
}
private T[] uninitializedFillDefault(T)(T[] array) nothrow private T[] uninitializedFillDefault(T)(T[] array) nothrow
{ {
static if (__traits(isZeroInit, T)) static if (__traits(isZeroInit, T))

View file

@ -10163,7 +10163,7 @@ do
private: private:
alias ElemType = Tuple!(Enumerator, "index", ElementType!Range, "value"); alias ElemType = Tuple!(Enumerator, "index", ElementType!Range, "value");
Range range; Range range;
Enumerator index; Unqual!Enumerator index;
public: public:
ElemType front() @property ElemType front() @property
@ -10272,6 +10272,14 @@ pure @safe nothrow unittest
assert(aa[1]); assert(aa[1]);
} }
// Make sure passing qualified types works
pure @safe nothrow unittest
{
char[4] v;
immutable start = 2;
v[2 .. $].enumerate(start);
}
pure @safe nothrow unittest pure @safe nothrow unittest
{ {
import std.internal.test.dummyrange : AllDummyRanges; import std.internal.test.dummyrange : AllDummyRanges;

View file

@ -935,7 +935,7 @@ if (distinctFieldNames!(Specs))
* It is an compile-time error to pass more names than * It is an compile-time error to pass more names than
* there are members of the $(LREF Tuple). * there are members of the $(LREF Tuple).
*/ */
ref rename(names...)() return ref rename(names...)() inout return
if (names.length == 0 || allSatisfy!(isSomeString, typeof(names))) if (names.length == 0 || allSatisfy!(isSomeString, typeof(names)))
{ {
import std.algorithm.comparison : equal; import std.algorithm.comparison : equal;
@ -1007,6 +1007,10 @@ if (distinctFieldNames!(Specs))
.map!(t => t.a * t.b) .map!(t => t.a * t.b)
.sum; .sum;
assert(res == 68); assert(res == 68);
const tup = Tuple!(int, "a", int, "b")(2, 3);
const renamed = tup.rename!("c", "d");
assert(renamed.c + renamed.d == 5);
} }
/** /**
@ -1019,7 +1023,7 @@ if (distinctFieldNames!(Specs))
* The same rules for empty strings apply as for the variadic * The same rules for empty strings apply as for the variadic
* template overload of $(LREF _rename). * template overload of $(LREF _rename).
*/ */
ref rename(alias translate)() ref rename(alias translate)() inout
if (is(typeof(translate) : V[K], V, K) && isSomeString!V && if (is(typeof(translate) : V[K], V, K) && isSomeString!V &&
(isSomeString!K || is(K : size_t))) (isSomeString!K || is(K : size_t)))
{ {
@ -1087,6 +1091,11 @@ if (distinctFieldNames!(Specs))
auto t2Named = t2.rename!(["a": "b", "b": "c"]); auto t2Named = t2.rename!(["a": "b", "b": "c"]);
assert(t2Named.b == 3); assert(t2Named.b == 3);
assert(t2Named.c == 4); assert(t2Named.c == 4);
const t3 = Tuple!(int, "a", int, "b")(3, 4);
const t3Named = t3.rename!(["a": "b", "b": "c"]);
assert(t3Named.b == 3);
assert(t3Named.c == 4);
} }
/// ///
@ -8780,7 +8789,7 @@ template ReplaceTypeUnless(alias pred, From, To, T...)
static assert(0, "Function types not supported," ~ static assert(0, "Function types not supported," ~
" use a function pointer type instead of " ~ T[0].stringof); " use a function pointer type instead of " ~ T[0].stringof);
} }
else static if (is(T[0] : U!V, alias U, V...)) else static if (is(T[0] == U!V, alias U, V...))
{ {
template replaceTemplateArgs(T...) template replaceTemplateArgs(T...)
{ {
@ -9007,6 +9016,28 @@ private template replaceTypeInFunctionTypeUnless(alias pred, From, To, fun)
static assert(is(B == A)); static assert(is(B == A));
} }
@safe unittest // Bugzilla 19696
{
static struct T(U) {}
static struct S { T!int t; alias t this; }
static assert(is(ReplaceType!(float, float, S) == S));
}
@safe unittest // Bugzilla 19697
{
class D(T) {}
class C : D!C {}
static assert(is(ReplaceType!(float, float, C)));
}
@safe unittest // Bugzilla 16132
{
interface I(T) {}
class C : I!int {}
static assert(is(ReplaceType!(int, string, C) == C));
}
/** /**
Ternary type with three truth values: Ternary type with three truth values: