From c08f9311bf52bab5f94539663a05e091e55e3e24 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Tue, 25 Feb 2025 20:14:13 +0800 Subject: [PATCH] fixes #24720; std lib iterators unnecessarily require value copies --- lib/pure/collections/tables.nim | 12 ++++++------ tests/arc/t24720.nim | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 tests/arc/t24720.nim diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 082e1e96f5591..dc123d25d5873 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -677,7 +677,7 @@ template withValue*[A, B](t: var Table[A, B], key: A, body2 -iterator pairs*[A, B](t: Table[A, B]): (A, B) = +iterator pairs*[A, B](t: Table[A, B]): (lent A, lent B) = ## Iterates over any `(key, value)` pair in the table `t`. ## ## See also: @@ -1139,7 +1139,7 @@ proc `==`*[A, B](s, t: TableRef[A, B]): bool = -iterator pairs*[A, B](t: TableRef[A, B]): (A, B) = +iterator pairs*[A, B](t: TableRef[A, B]): (lent A, lent B) = ## Iterates over any `(key, value)` pair in the table `t`. ## ## See also: @@ -1727,7 +1727,7 @@ proc `==`*[A, B](s, t: OrderedTable[A, B]): bool = -iterator pairs*[A, B](t: OrderedTable[A, B]): (A, B) = +iterator pairs*[A, B](t: OrderedTable[A, B]): (lent A, lent B) = ## Iterates over any `(key, value)` pair in the table `t` in insertion ## order. ## @@ -2150,7 +2150,7 @@ proc `==`*[A, B](s, t: OrderedTableRef[A, B]): bool = -iterator pairs*[A, B](t: OrderedTableRef[A, B]): (A, B) = +iterator pairs*[A, B](t: OrderedTableRef[A, B]): (lent A, lent B) = ## Iterates over any `(key, value)` pair in the table `t` in insertion ## order. ## @@ -2564,7 +2564,7 @@ proc `==`*[A](s, t: CountTable[A]): bool = equalsImpl(s, t) -iterator pairs*[A](t: CountTable[A]): (A, int) = +iterator pairs*[A](t: CountTable[A]): (lent A, int) = ## Iterates over any `(key, value)` pair in the table `t`. ## ## See also: @@ -2845,7 +2845,7 @@ proc `==`*[A](s, t: CountTableRef[A]): bool = else: result = s[] == t[] -iterator pairs*[A](t: CountTableRef[A]): (A, int) = +iterator pairs*[A](t: CountTableRef[A]): (lent A, int) = ## Iterates over any `(key, value)` pair in the table `t`. ## ## See also: diff --git a/tests/arc/t24720.nim b/tests/arc/t24720.nim new file mode 100644 index 0000000000000..9f4eb2f698e61 --- /dev/null +++ b/tests/arc/t24720.nim @@ -0,0 +1,20 @@ +discard """ + matrix: "--mm:orc" + output: ''' +found entry +''' +""" + +import std/tables +type NoCopies = object + +proc `=copy`(a: var NoCopies, b: NoCopies) {.error.} + +# bug #24720 +proc foo() = + var t: Table[int, NoCopies] + t[3] = NoCopies() # only moves + for k, v in t.pairs(): # lent values, no need to copy! + echo "found entry" + +foo()