lcompilers / lpython

Python compiler
https://lpython.org/
Other
1.5k stars 162 forks source link

Attempt to explicitly initialize dataclass produces traceback #2102

Open rebcabin opened 1 year ago

rebcabin commented 1 year ago

works in both CP and LP:

from lpython import (i8, i32, i64, f32, f64,
                     u8, u32,
                     TypeVar, Const,
                     dataclass
                     )

from numpy import (empty, sqrt, float32, float64,
                   int8, int32, array, # ndarray
                   )

@dataclass
class LpBhvSmall:
    dim : i32 = 4
    a : i8[4] = empty(4, dtype=int8)

def g() -> None:
    #################### ATTENTION: IMPLICIT INIT #######################
    l1 : LpBhvSmall = LpBhvSmall() # 4, empty(4, dtype=int8))
    l1.a[0] = i8(-96)
    l1.a[1] = i8(-17)
    l1.a[2] = i8(80)
    l1.a[3] = i8(107)

    assert l1.a[0] == i8(-96)
    assert l1.a[1] == i8(-17)
    assert l1.a[2] == i8(80)
    assert l1.a[3] == i8(107)

    #################### ATTENTION: IMPLICIT INIT #######################
    l2 : LpBhvSmall = LpBhvSmall() # 4, empty(4, dtype=int8))
    l2.a[0] = i8(-42)
    l2.a[1] = i8(-99)
    l2.a[2] = i8(3)
    l2.a[3] = i8(-110)

    assert l2.a[0] == i8(-42)
    assert l2.a[1] == i8(-99)
    assert l2.a[2] == i8(3)
    assert l2.a[3] == i8(-110)

if __name__ == "__main__":

    print("Module HDC")
    print('')

    g()
(lp) ┌─(~/CLionProjects/lpython/lasr/LP-pycharm)─────────────────────────────────────────────────────────────────────────────────────────────────────────(brian@Golf37:s000)─┐
└─(21:16:20 on brian-lasr ✹)──> PYTHONPATH='../../src/runtime/lpython' python issue2101.py                                                                ──(Tue,Jul04)─┘
Module HDC

(lp) ┌─(~/CLionProjects/lpython/lasr/LP-pycharm)─────────────────────────────────────────────────────────────────────────────────────────────────────────(brian@Golf37:s000)─┐
└─(21:18:39 on brian-lasr ✹)──> ~/CLionProjects/lpython/src/bin/lpython -I. issue2101.py                                                                  ──(Tue,Jul04)─┘
Module HDC

Fails in LP but works in CP

from lpython import (i8, i32, i64, f32, f64,
                     u8, u32,
                     TypeVar, Const,
                     dataclass
                     )

from numpy import (empty, sqrt, float32, float64,
                   int8, int32, array, # ndarray
                   )

@dataclass
class LpBhvSmall:
    dim : i32 = 4
    a : i8[4] = empty(4, dtype=int8)

def g() -> None:
    ##################### ATTENTION: EXPLICIT INIT #######################
    l1 : LpBhvSmall = LpBhvSmall(4, empty(4, dtype=int8))
    l1.a[0] = i8(-96)
    l1.a[1] = i8(-17)
    l1.a[2] = i8(80)
    l1.a[3] = i8(107)

    assert l1.a[0] == i8(-96)
    assert l1.a[1] == i8(-17)
    assert l1.a[2] == i8(80)
    assert l1.a[3] == i8(107)

    ##################### ATTENTION: EXPLICIT INIT #######################
    l2 : LpBhvSmall = LpBhvSmall(4, empty(4, dtype=int8))
    l2.a[0] = i8(-42)
    l2.a[1] = i8(-99)
    l2.a[2] = i8(3)
    l2.a[3] = i8(-110)

    assert l2.a[0] == i8(-42)
    assert l2.a[1] == i8(-99)
    assert l2.a[2] == i8(3)
    assert l2.a[3] == i8(-110)

