diff options
author | Mark Dickinson <mdickinson@enthought.com> | 2012-05-07 11:03:11 (GMT) |
---|---|---|
committer | Mark Dickinson <mdickinson@enthought.com> | 2012-05-07 11:03:11 (GMT) |
commit | 9fad1604110cd7a0bb32792aa6d6c6a63018d51e (patch) | |
tree | 6bed6f14f66a1ec3fb9fa30c70c97cdd05f9df90 | |
parent | 99e2e5552ab6a105b188273658784963bb9a915c (diff) | |
parent | cf360b92099d3ebcd31f637e45df501f393ff0b0 (diff) | |
download | cpython-9fad1604110cd7a0bb32792aa6d6c6a63018d51e.zip cpython-9fad1604110cd7a0bb32792aa6d6c6a63018d51e.tar.gz cpython-9fad1604110cd7a0bb32792aa6d6c6a63018d51e.tar.bz2 |
Issue #14701: Merge fix from 3.2.
-rw-r--r-- | Lib/test/test_parser.py | 8 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Modules/parsermodule.c | 23 |
3 files changed, 21 insertions, 12 deletions
diff --git a/Lib/test/test_parser.py b/Lib/test/test_parser.py index 46e7b9e..8eb3ee3 100644 --- a/Lib/test/test_parser.py +++ b/Lib/test/test_parser.py @@ -301,6 +301,14 @@ class RoundtripLegalSyntaxTestCase(unittest.TestCase): self.check_suite("[*a, *b] = y") self.check_suite("for [*x, b] in x: pass") + def test_raise_statement(self): + self.check_suite("raise\n") + self.check_suite("raise e\n") + self.check_suite("try:\n" + " suite\n" + "except Exception as e:\n" + " raise ValueError from e\n") + # # Second, we take *invalid* trees and make sure we get ParserError @@ -20,6 +20,8 @@ Core and Builtins Library ------- +- Issue #14701: Fix missing support for 'raise ... from' in parser module. + - Add support for timeouts to the acquire() methods of multiprocessing's lock/semaphore/condition proxies. diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index b4202aa..af14657 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -1611,31 +1611,30 @@ validate_return_stmt(node *tree) } +/* + * raise_stmt: + * + * 'raise' [test ['from' test]] + */ static int validate_raise_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, raise_stmt) - && ((nch == 1) || (nch == 2) || (nch == 4) || (nch == 6))); + && ((nch == 1) || (nch == 2) || (nch == 4))); + + if (!res && !PyErr_Occurred()) + (void) validate_numnodes(tree, 2, "raise"); if (res) { res = validate_name(CHILD(tree, 0), "raise"); if (res && (nch >= 2)) res = validate_test(CHILD(tree, 1)); - if (res && nch > 2) { - res = (validate_comma(CHILD(tree, 2)) + if (res && (nch == 4)) { + res = (validate_name(CHILD(tree, 2), "from") && validate_test(CHILD(tree, 3))); - if (res && (nch > 4)) - res = (validate_comma(CHILD(tree, 4)) - && validate_test(CHILD(tree, 5))); } } - else - (void) validate_numnodes(tree, 2, "raise"); - if (res && (nch == 4)) - res = (validate_comma(CHILD(tree, 2)) - && validate_test(CHILD(tree, 3))); - return (res); } |