| # RUN: %PYTHON %s | FileCheck %s |
| |
| import gc |
| from mlir.ir import * |
| |
| |
| def run(f): |
| print("\nTEST:", f.__name__) |
| f() |
| gc.collect() |
| assert Context._get_live_count() == 0 |
| return f |
| |
| |
| # CHECK-LABEL: TEST: test_exception |
| @run |
| def test_exception(): |
| ctx = Context() |
| ctx.allow_unregistered_dialects = True |
| try: |
| Operation.parse( |
| """ |
| func.func @foo() { |
| "test.use"(%0) : (i64) -> () loc("use") |
| %0 = "test.def"() : () -> i64 loc("def") |
| return |
| } |
| """, |
| context=ctx, |
| ) |
| except MLIRError as e: |
| # CHECK: Exception: < |
| # CHECK: Unable to parse operation assembly: |
| # CHECK: error: "use": operand #0 does not dominate this use |
| # CHECK: note: "use": see current operation: "test.use"(%0) : (i64) -> () |
| # CHECK: note: "def": operand defined here (op in the same block) |
| # CHECK: > |
| print(f"Exception: <{e}>") |
| |
| # CHECK: message: Unable to parse operation assembly |
| print(f"message: {e.message}") |
| |
| # CHECK: error_diagnostics[0]: loc("use") operand #0 does not dominate this use |
| # CHECK: error_diagnostics[0].notes[0]: loc("use") see current operation: "test.use"(%0) : (i64) -> () |
| # CHECK: error_diagnostics[0].notes[1]: loc("def") operand defined here (op in the same block) |
| print( |
| "error_diagnostics[0]: ", |
| e.error_diagnostics[0].location, |
| e.error_diagnostics[0].message, |
| ) |
| print( |
| "error_diagnostics[0].notes[0]: ", |
| e.error_diagnostics[0].notes[0].location, |
| e.error_diagnostics[0].notes[0].message, |
| ) |
| print( |
| "error_diagnostics[0].notes[1]: ", |
| e.error_diagnostics[0].notes[1].location, |
| e.error_diagnostics[0].notes[1].message, |
| ) |
| |
| |
| # CHECK-LABEL: test_emit_error_diagnostics |
| @run |
| def test_emit_error_diagnostics(): |
| ctx = Context() |
| loc = Location.unknown(ctx) |
| handler_diags = [] |
| |
| def handler(d): |
| handler_diags.append(str(d)) |
| return True |
| |
| ctx.attach_diagnostic_handler(handler) |
| |
| try: |
| Attribute.parse("not an attr", ctx) |
| except MLIRError as e: |
| # CHECK: emit_error_diagnostics=False: |
| # CHECK: e.error_diagnostics: ['expected attribute value'] |
| # CHECK: handler_diags: [] |
| print(f"emit_error_diagnostics=False:") |
| print(f"e.error_diagnostics: {[str(diag) for diag in e.error_diagnostics]}") |
| print(f"handler_diags: {handler_diags}") |
| |
| ctx.emit_error_diagnostics = True |
| try: |
| Attribute.parse("not an attr", ctx) |
| except MLIRError as e: |
| # CHECK: emit_error_diagnostics=True: |
| # CHECK: e.error_diagnostics: [] |
| # CHECK: handler_diags: ['expected attribute value'] |
| print(f"emit_error_diagnostics=True:") |
| print(f"e.error_diagnostics: {[str(diag) for diag in e.error_diagnostics]}") |
| print(f"handler_diags: {handler_diags}") |