# Buggy code
def lower_inst(self, inst):
    # Set debug location for all subsequent LL instructions
    self.debuginfo.mark_location(self.builder, self.loc)
    self.debug_print(str(inst))
    if isinstance(inst, ir.Assign):
        ty = self.typeof(inst.target.name)
        val = self.lower_assign(ty, inst)
        self.storevar(val, inst.target.name)

    elif isinstance(inst, ir.Branch):
        cond = self.loadvar(inst.cond.name)
        tr = self.blkmap[inst.truebr]
        fl = self.blkmap[inst.falsebr]

        condty = self.typeof(inst.cond.name)
        pred = self.context.cast(self.builder, cond, condty, types.boolean)
        assert pred.type == Type.int(1), "cond is not i1: %s" % pred.type
        self.builder.cbranch(pred, tr, fl)

    elif isinstance(inst, ir.Jump):
        target = self.blkmap[inst.target]
        self.builder.branch(target)

    elif isinstance(inst, ir.Return):
        if self.generator_info:
            # StopIteration
            self.genlower.return_from_generator(self)
            return
        val = self.loadvar(inst.value.name)
        oty = self.typeof(inst.value.name)
        ty = self.fndesc.restype
        if isinstance(ty, types.Optional):
            # If returning an optional type
            self.call_conv.return_optional_value(self.builder, ty, oty, val)
            return
        if ty != oty:
            val = self.context.cast(self.builder, val, oty, ty)
        retval = self.context.get_return_value(self.builder, ty, val)
        self.call_conv.return_value(self.builder, retval)

    elif isinstance(inst, ir.StaticSetItem):
        signature = self.fndesc.calltypes[inst]
        assert signature is not None
        try:
            impl = self.context.get_function("static_setitem", signature)
        except NotImplementedError:
            return self.lower_setitem(
                inst.target, inst.index_var, inst.value, signature
            )
        else:
            target = self.loadvar(inst.target.name)
            value = self.loadvar(inst.value.name)
            valuety = self.typeof(inst.value.name)
            value = self.context.cast(self.builder, value, valuety, signature.args[2])
            return impl(self.builder, (target, inst.index, value))

    elif isinstance(inst, ir.Print):
        self.lower_print(inst)

    elif isinstance(inst, ir.SetItem):
        signature = self.fndesc.calltypes[inst]
        assert signature is not None
        return self.lower_setitem(inst.target, inst.index, inst.value, signature)

    elif isinstance(inst, ir.StoreMap):
        signature = self.fndesc.calltypes[inst]
        assert signature is not None
        return self.lower_setitem(inst.dct, inst.key, inst.value, signature)

    elif isinstance(inst, ir.DelItem):
        target = self.loadvar(inst.target.name)
        index = self.loadvar(inst.index.name)

        targetty = self.typeof(inst.target.name)
        indexty = self.typeof(inst.index.name)

        signature = self.fndesc.calltypes[inst]
        assert signature is not None

        op = operator.delitem
        fnop = self.context.typing_context.resolve_value_type(op)
        callsig = fnop.get_call_type(
            self.context.typing_context,
            signature.args,
            {},
        )
        impl = self.context.get_function(fnop, callsig)

        assert targetty == signature.args[0]
        index = self.context.cast(self.builder, index, indexty, signature.args[1])

        return impl(self.builder, (target, index))

    elif isinstance(inst, ir.Del):
        self.delvar(inst.value)

    elif isinstance(inst, ir.SetAttr):
        target = self.loadvar(inst.target.name)
        value = self.loadvar(inst.value.name)
        signature = self.fndesc.calltypes[inst]

        targetty = self.typeof(inst.target.name)
        valuety = self.typeof(inst.value.name)
        assert signature is not None
        assert signature.args[0] == targetty
        impl = self.context.get_setattr(inst.attr, signature)

        # Convert argument to match
        value = self.context.cast(self.builder, value, valuety, signature.args[1])

        return impl(self.builder, (target, value))

    elif isinstance(inst, ir.StaticRaise):
        self.lower_static_raise(inst)

    else:
        for _class, func in lower_extensions.items():
            if isinstance(inst, _class):
                func(self, inst)
                return
        raise NotImplementedError(type(inst))


