diff --git a/vyper/builtins/_signatures.py b/vyper/builtins/_signatures.py index f955296ee0..0c65a0756f 100644 --- a/vyper/builtins/_signatures.py +++ b/vyper/builtins/_signatures.py @@ -83,6 +83,7 @@ class BuiltinFunctionT(VyperType): _has_varargs = False _inputs: list[tuple[str, Any]] = [] _kwargs: dict[str, KwargSettings] = {} + _modifiability: Modifiability = Modifiability.MODIFIABLE _return_type: Optional[VyperType] = None # helper function to deal with TYPE_DEFINITIONs diff --git a/vyper/builtins/functions.py b/vyper/builtins/functions.py index a924a56010..2843b567e1 100644 --- a/vyper/builtins/functions.py +++ b/vyper/builtins/functions.py @@ -49,7 +49,7 @@ UnfoldableNode, ZeroDivisionException, ) -from vyper.semantics.analysis.base import VarInfo +from vyper.semantics.analysis.base import Modifiability, VarInfo from vyper.semantics.analysis.utils import ( get_common_types, get_exact_type_from_node, @@ -105,9 +105,8 @@ class FoldedFunctionT(BuiltinFunctionT): # Base class for nodes which should always be folded - # Since foldable builtin functions are not folded before semantics validation, - # this flag is used for `check_modifiability` in semantics validation. - _kwargable = True + # This flag is used for `check_modifiability` in semantics validation. + _modifiability = Modifiability.ALWAYS_CONSTANT class TypenameFoldedFunctionT(FoldedFunctionT): diff --git a/vyper/semantics/analysis/utils.py b/vyper/semantics/analysis/utils.py index a7b62b9a7a..ebc4f27e84 100644 --- a/vyper/semantics/analysis/utils.py +++ b/vyper/semantics/analysis/utils.py @@ -648,8 +648,8 @@ def check_modifiability(node: vy_ast.VyperNode, modifiability: Modifiability) -> return all(check_modifiability(v, modifiability) for v in args[0].values) call_type = get_exact_type_from_node(node.func) - if getattr(call_type, "_kwargable", False): - return True + call_type_modifiability = getattr(call_type, "_modifiability", Modifiability.MODIFIABLE) + return call_type_modifiability >= modifiability value_type = get_expr_info(node) return value_type.modifiability >= modifiability