diff --git a/base/reflection.jl b/base/reflection.jl index 706570303262c..332c3f28225ed 100644 --- a/base/reflection.jl +++ b/base/reflection.jl @@ -1084,7 +1084,8 @@ function may_invoke_generator(method::Method, @nospecialize(atypes), sparams::Si end end end - non_va_args = method.isva ? method.nargs - 1 : method.nargs + nargs = Int(method.nargs) + non_va_args = method.isva ? nargs - 1 : nargs for i = 1:non_va_args if !isdispatchelem(at.parameters[i]) if (ast_slotflag(code, 1 + i + nsparams) & SLOT_USED) != 0 @@ -1095,7 +1096,7 @@ function may_invoke_generator(method::Method, @nospecialize(atypes), sparams::Si if method.isva # If the va argument is used, we need to ensure that all arguments that # contribute to the va tuple are dispatchelemes - if (ast_slotflag(code, 1 + method.nargs + nsparams) & SLOT_USED) != 0 + if (ast_slotflag(code, 1 + nargs + nsparams) & SLOT_USED) != 0 for i = (non_va_args+1):length(at.parameters) if !isdispatchelem(at.parameters[i]) return false diff --git a/test/staged.jl b/test/staged.jl index 4a953ffae33b8..f4349a0a8eaf5 100644 --- a/test/staged.jl +++ b/test/staged.jl @@ -312,10 +312,10 @@ end end g_vararg_generated() = f_vararg_generated((;), (;), Base.inferencebarrier((;))) let tup = g_vararg_generated() - @test !any(==(Any), tup) + @test all(==(typeof((;))), tup) # This is just to make sure that the test is actually testing what we want - # the test only works if there's an unused that matches the position of the # inferencebarrier argument above (N.B. the generator function itself # shifts everything over by 1) - @test code_lowered(first(methods(f_vararg_generated)).generator.gen)[1].slotflags[5] == UInt8(0x00) + @test only(code_lowered(only(methods(f_vararg_generated)).generator.gen)).slotflags[5] == UInt8(0x00) end