Skip to content

Commit 1c5fb94

Browse files
committed
Fix part of issue 8494 - Tuple.opAssign should return ref Tuple
1 parent f650d62 commit 1c5fb94

File tree

1 file changed

+18
-1
lines changed

1 file changed

+18
-1
lines changed

std/typecons.d

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ template Tuple(Specs...)
847847
* source `Tuple` must be implicitly assignable to each
848848
* respective element of the target `Tuple`.
849849
*/
850-
void opAssign(R)(auto ref R rhs)
850+
ref Tuple opAssign(R)(auto ref R rhs)
851851
if (areCompatibleTuples!(typeof(this), R, "="))
852852
{
853853
import std.algorithm.mutation : swap;
@@ -870,6 +870,7 @@ template Tuple(Specs...)
870870
// Do not swap; opAssign should be called on the fields.
871871
field[] = rhs.field[];
872872
}
873+
return this;
873874
}
874875

875876
/**
@@ -1802,6 +1803,22 @@ private template ReverseTupleSpecs(T...)
18021803
);
18031804
}
18041805

1806+
// Issue 8494, parte uno
1807+
@safe unittest
1808+
{
1809+
auto a = tuple(3, "foo");
1810+
assert(__traits(compiles, { a = (a = a); }));
1811+
}
1812+
// Ditto
1813+
@safe unittest
1814+
{
1815+
Tuple!(int[]) a, b, c;
1816+
a = tuple([0, 1, 2]);
1817+
c = b = a;
1818+
assert(a[0].length == b[0].length && b[0].length == c[0].length);
1819+
assert(a[0].ptr == b[0].ptr && b[0].ptr == c[0].ptr);
1820+
}
1821+
18051822
/**
18061823
Constructs a $(LREF Tuple) object instantiated and initialized according to
18071824
the given arguments.

0 commit comments

Comments
 (0)