# Traceback (IndexError)
Traceback (most recent call last):
File "/home/ibutygin/miniconda3/envs/NUMBA_CUSTOM/lib/python3.7/site-packages/llvmlite/ir/instructions.py", line 619, in __init__
typ = typ.elements[i]
IndexError: tuple index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/ibutygin/src/numba/numba/numba/errors.py", line 717, in new_error_context
yield
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 260, in lower_block
self.lower_inst(inst)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 303, in lower_inst
val = self.lower_assign(ty, inst)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 467, in lower_assign
return self.lower_expr(ty, value)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 932, in lower_expr
res = self.lower_call(resty, expr)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 724, in lower_call
res = self._lower_call_normal(fnty, expr, signature)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 903, in _lower_call_normal
res = impl(self.builder, argvals, self.loc)
File "/home/ibutygin/src/numba/numba/numba/targets/base.py", line 1132, in __call__
res = self._imp(self._context, builder, self._sig, args, loc=loc)
File "/home/ibutygin/src/numba/numba/numba/targets/base.py", line 1157, in wrapper
return fn(*args, **kwargs)
File "/home/ibutygin/src/numba/numba/numba/typing/templates.py", line 778, in method_impl
return call(builder, args)
File "/home/ibutygin/src/numba/numba/numba/targets/base.py", line 1132, in __call__
res = self._imp(self._context, builder, self._sig, args, loc=loc)
File "/home/ibutygin/src/numba/numba/numba/targets/base.py", line 1157, in wrapper
return fn(*args, **kwargs)
File "/home/ibutygin/src/numba/numba/numba/targets/imputils.py", line 193, in imp
builder, func, fndesc.restype, fndesc.argtypes, args)
File "/home/ibutygin/src/numba/numba/numba/targets/callconv.py", line 477, in call_function
args = list(arginfo.as_arguments(builder, args))
File "/home/ibutygin/src/numba/numba/numba/datamodel/packer.py", line 100, in as_arguments
for dm, val in zip(self._dm_args, values)
File "/home/ibutygin/src/numba/numba/numba/datamodel/packer.py", line 100, in <listcomp>
for dm, val in zip(self._dm_args, values)
File "/home/ibutygin/src/numba/numba/numba/datamodel/models.py", line 447, in as_argument
v = builder.extract_value(value, [i])
File "/home/ibutygin/miniconda3/envs/NUMBA_CUSTOM/lib/python3.7/site-packages/llvmlite/ir/builder.py", line 927, in extract_value
instr = instructions.ExtractValue(self.block, agg, idx, name=name)
File "/home/ibutygin/miniconda3/envs/NUMBA_CUSTOM/lib/python3.7/site-packages/llvmlite/ir/instructions.py", line 622, in __init__
% (list(indices), agg.type))
TypeError: Can't index at [0] in {}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "test.py", line 73, in <module>
print(bar(Dummy()))
File "/home/ibutygin/src/numba/numba/numba/dispatcher.py", line 420, in _compile_for_args
raise e
File "/home/ibutygin/src/numba/numba/numba/dispatcher.py", line 353, in _compile_for_args
return self.compile(tuple(argtypes))
File "/home/ibutygin/src/numba/numba/numba/compiler_lock.py", line 32, in _acquire_compile_lock
return func(*args, **kwargs)
File "/home/ibutygin/src/numba/numba/numba/dispatcher.py", line 768, in compile
cres = self._compiler.compile(args, return_type)
File "/home/ibutygin/src/numba/numba/numba/dispatcher.py", line 77, in compile
status, retval = self._compile_cached(args, return_type)
File "/home/ibutygin/src/numba/numba/numba/dispatcher.py", line 91, in _compile_cached
retval = self._compile_core(args, return_type)
File "/home/ibutygin/src/numba/numba/numba/dispatcher.py", line 109, in _compile_core
pipeline_class=self.pipeline_class)
File "/home/ibutygin/src/numba/numba/numba/compiler.py", line 543, in compile_extra
return pipeline.compile_extra(func)
File "/home/ibutygin/src/numba/numba/numba/compiler.py", line 328, in compile_extra
return self._compile_bytecode()
File "/home/ibutygin/src/numba/numba/numba/compiler.py", line 389, in _compile_bytecode
return self._compile_core()
File "/home/ibutygin/src/numba/numba/numba/compiler.py", line 368, in _compile_core
raise e
File "/home/ibutygin/src/numba/numba/numba/compiler.py", line 359, in _compile_core
pm.run(self.state)
File "/home/ibutygin/src/numba/numba/numba/compiler_machinery.py", line 331, in run
raise patched_exception
File "/home/ibutygin/src/numba/numba/numba/compiler_machinery.py", line 322, in run
self._runPass(idx, pass_inst, state)
File "/home/ibutygin/src/numba/numba/numba/compiler_lock.py", line 32, in _acquire_compile_lock
return func(*args, **kwargs)
File "/home/ibutygin/src/numba/numba/numba/compiler_machinery.py", line 281, in _runPass
mutated |= check(pss.run_pass, internal_state)
File "/home/ibutygin/src/numba/numba/numba/compiler_machinery.py", line 268, in check
mangled = func(compiler_state)
File "/home/ibutygin/src/numba/numba/numba/typed_passes.py", line 391, in run_pass
NativeLowering().run_pass(state)
File "/home/ibutygin/src/numba/numba/numba/typed_passes.py", line 333, in run_pass
lower.lower()
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 179, in lower
self.lower_normal_function(self.fndesc)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 220, in lower_normal_function
entry_block_tail = self.lower_function_body()
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 245, in lower_function_body
self.lower_block(block)
File "/home/ibutygin/src/numba/numba/numba/lowering.py", line 260, in lower_block
self.lower_inst(inst)
File "/home/ibutygin/miniconda3/envs/NUMBA_CUSTOM/lib/python3.7/contextlib.py", line 130, in __exit__
self.gen.throw(type, value, traceback)
File "/home/ibutygin/src/numba/numba/numba/errors.py", line 725, in new_error_context
six.reraise(type(newerr), newerr, tb)
File "/home/ibutygin/src/numba/numba/numba/six.py", line 669, in reraise
raise value
numba.errors.LoweringError: Failed in nopython mode pipeline (step: nopython mode backend)
Can't index at [0] in {}

