diff --git a/lib/system.nim b/lib/system.nim index ef241136b4..e053b2d67e 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1257,7 +1257,9 @@ proc del*[T](x: var seq[T], i: Natural) {.noSideEffect.} = a.del(2) assert a == @[10, 11, 14, 13] let xl = x.len - 1 - movingCopy(x[i], x[xl]) + # Avoid moving the element onto itself when deleting the last item. + if i != xl: + movingCopy(x[i], x[xl]) setLen(x, xl) proc insert*[T](x: var seq[T], item: sink T, i = 0.Natural) {.noSideEffect.} = diff --git a/tests/stdlib/t26134.nim b/tests/stdlib/t26134.nim new file mode 100644 index 0000000000..2d2d916665 --- /dev/null +++ b/tests/stdlib/t26134.nim @@ -0,0 +1,24 @@ +discard """ + matrix: "--mm:orc --undef:nimPreviewNonVarDestructor" + output: "hello" +""" + +# bug #26134 + +type MyObject = object + +proc `=destroy`(v: var MyObject) = + echo "hello" + +proc remove(v: var seq[MyObject]) = + v.del(0) + +proc aaa(v: var seq[MyObject], i: sink MyObject) = + v.add(i) + +proc main = + var v: seq[MyObject] + v.aaa(MyObject()) + v.remove() + +main()