I think there is either an error in the manual or a bug in the
implementation regarding the next function.
The manual state for the lua function next:
"The behavior of next is undefined if, during the traversal, you assign any
value to a non-existent field in the table. You may however modify existing
fields. In particular, you may set existing fields to nil."
https://www.lua.org/manual/5.4/manual.html#pdf-next
However, in the following example during the traversal all elements are set
to nil. This is allowed by the manual but it throws an error if the
collectgarbage call isn't commented out.
function LoopAndEmpty(t)
for k, v in pairs(t) do
t[k] = nil
coroutine.yield(k, v)
end
end
local c = coroutine.create(LoopAndEmpty)
local t = {}
t["no" .. "ref1"] = 1
t["no" .. "ref2"] = 2
print(coroutine.resume(c, t))
collectgarbage("collect")
print(coroutine.resume(c))
The problem seems to be that the key "noref1" or "noref2" is white when the
table t is travered and then in traversestrongtable in
https://github.com/lua/lua/blob/master/lgc.c#L526 the key is cleared. This
should not be the case since it could be marked later.