# Buggy code
def inline_array(array_var, expr, stmts, list_vars, dels):
    """Check to see if the given "array_var" is created from a list
    of constants, and try to inline the list definition as array
    initialization.

    Extra statements produced with be appended to "stmts".
    """
    callname = guard(find_callname, func_ir, expr)
    require(callname and callname[1] == "numpy" and callname[0] == "array")
    require(expr.args[0].name in list_vars)
    ret_type = calltypes[expr].return_type
    require(isinstance(ret_type, types.ArrayCompatible) and ret_type.ndim == 1)
    loc = expr.loc
    list_var = expr.args[0]
    array_typ = typemap[array_var.name]
    debug_print("inline array_var = ", array_var, " list_var = ", list_var)
    dtype = array_typ.dtype
    seq, op = find_build_sequence(func_ir, list_var)
    size = len(seq)
    size_var = ir.Var(scope, mk_unique_var("size"), loc)
    size_tuple_var = ir.Var(scope, mk_unique_var("size_tuple"), loc)
    size_typ = types.intp
    size_tuple_typ = types.UniTuple(size_typ, 1)

    typemap[size_var.name] = size_typ
    typemap[size_tuple_var.name] = size_tuple_typ

    stmts.append(_new_definition(func_ir, size_var, ir.Const(size, loc=loc), loc))

    stmts.append(
        _new_definition(
            func_ir, size_tuple_var, ir.Expr.build_tuple(items=[size_var], loc=loc), loc
        )
    )

    empty_func = ir.Var(scope, mk_unique_var("empty_func"), loc)
    fnty = get_np_ufunc_typ(np.empty)
    sig = context.resolve_function_type(fnty, (size_typ,), {})
    typemap[empty_func.name] = fnty  #

    stmts.append(
        _new_definition(func_ir, empty_func, ir.Global("empty", np.empty, loc=loc), loc)
    )

    empty_call = ir.Expr.call(empty_func, [size_var], {}, loc=loc)
    calltypes[empty_call] = typing.signature(array_typ, size_typ)
    stmts.append(_new_definition(func_ir, array_var, empty_call, loc))

    for i in range(size):
        index_var = ir.Var(scope, mk_unique_var("index"), loc)
        index_typ = types.intp
        typemap[index_var.name] = index_typ
        stmts.append(_new_definition(func_ir, index_var, ir.Const(i, loc), loc))
        setitem = ir.SetItem(array_var, index_var, seq[i], loc)
        calltypes[setitem] = typing.signature(types.none, array_typ, index_typ, dtype)
        stmts.append(setitem)

    stmts.extend(dels)
    return True


# Traceback (TypeError)
Traceback (most recent call last):
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\errors.py", line 491, in new_error_context
yield
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\lowering.py", line 216, in lower_block
self.lower_inst(inst)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\lowering.py", line 365, in lower_inst
func(self, inst)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\npyufunc\parfor.py", line 83, in _lower_parfor_parallel
bool(alias_map), index_var_typ)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\npyufunc\parfor.py", line 357, in _create_gufunc_for_parfor_body
typemap[arr] = types.npytypes.Array(typemap[var], 1, "C")
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\types\abstract.py", line 60, in __call__
inst = type.__call__(cls, *args, **kwargs)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\types\npytypes.py", line 288, in __init__
super(Array, self).__init__(dtype, ndim, layout, name=name)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\types\common.py", line 51, in __init__
raise TypeError("Buffer dtype cannot be buffer")
TypeError: Buffer dtype cannot be buffer

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\dispatcher.py", line 360, in _compile_for_args
raise e
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\dispatcher.py", line 311, in _compile_for_args
return self.compile(tuple(argtypes))
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\dispatcher.py", line 618, in compile
cres = self._compiler.compile(args, return_type)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\dispatcher.py", line 83, in compile
pipeline_class=self.pipeline_class)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 871, in compile_extra
return pipeline.compile_extra(func)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 365, in compile_extra
return self._compile_bytecode()
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 802, in _compile_bytecode
return self._compile_core()
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 789, in _compile_core
res = pm.run(self.status)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 251, in run
raise patched_exception
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 243, in run
stage()
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 676, in stage_nopython_backend
self._backend(lowerfn, objectmode=False)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 626, in _backend
lowered = lowerfn()
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 613, in backend_nopython_mode
self.flags)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\compiler.py", line 990, in native_lowering_stage
lower.lower()
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\lowering.py", line 135, in lower
self.lower_normal_function(self.fndesc)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\lowering.py", line 176, in lower_normal_function
entry_block_tail = self.lower_function_body()
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\lowering.py", line 201, in lower_function_body
self.lower_block(block)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\lowering.py", line 216, in lower_block
self.lower_inst(inst)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\contextlib.py", line 99, in __exit__
self.gen.throw(type, value, traceback)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\errors.py", line 499, in new_error_context
six.reraise(type(newerr), newerr, tb)
File "C:\Users\kittoku\Anaconda3\envs\test_env\lib\site-packages\numba\six.py", line 659, in reraise
raise value
numba.errors.LoweringError: Failed at nopython (nopython mode backend)
Buffer dtype cannot be buffer

