diff --git a/src/sugar.jl b/src/sugar.jl index 8b293f7..bd4da73 100644 --- a/src/sugar.jl +++ b/src/sugar.jl @@ -183,19 +183,20 @@ function setmacro(lenstransform, ex::Expr; overwrite::Bool=false) @assert length(ex.args) == 2 ref, val = ex.args obj, lens = parse_obj_lens(ref) + lenssym = gensym(:lens) dst = overwrite ? obj : gensym("_") val = esc(val) ret = if ex.head == :(=) quote - lens = ($lenstransform)($lens) - $dst = $set($obj, lens, $val) + $lenssym = ($lenstransform)($lens) + $dst = $set($obj, $lenssym, $val) end else op = get_update_op(ex.head) f = :($_UpdateOp($op,$val)) quote - lens = ($lenstransform)($lens) - $dst = $modify($f, $obj, lens) + $lenssym = ($lenstransform)($lens) + $dst = $modify($f, $obj, $lenssym) end end ret diff --git a/test/test_setmacro.jl b/test/test_setmacro.jl index bc48fa3..77c9bb0 100644 --- a/test/test_setmacro.jl +++ b/test/test_setmacro.jl @@ -46,5 +46,31 @@ using StaticNumbers @test m3 === @SMatrix[1 0; 0 0] end +function test_all_inferrable(f, argtypes) + typed = first(code_typed(f, argtypes)) + code = typed.first + @test all(T -> !(T isa UnionAll || T === Any), code.slottypes) +end + +# Example of macro that caused inference issues before. +macro test_macro(expr) + quote + function f($(esc(:x))) + $(Setfield.setmacro(identity, expr, overwrite=true)) + $(Setfield.setmacro(identity, expr, overwrite=true)) + $(Setfield.setmacro(identity, expr, overwrite=true)) + $(Setfield.setmacro(identity, expr, overwrite=true)) + $(Setfield.setmacro(identity, expr, overwrite=true)) + return $(esc(:x)) + end + end +end + +@testset "setmacro multiple usage" begin + let f = @test_macro(x[end] = 1) + test_all_inferrable(f, (Vector{Float64}, )) + end +end + end#module