blob: 3a9d98e1f7214555a750ed509f6ad7f56b708681 [file]
# 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)