File "<stdin>", line 5:

[1] During: lowering "id=6[LoopNest(index_variable = parfor_index.271, range = (0, $16.3, 1))]{28: <ir.Block at <stdin> (5)>}Var(parfor_index.271, <stdin> (5))" at <stdin> (5)
-------------------------------------------------------------------------------
This should not have happened, a problem has occurred in Numba's internals.

Please report the error message and traceback, along with a minimal reproducer
at: https://github.com/numba/numba/issues/new

If you need help writing a minimal reproducer please see:
http://matthewrocklin.com/blog/work/2018/02/28/minimal-bug-reports

If more help is needed please feel free to speak to the Numba core developers
directly at: https://gitter.im/numba/numba

Thanks in advance for your help in improving Numba!

# Fixed code
def inline_array(array_var, expr, stmts, list_vars, dels):
    """Check to see if the given "array_var" is created from a list
    of constants, and try to inline the list definition as array
    initialization.

    Extra statements produced with be appended to "stmts".
    """
    callname = guard(find_callname, func_ir, expr)
    require(callname and callname[1] == "numpy" and callname[0] == "array")
    require(expr.args[0].name in list_vars)
    ret_type = calltypes[expr].return_type
    require(isinstance(ret_type, types.ArrayCompatible) and ret_type.ndim == 1)
    loc = expr.loc
    list_var = expr.args[0]
    # Get the type of the array to be created.
    array_typ = typemap[array_var.name]
    debug_print("inline array_var = ", array_var, " list_var = ", list_var)
    # Get the element type of the array to be created.
    dtype = array_typ.dtype
    # Get the sequence of operations to provide values to the new array.
    seq, _ = find_build_sequence(func_ir, list_var)
    size = len(seq)
    # Create a tuple to pass to empty below to specify the new array size.
    size_var = ir.Var(scope, mk_unique_var("size"), loc)
    size_tuple_var = ir.Var(scope, mk_unique_var("size_tuple"), loc)
    size_typ = types.intp
    size_tuple_typ = types.UniTuple(size_typ, 1)
    typemap[size_var.name] = size_typ
    typemap[size_tuple_var.name] = size_tuple_typ
    stmts.append(_new_definition(func_ir, size_var, ir.Const(size, loc=loc), loc))
    stmts.append(
        _new_definition(
            func_ir, size_tuple_var, ir.Expr.build_tuple(items=[size_var], loc=loc), loc
        )
    )

    # The general approach is to create an empty array and then fill
    # the elements in one-by-one from their specificiation.

    # Get the numpy type to pass to empty.
    nptype = types.DType(dtype)

    # Create a variable to hold the numpy empty function.
    empty_func = ir.Var(scope, mk_unique_var("empty_func"), loc)
    fnty = get_np_ufunc_typ(np.empty)
    sig = context.resolve_function_type(fnty, (size_typ,), {"dtype": nptype})

    typemap[empty_func.name] = fnty

    stmts.append(
        _new_definition(func_ir, empty_func, ir.Global("empty", np.empty, loc=loc), loc)
    )

    # We pass two arguments to empty, first the size tuple and second
    # the dtype of the new array.  Here, we created typ_var which is
    # the dtype argument of the new array.  typ_var in turn is created
    # by getattr of the dtype string on the numpy module.

    # Create var for numpy module.
    g_np_var = ir.Var(scope, mk_unique_var("$np_g_var"), loc)
    typemap[g_np_var.name] = types.misc.Module(np)
    g_np = ir.Global("np", np, loc)
    stmts.append(_new_definition(func_ir, g_np_var, g_np, loc))

    # Create var for result of numpy.<dtype>.
    typ_var = ir.Var(scope, mk_unique_var("$np_typ_var"), loc)
    typemap[typ_var.name] = nptype
    dtype_str = str(dtype)
    if dtype_str == "bool":
        dtype_str = "bool_"
    # Get dtype attribute of numpy module.
    np_typ_getattr = ir.Expr.getattr(g_np_var, dtype_str, loc)
    stmts.append(_new_definition(func_ir, typ_var, np_typ_getattr, loc))

    # Create the call to numpy.empty passing the size tuple and dtype var.
    empty_call = ir.Expr.call(empty_func, [size_var, typ_var], {}, loc=loc)
    calltypes[empty_call] = typing.signature(array_typ, size_typ, nptype)
    stmts.append(_new_definition(func_ir, array_var, empty_call, loc))

    # Fill in the new empty array one-by-one.
    for i in range(size):
        index_var = ir.Var(scope, mk_unique_var("index"), loc)
        index_typ = types.intp
        typemap[index_var.name] = index_typ
        stmts.append(_new_definition(func_ir, index_var, ir.Const(i, loc), loc))
        setitem = ir.SetItem(array_var, index_var, seq[i], loc)
        calltypes[setitem] = typing.signature(types.none, array_typ, index_typ, dtype)
        stmts.append(setitem)

    stmts.extend(dels)
    return True