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)