From 34828461da1b65ac4636b12402584d007e8f2c94 Mon Sep 17 00:00:00 2001 From: tserg <8017125+tserg@users.noreply.github.com> Date: Fri, 3 Nov 2023 10:05:32 +0800 Subject: [PATCH] demo moving typechecking --- vyper/ast/nodes.py | 6 ++---- vyper/semantics/analysis/local.py | 4 ++++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/vyper/ast/nodes.py b/vyper/ast/nodes.py index 3e753cae2d..ffd442f89a 100644 --- a/vyper/ast/nodes.py +++ b/vyper/ast/nodes.py @@ -979,13 +979,11 @@ def evaluate(self, left, right) -> ExprNode: raise UnfoldableNode("Node contains invalid field(s) for evaluation") # this validation is performed to prevent the compiler from hanging - # on very large shifts and improve the error message for negative - # values. + # on very large shifts. the actual error is handled downstream. if isinstance(self.op, (LShift, RShift)) and not (0 <= right.value <= 256): - raise InvalidLiteral("Shift bits must be between 0 and 256", right) + raise UnfoldableNode value = self.op._op(left.value, right.value) - _validate_numeric_bounds(self, value) return type(left).from_node(self, value=value) diff --git a/vyper/semantics/analysis/local.py b/vyper/semantics/analysis/local.py index 9cdd32e339..b865c8461a 100644 --- a/vyper/semantics/analysis/local.py +++ b/vyper/semantics/analysis/local.py @@ -635,7 +635,11 @@ def visit_BinOp(self, node: vy_ast.BinOp, typ: VyperType) -> None: self.visit(node.left, typ) rtyp = typ + right = get_folded_value(node.right) if isinstance(node.op, (vy_ast.LShift, vy_ast.RShift)): + if isinstance(right, vy_ast.Int) and not (0 <= right.value <= 256): + raise InvalidLiteral("Shift bits must be between 0 and 256", right) + rtyp = get_possible_types_from_node(node.right).pop() validate_expected_type(node.right, rtyp)