diff --git a/changelog.md b/changelog.md index 2acd8ab7e..aadfbade9 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## Unreleased +* `FIX` A regression related to type narrow and generic param introduced since `v3.10.1` ## 3.11.1 `2024-10-9` diff --git a/script/vm/compiler.lua b/script/vm/compiler.lua index aa51bcddf..8701e8d7b 100644 --- a/script/vm/compiler.lua +++ b/script/vm/compiler.lua @@ -630,15 +630,17 @@ local function matchCall(source) newNode.originNode = myNode vm.setNode(source, newNode, true) if call.args then - -- clear node caches of args to allow recomputation with the type narrowed call + -- clear existing node caches of args to allow recomputation with the type narrowed call for _, arg in ipairs(call.args) do - vm.setNode(arg, vm.createNode(), true) + if vm.getNode(arg) then + vm.setNode(arg, vm.createNode(), true) + end end for n in newNode:eachObject() do if n.type == 'function' or n.type == 'doc.type.function' then for i, arg in ipairs(call.args) do - if n.args[i] then + if vm.getNode(arg) and n.args[i] then vm.setNode(arg, vm.compileNode(n.args[i])) end end diff --git a/test/type_inference/common.lua b/test/type_inference/common.lua index 792967722..89ba92f6f 100644 --- a/test/type_inference/common.lua +++ b/test/type_inference/common.lua @@ -4571,3 +4571,23 @@ else local = a end ]] + +TEST 'nil' [[ +---@generic T +---@param v T +---@return T +---@overload fun(): nil +local function f(v) end + +local = f() +]] + +TEST 'string' [[ +---@generic T +---@param v T +---@return T +---@overload fun(): nil +local function f(v) end + +local = f('') +]]