From 82ab21dbd54ee479f968b26cc8e349a8edca27f5 Mon Sep 17 00:00:00 2001 From: whitequark Date: Fri, 18 Mar 2016 01:22:01 +0000 Subject: [PATCH] transforms.inferencer: better message for BinOpT unification. Fixes #311. --- artiq/compiler/transforms/inferencer.py | 36 ++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/artiq/compiler/transforms/inferencer.py b/artiq/compiler/transforms/inferencer.py index bbc42ae6f..69465c0d7 100644 --- a/artiq/compiler/transforms/inferencer.py +++ b/artiq/compiler/transforms/inferencer.py @@ -446,8 +446,42 @@ class Inferencer(algorithm.Visitor): return_type, left_type, right_type = coerced node.left = self._coerce_one(left_type, node.left, other_node=node.right) node.right = self._coerce_one(right_type, node.right, other_node=node.left) + + def makenotes(printer, typea, typeb, loca, locb): + def makenote(typ, coerced, loc): + if typ == coerced: + return diagnostic.Diagnostic("note", + "expression of type {type}", + {"type": printer.name(typ)}, + loc) + else: + return diagnostic.Diagnostic("note", + "expression of type {typea} (coerced to {typeb})", + {"typea": printer.name(typ), + "typeb": printer.name(coerced)}, + loc) + + if node.type == return_type: + note = diagnostic.Diagnostic("note", + "expression of type {type}", + {"type": printer.name(typea)}, + loca) + else: + note = diagnostic.Diagnostic("note", + "expression of type {typea} (but {typeb} was expected)", + {"typea": printer.name(typea), + "typeb": printer.name(typeb)}, + loca) + + return [ + makenote(node.left.type, left_type, node.left.loc), + makenote(node.right.type, right_type, node.right.loc), + note + ] + self._unify(node.type, return_type, - node.loc, None) + node.loc, None, + makenotes=makenotes) def visit_CompareT(self, node): self.generic_visit(node)