diff --git a/mypyc/irbuild/format_str_tokenizer.py b/mypyc/irbuild/format_str_tokenizer.py index 2596e8e050a6..2a4212b55a6d 100644 --- a/mypyc/irbuild/format_str_tokenizer.py +++ b/mypyc/irbuild/format_str_tokenizer.py @@ -53,9 +53,9 @@ def generate_format_ops(specifiers: list[ConversionSpecifier]) -> list[FormatOp] format_ops = [] for spec in specifiers: # TODO: Match specifiers instead of using whole_seq - if spec.whole_seq == "%s" or spec.whole_seq == "{:{}}": + if spec.whole_seq == "%s" or spec.whole_seq in ("{:{}}", ":s"): format_op = FormatOp.STR - elif spec.whole_seq == "%d": + elif spec.whole_seq in ("%d", ":d"): format_op = FormatOp.INT elif spec.whole_seq == "%b": format_op = FormatOp.BYTES diff --git a/mypyc/test-data/irbuild-constant-fold.test b/mypyc/test-data/irbuild-constant-fold.test index 009a4e68f678..19382ebb08db 100644 --- a/mypyc/test-data/irbuild-constant-fold.test +++ b/mypyc/test-data/irbuild-constant-fold.test @@ -192,9 +192,16 @@ L0: from typing import Any, Final FMT: Final = "{} {}" +FMT_D: Final = "{:d} {:s}" +FMT_S: Final = "{:s} {:s}" def f() -> str: return FMT.format(400 + 20, "roll" + "up") +def g() -> str: + return FMT_D.format(400 + 20, "roll" + "up") +def h() -> str: + return FMT_S.format(400 + 20, "roll" + "up") + [out] def f(): r0, r1, r2, r3 :: str @@ -204,6 +211,22 @@ L0: r2 = ' ' r3 = CPyStr_Build(3, r0, r2, r1) return r3 +def g(): + r0, r1, r2, r3 :: str +L0: + r0 = '420' + r1 = 'rollup' + r2 = ' ' + r3 = CPyStr_Build(3, r0, r2, r1) + return r3 +def h(): + r0, r1, r2, r3 :: str +L0: + r0 = CPyTagged_Str(840) + r1 = 'rollup' + r2 = ' ' + r3 = CPyStr_Build(3, r0, r2, r1) + return r3 [case testIntConstantFoldingFinal] from typing import Final