diff --git a/vyper/builtins/_signatures.py b/vyper/builtins/_signatures.py index 6e6cf4c662..29a35e63e3 100644 --- a/vyper/builtins/_signatures.py +++ b/vyper/builtins/_signatures.py @@ -6,7 +6,7 @@ from vyper.codegen.expr import Expr from vyper.codegen.ir_node import IRnode from vyper.exceptions import CompilerPanic, TypeMismatch, UnfoldableNode -from vyper.semantics.analysis.base import Modifiability +from vyper.semantics.analysis.base import Modifiability, StateMutability from vyper.semantics.analysis.utils import ( check_modifiability, get_exact_type_from_node, @@ -87,6 +87,7 @@ class BuiltinFunctionT(VyperType): _return_type: Optional[VyperType] = None _equality_attrs = ("_id",) _is_terminus = False + mutability: StateMutability = StateMutability.PURE @property def modifiability(self): diff --git a/vyper/semantics/analysis/local.py b/vyper/semantics/analysis/local.py index 88cf153406..3fb66f8516 100644 --- a/vyper/semantics/analysis/local.py +++ b/vyper/semantics/analysis/local.py @@ -742,8 +742,8 @@ def visit_Call(self, node: vy_ast.Call, typ: VyperType) -> None: for arg, arg_type in zip(node.args, func_type.arg_types): self.visit(arg, arg_type) else: - # builtin functions - if self.function_analyzer: + # builtin functions and interfaces + if self.function_analyzer and hasattr(func_type, "mutability"): self._check_call_mutability(func_type.mutability) # type: ignore arg_types = func_type.infer_arg_types(node, expected_return_typ=typ) # type: ignore