Parallel njit not working with None optional kwarg and nested loops

Hi, I found that I could not use parallel=True, kw=None and nested loops with if statements together. But if one of those conditions aren’t met, it works again.

Is it supposed to function like that?

Example:

import numpy as np
from numba import njit, prange

@njit(parallel=True)
def foo(max_val=None):
    if max_val is None:
        max_val = 20
    arr = np.arange(30)
    val = 0
    for i in prange(len(arr)):
        val += arr[i]
        for j in range(len(arr)):
            if arr[j] > max_val:
                break
    return val

print(foo())
# LoweringError: Failed in nopython mode pipeline (step: native lowering)
# cannot store {i64, i1} to {i64, i8}*: mismatching types
#
# File "../../../../../../opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/numba/parfors/parfor.py", line 402:
#         def arange_4(start, stop, step, dtype):
#             <source elided>
#             val = start
#             for i in numba.parfors.parfor.internal_prange(nitems):
#             ^
#
# During: lowering "id=51[LoopNest(index_variable = parfor_index.2083, range = (0, arange_parallel_impl__locals__arange_4_v142_nitems, 1))]{42: <ir.Block at /opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/numba/parfors/parfor.py (402)>, 3713: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (23)>, 90: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (25)>, 92: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (25)>, 93: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (27)>, 3711: <ir.Block at /var/folders/95/t4pytfmx6dq05tlrmcdlvsqc0000gn/T/ipykernel_6144/309953143.py (27)>}Var(parfor_index.2083, parfor.py:402)" at /opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages/numba/parfors/parfor.py (402)

@njit(parallel=True)
def bar(max_val=0):
    if max_val == 0:
        max_val = 20
    arr = np.arange(30)
    val = 0
    for i in prange(len(arr)):
        val += arr[i]
        for j in range(len(arr)):
            if arr[j] > max_val:
                break
    return val

print(bar())
# 435

@njit(parallel=True)
def baz(max_val=None):
    if max_val is None:
        max_val = 20
    arr = np.arange(30)
    val = 0
    for i in prange(len(arr)):
        val += arr[i]
        for j in range(len(arr)):
            boo = arr[j] > max_val
    return val

print(baz())
# 13485

@njit(parallel=False)
def qux(max_val=None):
    if max_val is None:
        max_val = 20
    arr = np.arange(30)
    val = 0
    for i in prange(len(arr)):
        val += arr[i]
        for j in range(len(arr)):
            if arr[j] > max_val:
                break
    return val

print(qux())
# 435

Edit: I realize that this is a “should it be this way?” question rather than “How do I get this going?”, but I thought a workaround may be helpful. I don’t know it it’s ‘supposed’ to work this way.

Try this?

def foo(max_val_=None):
    max_val = 20 if max_val_ is None else max_val_