if __name__ == "__main__":

    print("Module HDC")
    print('')

    g()
(lp) ┌─(~/CLionProjects/lpython/lasr/LP-pycharm)─────────────────────────────────────────────────────────────────────────────────────────────────────────(brian@Golf37:s000)─┐
└─(21:18:45 on brian-lasr ✹)──> PYTHONPATH='../../src/runtime/lpython' python issue2101.py                                                                ──(Tue,Jul04)─┘
Module HDC

(lp) ┌─(~/CLionProjects/lpython/lasr/LP-pycharm)─────────────────────────────────────────────────────────────────────────────────────────────────────────(brian@Golf37:s000)─┐
└─(21:19:44 on brian-lasr ✹)──> ~/CLionProjects/lpython/src/bin/lpython -I. issue2101.py                                                                  ──(Tue,Jul04)─┘
Internal Compiler Error: Unhandled exception
Traceback (most recent call last):
  File "/Users/brian/CLionProjects/lpython/src/bin/lpython.cpp", line 1844
    err = compile_python_to_object_file(arg_file, tmp_o, runtime_library_dir,
  File "/Users/brian/CLionProjects/lpython/src/bin/lpython.cpp", line 783
    r1 = LCompilers::LPython::python_ast_to_asr(al, lm, nullptr, *ast, diagnostics, compiler_options,
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 7572
    auto res2 = body_visitor(al, lm, *ast_m, diagnostics, unit, main_module, module_name,
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 7523
    BodyVisitor b(al, lm, unit, diagnostics, main_module, module_name, ast_overload, allow_implicit_casting);
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 4655
    visit_stmt(*x.m_body[i]);
  File "/Users/brian/CLionProjects/lpython/src/lpython/python_ast.h", line 1883
    void visit_stmt(const stmt_t &b) { visit_stmt_t(b, self()); }
  File "/Users/brian/CLionProjects/lpython/src/lpython/python_ast.h", line 1751
    case stmtType::FunctionDef: { v.visit_FunctionDef((const FunctionDef_t &)x); return; }
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 4762
    handle_fn(x, *f);
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 4744
    transform_stmts(body, x.n_body, x.m_body);
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 4615
    this->visit_stmt(*m_body[i]);
  File "/Users/brian/CLionProjects/lpython/src/lpython/python_ast.h", line 1883
    void visit_stmt(const stmt_t &b) { visit_stmt_t(b, self()); }
  File "/Users/brian/CLionProjects/lpython/src/lpython/python_ast.h", line 1757
    case stmtType::AugAssign: { v.visit_AugAssign((const AugAssign_t &)x); return; }
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 4888
    visit_AnnAssignUtil(x, var_name, init_expr);
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 2787
    this->visit_expr(*x.m_value);
  File "/Users/brian/CLionProjects/lpython/src/lpython/python_ast.h", line 1910
    void visit_expr(const expr_t &b) { visit_expr_t(b, self()); }
  File "/Users/brian/CLionProjects/lpython/src/lpython/python_ast.h", line 1799
    case exprType::Compare: { v.visit_Compare((const Compare_t &)x); return; }
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 7508
    tmp = make_call_helper(al, s, current_scope, args, call_name, x.base.base.loc,
  File "/Users/brian/CLionProjects/lpython/src/lpython/semantics/python_ast_to_asr.cpp", line 1301
    ASR::ttype_t* left_type = member_var->m_type;
  File "/Users/brian/CLionProjects/lpython/src/libasr/asr_utils.h", line 143
    return ASR::expr_type0(f);
  File "/Users/brian/CLionProjects/lpython/src/libasr/asr.h", line 47902
    LCOMPILERS_ASSERT(f != nullptr);
AssertFailed: f != nullptr
Smit-create commented 1 year ago

It fails in LPython because empty is ignored. This is a blocker for many issues now. There are several ways to handle this, and I'll discuss this with @certik today.