gh-152708: Fix AST generation asymmetry for unary positive in match statements#152712
gh-152708: Fix AST generation asymmetry for unary positive in match statements#152712Twix1288 wants to merge 3 commits into
Conversation
|
Most changes to Python require a NEWS entry. Add one using the blurb_it web app or the blurb command-line tool. If this change has little impact on Python users, wait for a maintainer to apply the |
1 similar comment
|
Most changes to Python require a NEWS entry. Add one using the blurb_it web app or the blurb command-line tool. If this change has little impact on Python users, wait for a maintainer to apply the |
a3d05fc to
fe42b12
Compare
fe42b12 to
6a7d2f2
Compare
|
Does this affect the bytecode generated for this code? If so, we likely shouldn't change this in 3.15. |
|
Yeah, I'm 100% sure. Basically, the parser used to just silently drop the + in stuff like +1 in match cases, and now we make it properly keep it as a UnaryOp node. Then, in ast_preprocess.c, we just fold that node back into a plain number. Because the optimizer ends up seeing the exact same value it always did, it spits out the exact same LOAD_CONST bytecode. |
This PR fixes an asymmetry in AST generation where a unary positive in a pattern match expression (e.g.,
case +0:) was parsed directly as aConstant(implicitly dropping the+sign), whereas a unary negative (e.g.,case -0:) correctly generated aUnaryOp(USub, Constant). This led to round-trip parsing inconsistencies withast.unparse.Changes:
Grammar/python.gram: Updated the rules forsigned_number,signed_real_number, andimaginary_numberto retain+prefixes as_PyAST_UnaryOp(UAdd, ...), restoring parity with-behavior.Python/ast.c: Refactored the AST pattern matching validatorensure_literal_negativeintoensure_literal_signedto permit bothUSubandUAddunary operations in literal matching.Python/ast_preprocess.c: Added support for foldingUAddoperations recursively withinfold_const_match_patternsso that the compiler optimizer correctly resolves unary additions to positive constants without triggering compiler validation syntax errors.Fixes #148566
case +0:pattern, which is inconsistent. #152708