From 227f97f8a3272788073b567a626730a6fe7fb06f Mon Sep 17 00:00:00 2001 From: whitequark Date: Thu, 16 Jul 2015 04:21:21 +0300 Subject: [PATCH] Add inference for Index, Slice and ExtSlice. --- artiq/compiler/transforms/inferencer.py | 31 ++++++++++++++++++- .../compiler/inferencer/error_subscript.py | 10 ++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lit-test/compiler/inferencer/error_subscript.py diff --git a/artiq/compiler/transforms/inferencer.py b/artiq/compiler/transforms/inferencer.py index 869b87340..7fbf09813 100644 --- a/artiq/compiler/transforms/inferencer.py +++ b/artiq/compiler/transforms/inferencer.py @@ -108,9 +108,38 @@ class Inferencer(algorithm.Visitor): collection.loc, []) self.engine.process(diag) + def visit_Index(self, node): + value = node.value + if types.is_tuple(value.type): + diag = diagnostic.Diagnostic("error", + "multi-dimensional slices are not supported", {}, + node.loc, []) + self.engine.process(diag) + else: + self._unify(value.type, builtins.TInt(), + value.loc, None) + + def visit_Slice(self, node): + for operand in (node.lower, node.upper, node.step): + if operand is not None: + self._unify(operand.type, builtins.TInt(), + operand.loc, None) + + def visit_ExtSlice(self, node): + diag = diagnostic.Diagnostic("error", + "multi-dimensional slices are not supported", {}, + node.loc, []) + self.engine.process(diag) + def visit_SubscriptT(self, node): self.generic_visit(node) - self._unify_iterable(element=node, collection=node.value) + if isinstance(node.slice, ast.Index): + self._unify_iterable(element=node, collection=node.value) + elif isinstance(node.slice, ast.Slice): + self._unify(node.type, node.value.type, + node.loc, node.value.loc) + else: # ExtSlice + pass # error emitted above def visit_IfExpT(self, node): self.generic_visit(node) diff --git a/lit-test/compiler/inferencer/error_subscript.py b/lit-test/compiler/inferencer/error_subscript.py new file mode 100644 index 000000000..0aadb3289 --- /dev/null +++ b/lit-test/compiler/inferencer/error_subscript.py @@ -0,0 +1,10 @@ +# RUN: %python -m artiq.compiler.testbench.inferencer +diag %s >%t +# RUN: OutputCheck %s --file-to-check=%t + +x = [] + +# CHECK-L: ${LINE:+1}: error: multi-dimensional slices are not supported +x[1,2] + +# CHECK-L: ${LINE:+1}: error: multi-dimensional slices are not supported +x[1:2,3:4]