diff --git a/base/inference.jl b/base/inference.jl index ecb08f74ab081..549e7b6b4b895 100644 --- a/base/inference.jl +++ b/base/inference.jl @@ -4857,7 +4857,8 @@ function inlining_pass(e::Expr, sv::InferenceState, stmts, ins) if isa(aarg,Expr) && (is_known_call(aarg, tuple, sv.src, sv.mod) || is_known_call(aarg, svec, sv.src, sv.mod)) # apply(f,tuple(x,y,...)) => f(x,y,...) newargs[i-2] = aarg.args[2:end] - elseif isa(argt,Const) && (isa(argt.val, Tuple) || isa(argt.val, SimpleVector)) + elseif isa(argt,Const) && (isa(argt.val, Tuple) || isa(argt.val, SimpleVector)) && + effect_free(aarg, sv.src, sv.mod, true) newargs[i-2] = Any[ QuoteNode(x) for x in argt.val ] elseif isa(aarg, Tuple) || (isa(aarg, QuoteNode) && (isa(aarg.value, Tuple) || isa(aarg.value, SimpleVector))) if isa(aarg, QuoteNode) diff --git a/test/inference.jl b/test/inference.jl index e4b8d33cd8b3f..360b262ee5c5e 100644 --- a/test/inference.jl +++ b/test/inference.jl @@ -911,6 +911,17 @@ end @test isdefined_tfunc(Tuple{Any,Vararg{Any}}, Const(2)) === Bool @test isdefined_tfunc(Tuple{Any,Vararg{Any}}, Const(3)) === Bool +@noinline map3_22347(f, t::Tuple{}) = () +@noinline map3_22347(f, t::Tuple) = (f(t[1]), map3_22347(f, Base.tail(t))...) +# issue #22347 +let niter = 0 + map3_22347((1, 2, 3, 4)) do y + niter += 1 + nothing + end + @test niter == 4 +end + # demonstrate that inference must converge # while doing constant propagation Base.@pure plus1(x) = x + 1