https://github.com/python/cpython/commit/64906bb22373dc58b88863424ceef07193b776b0
commit: 64906bb22373dc58b88863424ceef07193b776b0
branch: main
author: Irit Katriel <[email protected]>
committer: iritkatriel <[email protected]>
date: 2025-03-23T13:50:14Z
summary:
gh-130080: do not fold match case constants in unoptimized AST (#131577)
files:
M Lib/test/test_ast/test_ast.py
M Python/ast_opt.c
diff --git a/Lib/test/test_ast/test_ast.py b/Lib/test/test_ast/test_ast.py
index 1b108ceddb1c11..e5fd8f6a295ed2 100644
--- a/Lib/test/test_ast/test_ast.py
+++ b/Lib/test/test_ast/test_ast.py
@@ -3238,6 +3238,18 @@ def get_match_case_values(node):
values = get_match_case_values(case.pattern)
self.assertListEqual(constants, values)
+ def test_match_case_not_folded_in_unoptimized_ast(self):
+ src = textwrap.dedent("""
+ match a:
+ case 1+2j:
+ pass
+ """)
+
+ unfolded = "MatchValue(value=BinOp(left=Constant(value=1), op=Add(),
right=Constant(value=2j))"
+ folded = "MatchValue(value=Constant(value=(1+2j)))"
+ for optval in (0, 1, 2):
+ self.assertIn(folded if optval else unfolded,
ast.dump(ast.parse(src, optimize=optval)))
+
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update':
diff --git a/Python/ast_opt.c b/Python/ast_opt.c
index 8ee322fdd15197..99a2418da46e35 100644
--- a/Python/ast_opt.c
+++ b/Python/ast_opt.c
@@ -824,6 +824,9 @@ astfold_withitem(withitem_ty node_, PyArena *ctx_,
_PyASTOptimizeState *state)
static int
fold_const_match_patterns(expr_ty node, PyArena *ctx_, _PyASTOptimizeState
*state)
{
+ if (state->syntax_check_only) {
+ return 1;
+ }
switch (node->kind)
{
case UnaryOp_kind:
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]