diff --git a/base/tuple.jl b/base/tuple.jl index dc777e7497598..cc4e52c930b80 100644 --- a/base/tuple.jl +++ b/base/tuple.jl @@ -55,11 +55,10 @@ function setindex(x::Tuple, v, i::Integer) _setindex(v, i, x...) end -function _setindex(v, i::Integer, first, tail...) +function _setindex(v, i::Integer, args...) @_inline_meta - return (ifelse(i == 1, v, first), _setindex(v, i - 1, tail...)...) + return ntuple(j -> ifelse(j == i, v, args[j]), length(args)) end -_setindex(v, i::Integer) = () ## iterating ## diff --git a/test/tuple.jl b/test/tuple.jl index 6087253d19167..9b44e421184d3 100644 --- a/test/tuple.jl +++ b/test/tuple.jl @@ -533,6 +533,9 @@ end @test Base.setindex((1, 2, 4), 4, true) === (4, 2, 4) @test_throws BoundsError Base.setindex((1, 2), 2, false) + + f() = Base.setindex((1:1, 2:2, 3:3), 9, 1) + @test @inferred(f()) == (9, 2:2, 3:3) end @testset "inferrable range indexing with constant values" begin