From 1f2ce329848d59c31913b18c869d0ecc66c8ced2 Mon Sep 17 00:00:00 2001 From: Tom Lau Date: Sun, 13 Oct 2024 15:13:39 +0800 Subject: [PATCH] fix: regression related to type narrow and generic since v3.10.1 --- changelog.md | 1 + script/vm/compiler.lua | 8 +++++--- test/type_inference/common.lua | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) 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('') +]]