From 7c217521979df28deb23517a90c7a3c9aba970b6 Mon Sep 17 00:00:00 2001 From: David Marquant Date: Sun, 11 Jun 2017 22:24:20 +0200 Subject: [PATCH 1/3] Fix Issue 12866 - concatenating to std.container.array of static arrays --- std/container/array.d | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/std/container/array.d b/std/container/array.d index b92a9c3e36b..dec1b9ecebb 100644 --- a/std/container/array.d +++ b/std/container/array.d @@ -730,7 +730,7 @@ if (!is(Unqual!T == bool)) void opOpAssign(string op, Stuff)(Stuff stuff) if (op == "~") { - static if (is(typeof(stuff[]))) + static if (is(typeof(stuff[])) && isImplicitlyConvertible!(typeof(stuff[0]), T)) { insertBack(stuff[]); } @@ -2400,3 +2400,23 @@ if (is(Unqual!T == bool)) assert(a.length == 11, to!string(a.length)); assert(a[5]); } +@system unittest +{ + alias V3 = int[3]; + V3 v = [1, 2, 3]; + Array!V3 arr; + arr ~= v; + assert(arr[0] == [1, 2, 3]); + + arr = arr ~ v; + assert(arr[1] == [1, 2, 3]); +} +@system unittest +{ + alias V3 = int[3]; + V3[2] v = [[1, 2, 3], [4, 5, 6]]; + Array!V3 arr; + arr ~= v; + assert(arr[0] == [1, 2, 3]); + assert(arr[1] == [4, 5, 6]); +} From 879f0b9d0a223525edabb2465c1ffc2cf18c7208 Mon Sep 17 00:00:00 2001 From: David Marquant Date: Sun, 11 Jun 2017 22:27:03 +0200 Subject: [PATCH 2/3] Remove redundant check using binop --- std/container/array.d | 3 --- 1 file changed, 3 deletions(-) diff --git a/std/container/array.d b/std/container/array.d index dec1b9ecebb..654c457090b 100644 --- a/std/container/array.d +++ b/std/container/array.d @@ -2407,9 +2407,6 @@ if (is(Unqual!T == bool)) Array!V3 arr; arr ~= v; assert(arr[0] == [1, 2, 3]); - - arr = arr ~ v; - assert(arr[1] == [1, 2, 3]); } @system unittest { From 4de14ab4c993072ab8d2156f3455f60f4adea448 Mon Sep 17 00:00:00 2001 From: Steven Schveighoffer Date: Mon, 26 Jun 2017 10:54:39 -0400 Subject: [PATCH 3/3] Change opOpAssign to use auto ref to prevent copying static arrays --- std/container/array.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/container/array.d b/std/container/array.d index 654c457090b..aaa0111908e 100644 --- a/std/container/array.d +++ b/std/container/array.d @@ -727,7 +727,7 @@ if (!is(Unqual!T == bool)) /** * Forwards to `insertBack`. */ - void opOpAssign(string op, Stuff)(Stuff stuff) + void opOpAssign(string op, Stuff)(auto ref Stuff stuff) if (op == "~") { static if (is(typeof(stuff[])) && isImplicitlyConvertible!(typeof(stuff[0]), T))