From a642928e558e383483cfdfe236faff9d63d057fe Mon Sep 17 00:00:00 2001 From: BobTheBuidler Date: Thu, 2 Oct 2025 01:04:56 +0000 Subject: [PATCH 1/3] [mypyc] feat: support constant folding in `ExpressionChecker.check_str_format_call` --- mypy/checkexpr.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 73282c94be4e..480b87502b8d 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -659,8 +659,9 @@ def check_str_format_call(self, e: CallExpr) -> None: """More precise type checking for str.format() calls on literals.""" assert isinstance(e.callee, MemberExpr) format_value = None - if isinstance(e.callee.expr, StrExpr): - format_value = e.callee.expr.value + folded_callee_expr = constant_fold_expr(e.callee.expr, "unused") + if isinstance(folded_callee_expr, str): + format_value = folded_callee_expr elif self.chk.has_type(e.callee.expr): typ = get_proper_type(self.chk.lookup_type(e.callee.expr)) if ( From 1f894a9c904b6aecebec4c5ab5a0bab1a9184a38 Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Wed, 1 Oct 2025 21:26:23 -0400 Subject: [PATCH 2/3] Update checkexpr.py --- mypy/checkexpr.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 480b87502b8d..5204912d939f 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -18,6 +18,7 @@ from mypy.checker_shared import ExpressionCheckerSharedApi from mypy.checkmember import analyze_member_access, has_operator from mypy.checkstrformat import StringFormatterChecker +from mypy.constant_fold import constant_fold_expr from mypy.erasetype import erase_type, remove_instance_last_known_values, replace_meta_vars from mypy.errors import ErrorInfo, ErrorWatcher, report_internal_error from mypy.expandtype import ( @@ -659,7 +660,7 @@ def check_str_format_call(self, e: CallExpr) -> None: """More precise type checking for str.format() calls on literals.""" assert isinstance(e.callee, MemberExpr) format_value = None - folded_callee_expr = constant_fold_expr(e.callee.expr, "unused") + folded_callee_expr = constant_fold_expr(e.callee.expr, "") if isinstance(folded_callee_expr, str): format_value = folded_callee_expr elif self.chk.has_type(e.callee.expr): From c21bb26154a28bdf476873689e467122ce639aed Mon Sep 17 00:00:00 2001 From: BobTheBuidler <70677534+BobTheBuidler@users.noreply.github.com> Date: Wed, 1 Oct 2025 21:29:47 -0400 Subject: [PATCH 3/3] Update checkexpr.py --- mypy/checkexpr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy/checkexpr.py b/mypy/checkexpr.py index 5204912d939f..b8f9bf087467 100644 --- a/mypy/checkexpr.py +++ b/mypy/checkexpr.py @@ -657,7 +657,7 @@ def visit_call_expr_inner(self, e: CallExpr, allow_none_return: bool = False) -> return ret_type def check_str_format_call(self, e: CallExpr) -> None: - """More precise type checking for str.format() calls on literals.""" + """More precise type checking for str.format() calls on literals and folded constants.""" assert isinstance(e.callee, MemberExpr) format_value = None folded_callee_expr = constant_fold_expr(e.callee.expr, "")