gh-130080: do not fold match case constants in unoptimized AST (#131577)

This commit is contained in:
Irit Katriel 2025-03-23 13:50:14 +00:00 committed by GitHub
parent fd459b1153
commit 64906bb223
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 0 deletions

View file

@ -3238,6 +3238,18 @@ class ASTOptimiziationTests(unittest.TestCase):
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':

View file

@ -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: