Functions with different signatures & variable positional arguments

When attempting to compile a function with variable positional arguments and different signatures simultaneously, a “RuntimeError: compilation disabled” error occurs. The problem appears to be related to the use of a variable-sized tuple (args) in the function, making Numba’s type inference and compilation system unable to handle the varying argument types.

Can somebody explain this behavior?

The error does not appear if I call the functions with different signatures one by one.
Now Numba is able to compile the functions even with multiple different signatures.
Here is an example:

from numba import njit
import numba.types as nbt

@njit(['f8(f8)'])
def fn_A(a):        # noqa
    return a

@njit(['f8(f8,f8)'])
def fn_B(a, b):     # noqa
    return a+b

def func(fn, *args):  # noqa
    return fn(*args)

signature_A = nbt.f8(
    nbt.FunctionType(nbt.f8(nbt.f8)),
    nbt.Tuple((nbt.f8,)))

signature_B = nbt.f8(
    nbt.FunctionType(nbt.f8(nbt.f8, nbt.f8)),
    nbt.Tuple((nbt.f8, nbt.f8)))

signature_AB = [signature_A, signature_B]

print('Function pointer A:')
eager_func = njit(signature_A)(func)
print(eager_func(fn_A, 10.0))
print(eager_func.signatures)
print()

print('Function pointer B:')
eager_func = njit(signature_B)(func)
print(eager_func(fn_B, 10.0, 5.0))
print(eager_func.signatures)
print()

print('Function pointer A & B:')
eager_func = njit(signature_AB)(func)
print(eager_func(fn_A, 10.0))
print(eager_func(fn_B, 10.0, 5.0))
print(eager_func.signatures)
print()
# Function pointer A & B:
# 10.0
# 15.0
# [(FunctionType[float64(float64)], UniTuple(float64, 1)), (FunctionType[float64(float64, float64)], UniTuple(float64, 2))]

Update & case closed. Thank you Numba Devs team!
I have updated my conda environment. Numba has been upgraded from version 0.57.1 to 0.58.
There is no RuntimeError anymore.
This code works without intermediate steps.

from numba import njit
import numba.types as nbt

@njit(['f8(f8)'])
def fn_A(a):        # noqa
    return a

@njit(['f8(f8,f8)'])
def fn_B(a, b):     # noqa
    return a+b

def func(fn, *args):  # noqa
    return fn(*args)

signature_A = nbt.f8(nbt.FunctionType(nbt.f8(nbt.f8)), nbt.Tuple((nbt.f8,)))
signature_B = nbt.f8(nbt.FunctionType(nbt.f8(nbt.f8, nbt.f8)), nbt.Tuple((nbt.f8, nbt.f8)))
signature_AB = [signature_A, signature_B]

eager_func = njit(signature_AB)(func)
print(eager_func(fn_A, 10.0))
print(eager_func(fn_B, 10.0, 5.0))
print(eager_func.signatures)
# Function pointer A & B:
# 10.0
# 15.0
# [(FunctionType[float64(float64)], UniTuple(float64, 1)), (FunctionType[float64(float64, float64)], UniTuple(float64, 2))]