Skip to content

Commit 4e6d8ca

Browse files
authored
fix: method inference should resolve on tuple type (#356)
fix #321
1 parent 8bdf10b commit 4e6d8ca

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

src/kirin/dialects/func/typeinfer.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Iterable, cast
1+
from typing import Iterable
22

33
from kirin import ir, types
44
from kirin.interp import Frame, MethodTable, ReturnValue, impl
@@ -38,7 +38,7 @@ def return_(
3838
def call(self, interp: TypeInference, frame: Frame, stmt: Call):
3939
# give up on dynamic method calls
4040
mt = interp.maybe_const(stmt.callee, ir.Method)
41-
if mt is None:
41+
if mt is None: # not a constant method
4242
return self._solve_method_type(interp, frame, stmt)
4343
return self._invoke_method(
4444
interp,
@@ -57,16 +57,14 @@ def _solve_method_type(self, interp: TypeInference, frame: Frame, stmt: Call):
5757

5858
if len(mt_inferred.vars) != 2:
5959
return (types.Bottom,)
60-
6160
args = mt_inferred.vars[0]
6261
result = mt_inferred.vars[1]
6362
if not args.is_subseteq(types.Tuple):
6463
return (types.Bottom,)
6564

6665
resolve = TypeResolution()
67-
args = cast(types.Generic, args)
68-
for arg, value in zip(args.vars, frame.get_values(stmt.inputs)):
69-
resolve.solve(arg, value)
66+
# NOTE: we are not using [...] below to be compatible with 3.10
67+
resolve.solve(args, types.Tuple.where(frame.get_values(stmt.inputs)))
7068
return (resolve.substitute(result),)
7169

7270
@impl(Invoke)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from kirin import types
2+
from kirin.prelude import structural_no_opt
3+
from kirin.analysis import TypeInference
4+
5+
6+
def test_self_ref_closure():
7+
8+
@structural_no_opt
9+
def should_work(n_qubits: int):
10+
def self_ref_source(i_layer):
11+
stride = n_qubits // (2**i_layer)
12+
if stride == 0:
13+
return
14+
15+
self_ref_source(i_layer + 1)
16+
17+
return self_ref_source
18+
19+
infer = TypeInference(structural_no_opt)
20+
_, ret = infer.run_analysis(should_work, (types.Int,))
21+
assert ret.is_equal(types.MethodType[types.Tuple[types.Any], types.NoneType])

0 commit comments

Comments
 (0)