File "test.py", line 71:
def bar(obj):
return obj.inline_method(123,456)
^

[1] During: lowering "$10call_method.4 = call $4load_method.1($const6.2, $const8.3, func=$4load_method.1, args=[Var($const6.2, test.py:71), Var($const8.3, test.py:71)], kws=(), vararg=None)" at test.py (71)

# Fixed code
def lower_inst(self, inst):
    # Set debug location for all subsequent LL instructions
    self.debuginfo.mark_location(self.builder, self.loc)
    self.debug_print(str(inst))
    if isinstance(inst, ir.Assign):
        ty = self.typeof(inst.target.name)
        val = self.lower_assign(ty, inst)
        self.storevar(val, inst.target.name)

    elif isinstance(inst, ir.Branch):
        cond = self.loadvar(inst.cond.name)
        tr = self.blkmap[inst.truebr]
        fl = self.blkmap[inst.falsebr]

        condty = self.typeof(inst.cond.name)
        pred = self.context.cast(self.builder, cond, condty, types.boolean)
        assert pred.type == Type.int(1), "cond is not i1: %s" % pred.type
        self.builder.cbranch(pred, tr, fl)

    elif isinstance(inst, ir.Jump):
        target = self.blkmap[inst.target]
        self.builder.branch(target)

    elif isinstance(inst, ir.Return):
        if self.generator_info:
            # StopIteration
            self.genlower.return_from_generator(self)
            return
        val = self.loadvar(inst.value.name)
        oty = self.typeof(inst.value.name)
        ty = self.fndesc.restype
        if isinstance(ty, types.Optional):
            # If returning an optional type
            self.call_conv.return_optional_value(self.builder, ty, oty, val)
            return
        if ty != oty:
            val = self.context.cast(self.builder, val, oty, ty)
        retval = self.context.get_return_value(self.builder, ty, val)
        self.call_conv.return_value(self.builder, retval)

    elif isinstance(inst, ir.StaticSetItem):
        signature = self.fndesc.calltypes[inst]
        assert signature is not None
        try:
            impl = self.context.get_function("static_setitem", signature)
        except NotImplementedError:
            return self.lower_setitem(
                inst.target, inst.index_var, inst.value, signature
            )
        else:
            target = self.loadvar(inst.target.name)
            value = self.loadvar(inst.value.name)
            valuety = self.typeof(inst.value.name)
            value = self.context.cast(self.builder, value, valuety, signature.args[2])
            return impl(self.builder, (target, inst.index, value))

    elif isinstance(inst, ir.Print):
        self.lower_print(inst)

    elif isinstance(inst, ir.SetItem):
        signature = self.fndesc.calltypes[inst]
        assert signature is not None
        return self.lower_setitem(inst.target, inst.index, inst.value, signature)

    elif isinstance(inst, ir.StoreMap):
        signature = self.fndesc.calltypes[inst]
        assert signature is not None
        return self.lower_setitem(inst.dct, inst.key, inst.value, signature)

    elif isinstance(inst, ir.DelItem):
        target = self.loadvar(inst.target.name)
        index = self.loadvar(inst.index.name)

        targetty = self.typeof(inst.target.name)
        indexty = self.typeof(inst.index.name)

        signature = self.fndesc.calltypes[inst]
        assert signature is not None

        op = operator.delitem
        fnop = self.context.typing_context.resolve_value_type(op)
        callsig = fnop.get_call_type(
            self.context.typing_context,
            signature.args,
            {},
        )
        impl = self.context.get_function(fnop, callsig)

        assert targetty == signature.args[0]
        index = self.context.cast(self.builder, index, indexty, signature.args[1])

        return impl(self.builder, (target, index))

    elif isinstance(inst, ir.Del):
        self.delvar(inst.value)

    elif isinstance(inst, ir.SetAttr):
        target = self.loadvar(inst.target.name)
        value = self.loadvar(inst.value.name)
        signature = self.fndesc.calltypes[inst]

        targetty = self.typeof(inst.target.name)
        valuety = self.typeof(inst.value.name)
        assert signature is not None
        assert signature.args[0] == targetty
        impl = self.context.get_setattr(inst.attr, signature)

        # Convert argument to match
        value = self.context.cast(self.builder, value, valuety, signature.args[1])

        return impl(self.builder, (target, value))

    elif isinstance(inst, ir.StaticRaise):
        self.lower_static_raise(inst)

    elif isinstance(inst, ir.StaticTryRaise):
        self.lower_static_try_raise(inst)

    else:
        for _class, func in lower_extensions.items():
            if isinstance(inst, _class):
                func(self, inst)
                return
        raise NotImplementedError(type(inst))