def _get(self, node):
        self.em.pl("; %s:" % getattr(node, "lineno", "??") + " " + ast_utils.format_node(node))
        self.em.indent(2)
        r = self._evaluate(node)
        self.em.pl("; end" + " " + ast_utils.format_node(node))
        self.em.indent(-2)

        # Skip generated nodes since they're not in the type inference (TODO are there cases that that could break?)
        # and skip several classes of things that can't always be converted
        if not hasattr(node, "not_real") and not isinstance(r.t, (UnboxedFunctionMT, _SpecialFuncMT, PolymorphicFunctionMT, UnboxedInstanceMethod, CallableMT, ModuleMT, ListMT.ListIteratorMT, DictMT.DictIteratorMT, ClassMT)):
            expected_type = self._type_info.get_expr_type(self.em, node)
            if not (expected_type is r.t or expected_type is r.t.get_instantiated()):
                assert r.t.can_convert_to(expected_type), (expected_type, r.t)
                r = r.convert_to(self.em, expected_type)

        return r