| # 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 | |
| # CHECK-LABEL: TEST: testUnknown | |
| def testUnknown(): | |
| with Context() as ctx: | |
| loc = UnknownLoc.get() | |
| assert loc.context is ctx | |
| ctx = None | |
| gc.collect() | |
| # CHECK: unknown str: loc(unknown) | |
| print("unknown str:", str(loc)) | |
| # CHECK: unknown repr: UnknownLoc(loc(unknown)) | |
| print("unknown repr:", repr(loc)) | |
| assert isinstance(loc, UnknownLoc) | |
| assert isinstance(loc, Location) | |
| assert not isinstance(loc, FileLineColLoc) | |
| assert not isinstance(loc, NameLoc) | |
| assert not isinstance(loc, CallSiteLoc) | |
| assert not isinstance(loc, FusedLoc) | |
| run(testUnknown) | |
| # CHECK-LABEL: TEST: testLocationAttr | |
| def testLocationAttr(): | |
| with Context() as ctxt: | |
| loc = UnknownLoc.get() | |
| attr = loc.attr | |
| clone = Location.from_attr(attr) | |
| gc.collect() | |
| # CHECK: loc: loc(unknown) | |
| print("loc:", str(loc)) | |
| # CHECK: clone: loc(unknown) | |
| print("clone:", str(clone)) | |
| assert loc == clone | |
| assert isinstance(clone, UnknownLoc) | |
| run(testLocationAttr) | |
| # CHECK-LABEL: TEST: testFileLineCol | |
| def testFileLineCol(): | |
| with Context() as ctx: | |
| loc = FileLineColLoc.get("foo1.txt", 123, 56) | |
| range = FileLineColLoc.get("foo2.txt", 123, 56, 124, 100) | |
| ctx = None | |
| gc.collect() | |
| # CHECK: file str: loc("foo1.txt":123:56) | |
| print("file str:", str(loc)) | |
| # CHECK: file repr: FileLineColLoc(loc("foo1.txt":123:56)) | |
| print("file repr:", repr(loc)) | |
| # CHECK: file range str: loc("foo2.txt":123:56 to 124:100) | |
| print("file range str:", str(range)) | |
| # CHECK: file range repr: FileLineColLoc(loc("foo2.txt":123:56 to 124:100)) | |
| print("file range repr:", repr(range)) | |
| assert isinstance(loc, FileLineColLoc) | |
| assert not isinstance(loc, NameLoc) | |
| assert not isinstance(loc, CallSiteLoc) | |
| assert not isinstance(loc, FusedLoc) | |
| # CHECK: file filename: foo1.txt | |
| print("file filename:", loc.filename) | |
| # CHECK: file start_line: 123 | |
| print("file start_line:", loc.start_line) | |
| # CHECK: file start_col: 56 | |
| print("file start_col:", loc.start_col) | |
| # CHECK: file end_line: 123 | |
| print("file end_line:", loc.end_line) | |
| # CHECK: file end_col: 56 | |
| print("file end_col:", loc.end_col) | |
| assert isinstance(range, FileLineColLoc) | |
| # CHECK: file filename: foo2.txt | |
| print("file filename:", range.filename) | |
| # CHECK: file start_line: 123 | |
| print("file start_line:", range.start_line) | |
| # CHECK: file start_col: 56 | |
| print("file start_col:", range.start_col) | |
| # CHECK: file end_line: 124 | |
| print("file end_line:", range.end_line) | |
| # CHECK: file end_col: 100 | |
| print("file end_col:", range.end_col) | |
| with Context() as ctx: | |
| ctx.allow_unregistered_dialects = True | |
| loc = FileLineColLoc.get("foo3.txt", 127, 61) | |
| with loc: | |
| i32 = IntegerType.get_signless(32) | |
| module = Module.create() | |
| with InsertionPoint(module.body): | |
| op = Operation.create("custom.op1", results=[i32]) | |
| new_value = op.result | |
| # CHECK: new_value location: loc("foo3.txt":127:61) | |
| print("new_value location: ", new_value.location) | |
| # `op.location` and `value.location` both downcast to the | |
| # concrete subclass. | |
| assert isinstance(op.location, FileLineColLoc) | |
| assert isinstance(new_value.location, FileLineColLoc) | |
| assert op.location.typeid == FileLineColLoc.static_typeid | |
| run(testFileLineCol) | |
| # CHECK-LABEL: TEST: testName | |
| def testName(): | |
| with Context() as ctx: | |
| loc = NameLoc.get("nombre") | |
| loc_with_child_loc = NameLoc.get("naam", loc) | |
| ctx = None | |
| gc.collect() | |
| # CHECK: name str: loc("nombre") | |
| print("name str:", str(loc)) | |
| # CHECK: name repr: NameLoc(loc("nombre")) | |
| print("name repr:", repr(loc)) | |
| # CHECK: name str: loc("naam"("nombre")) | |
| print("name str:", str(loc_with_child_loc)) | |
| # CHECK: name repr: NameLoc(loc("naam"("nombre"))) | |
| print("name repr:", repr(loc_with_child_loc)) | |
| assert isinstance(loc, NameLoc) | |
| # CHECK: name name_str: nombre | |
| print("name name_str:", loc.name_str) | |
| # CHECK: name child_loc: loc(unknown) | |
| print("name child_loc:", loc.child_loc) | |
| assert isinstance(loc.child_loc, UnknownLoc) | |
| assert isinstance(loc_with_child_loc, NameLoc) | |
| # CHECK: name name_str: naam | |
| print("name name_str:", loc_with_child_loc.name_str) | |
| # CHECK: name child_loc_with_child_loc: loc("nombre") | |
| print("name child_loc_with_child_loc:", loc_with_child_loc.child_loc) | |
| assert isinstance(loc_with_child_loc.child_loc, NameLoc) | |
| run(testName) | |
| # CHECK-LABEL: TEST: testCallSite | |
| def testCallSite(): | |
| with Context() as ctx: | |
| loc = CallSiteLoc.get( | |
| FileLineColLoc.get("foo.text", 123, 45), | |
| [ | |
| FileLineColLoc.get("util.foo", 379, 21), | |
| FileLineColLoc.get("main.foo", 100, 63), | |
| ], | |
| ) | |
| ctx = None | |
| # CHECK: callsite str: loc(callsite("foo.text":123:45 at callsite("util.foo":379:21 at "main.foo":100:63)) | |
| print("callsite str:", str(loc)) | |
| # CHECK: callsite repr: CallSiteLoc(loc(callsite("foo.text":123:45 at callsite("util.foo":379:21 at "main.foo":100:63))) | |
| print("callsite repr:", repr(loc)) | |
| assert isinstance(loc, CallSiteLoc) | |
| # CHECK: callsite callee: loc("foo.text":123:45) | |
| print("callsite callee:", loc.callee) | |
| assert isinstance(loc.callee, FileLineColLoc) | |
| # CHECK: callsite caller: loc(callsite("util.foo":379:21 at "main.foo":100:63)) | |
| print("callsite caller:", loc.caller) | |
| assert isinstance(loc.caller, CallSiteLoc) | |
| run(testCallSite) | |
| # CHECK-LABEL: TEST: testFused | |
| def testFused(): | |
| with Context() as ctx: | |
| loc_single = Location.fused([NameLoc.get("apple")]) | |
| loc_empty = Location.fused([]) | |
| loc = FusedLoc.get([NameLoc.get("apple"), NameLoc.get("banana")]) | |
| attr = Attribute.parse('"sauteed"') | |
| loc_attr = FusedLoc.get([NameLoc.get("carrot"), NameLoc.get("potatoes")], attr) | |
| loc_empty_attr = FusedLoc.get([], attr) | |
| loc_single_attr = FusedLoc.get([NameLoc.get("apple")], attr) | |
| try: | |
| FusedLoc.get([NameLoc.get("x")]) | |
| except ValueError as e: | |
| # CHECK: fused strict error: FusedLoc.get would collapse | |
| print("fused strict error:", str(e)[:35]) | |
| else: | |
| assert False, "expected ValueError from strict FusedLoc.get" | |
| ctx = None | |
| assert not isinstance(loc_single, FusedLoc) | |
| assert isinstance(loc_single, NameLoc) | |
| # CHECK: fused str: loc("apple") | |
| print("fused str:", str(loc_single)) | |
| # CHECK: fused repr: NameLoc(loc("apple")) | |
| print("fused repr:", repr(loc_single)) | |
| assert isinstance(loc, FusedLoc) | |
| # CHECK: fused str: loc(fused["apple", "banana"]) | |
| print("fused str:", str(loc)) | |
| # CHECK: fused repr: FusedLoc(loc(fused["apple", "banana"])) | |
| print("fused repr:", repr(loc)) | |
| # CHECK: fused locations: [NameLoc(loc("apple")), NameLoc(loc("banana"))] | |
| print("fused locations:", loc.locations) | |
| # CHECK: fused metadata: None | |
| print("fused metadata:", loc.metadata) | |
| assert isinstance(loc_attr, FusedLoc) | |
| # CHECK: fused metadata: "sauteed" | |
| print("fused metadata:", loc_attr.metadata) | |
| # CHECK: fused str: loc(fused<"sauteed">["carrot", "potatoes"]) | |
| print("fused str:", str(loc_attr)) | |
| # CHECK: fused repr: FusedLoc(loc(fused<"sauteed">["carrot", "potatoes"])) | |
| print("fused repr:", repr(loc_attr)) | |
| # CHECK: fused locations: [NameLoc(loc("carrot")), NameLoc(loc("potatoes"))] | |
| print("fused locations:", loc_attr.locations) | |
| assert not isinstance(loc_empty, FusedLoc) | |
| assert isinstance(loc_empty, UnknownLoc) | |
| # CHECK: fused str: loc(unknown) | |
| print("fused str:", str(loc_empty)) | |
| # CHECK: fused repr: UnknownLoc(loc(unknown)) | |
| print("fused repr:", repr(loc_empty)) | |
| assert isinstance(loc_empty_attr, FusedLoc) | |
| # CHECK: fused str: loc(fused<"sauteed">[unknown]) | |
| print("fused str:", str(loc_empty_attr)) | |
| # CHECK: fused repr: FusedLoc(loc(fused<"sauteed">[unknown])) | |
| print("fused repr:", repr(loc_empty_attr)) | |
| # CHECK: fused locations: [UnknownLoc(loc(unknown))] | |
| print("fused locations:", loc_empty_attr.locations) | |
| assert isinstance(loc_single_attr, FusedLoc) | |
| # CHECK: fused str: loc(fused<"sauteed">["apple"]) | |
| print("fused str:", str(loc_single_attr)) | |
| # CHECK: fused repr: FusedLoc(loc(fused<"sauteed">["apple"])) | |
| print("fused repr:", repr(loc_single_attr)) | |
| # CHECK: fused locations: [NameLoc(loc("apple"))] | |
| print("fused locations:", loc_single_attr.locations) | |
| run(testFused) | |
| # CHECK-LABEL: TEST: testCast | |
| def testCast(): | |
| with Context() as ctx: | |
| unknown = UnknownLoc.get() | |
| as_unknown = UnknownLoc(unknown) | |
| assert isinstance(as_unknown, UnknownLoc) | |
| try: | |
| FileLineColLoc(unknown) | |
| except ValueError as e: | |
| # CHECK: cast error: Cannot cast location to FileLineColLoc (from loc(unknown)) | |
| print("cast error:", str(e)) | |
| else: | |
| assert False, "expected ValueError" | |
| ctx = None | |
| run(testCast) | |
| # CHECK-LABEL: TEST: testLocationCapsule | |
| def testLocationCapsule(): | |
| with Context() as ctx: | |
| loc1 = FileLineColLoc.get("foo.txt", 123, 56) | |
| # CHECK: mlir.ir.Location._CAPIPtr | |
| loc_capsule = loc1._CAPIPtr | |
| print(loc_capsule) | |
| loc2 = Location._CAPICreate(loc_capsule) | |
| assert loc2 == loc1 | |
| assert loc2.context is ctx | |
| run(testLocationCapsule) | |
| # CHECK-LABEL: TEST: testLocationFromDiagnostic | |
| def testLocationFromDiagnostic(): | |
| with Context() as ctx: | |
| def callback(d): | |
| assert isinstance(d.location, FileLineColLoc) | |
| assert isinstance(d.location, Location) | |
| # CHECK: filename: diagnostic_test.txt | |
| print("filename:", d.location.filename) | |
| # CHECK: line: 42 | |
| print("line:", d.location.start_line) | |
| # CHECK: col: 7 | |
| print("col:", d.location.start_col) | |
| return True | |
| ctx.attach_diagnostic_handler(callback) | |
| loc = FileLineColLoc.get("diagnostic_test.txt", 42, 7) | |
| loc.emit_error("test error message") | |
| run(testLocationFromDiagnostic) |