From ec686c3cb75b53c8d6b8685bb59d37b815573f35 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Thu, 4 Jan 2024 16:51:49 +0100 Subject: [PATCH] inference: Guard TypeVar special case against vararg (#52721) Fix #52613 by making the TypeVar special case in inference check for vararg first. There's nothing the special case can really do with vararg anyway, so fall back to the ordinary abstract call handling. --- base/compiler/abstractinterpretation.jl | 4 ++-- test/compiler/inference.jl | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/base/compiler/abstractinterpretation.jl b/base/compiler/abstractinterpretation.jl index 199735b201630..4af80cbd20205 100644 --- a/base/compiler/abstractinterpretation.jl +++ b/base/compiler/abstractinterpretation.jl @@ -2098,10 +2098,10 @@ function abstract_call_known(interp::AbstractInterpreter, @nospecialize(f), elseif isa(f, Core.OpaqueClosure) # calling an OpaqueClosure about which we have no information returns no information return CallMeta(typeof(f).parameters[2], Any, Effects(), NoCallInfo()) - elseif f === TypeVar + elseif f === TypeVar && !isvarargtype(argtypes[end]) # Manually look through the definition of TypeVar to # make sure to be able to get `PartialTypeVar`s out. - (la < 2 || la > 4) && return CallMeta(Bottom, Any, EFFECTS_THROWS, NoCallInfo()) + 2 ≤ la ≤ 4 || return CallMeta(Bottom, Any, EFFECTS_THROWS, NoCallInfo()) n = argtypes[2] ub_var = Const(Any) lb_var = Const(Union{}) diff --git a/test/compiler/inference.jl b/test/compiler/inference.jl index 5e302f1743008..a2900fbda01ba 100644 --- a/test/compiler/inference.jl +++ b/test/compiler/inference.jl @@ -5614,3 +5614,6 @@ end let 𝕃 = Core.Compiler.fallback_lattice @test apply_type_tfunc(𝕃, Const(Tuple{Vararg{Any,N}} where N), Int) == Type{NTuple{_A, Any}} where _A end + +# Issue #52613 +@test (code_typed((Any,)) do x; TypeVar(x...); end)[1][2] === TypeVar