mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
bpo-37830: Fix compilation of break and continue in finally. (GH-15320)
Fix compilation of "break" and "continue" in the "finally" block when the corresponding "try" block contains "return" with a non-constant value.
This commit is contained in:
parent
e9c90aa431
commit
ef61c524dd
11 changed files with 305 additions and 194 deletions
|
@ -991,6 +991,60 @@ class GrammarTests(unittest.TestCase):
|
|||
return 4
|
||||
self.assertEqual(g3(), 4)
|
||||
|
||||
def test_break_in_finally_after_return(self):
|
||||
# See issue #37830
|
||||
def g1(x):
|
||||
for count in [0, 1]:
|
||||
count2 = 0
|
||||
while count2 < 20:
|
||||
count2 += 10
|
||||
try:
|
||||
return count + count2
|
||||
finally:
|
||||
if x:
|
||||
break
|
||||
return 'end', count, count2
|
||||
self.assertEqual(g1(False), 10)
|
||||
self.assertEqual(g1(True), ('end', 1, 10))
|
||||
|
||||
def g2(x):
|
||||
for count in [0, 1]:
|
||||
for count2 in [10, 20]:
|
||||
try:
|
||||
return count + count2
|
||||
finally:
|
||||
if x:
|
||||
break
|
||||
return 'end', count, count2
|
||||
self.assertEqual(g2(False), 10)
|
||||
self.assertEqual(g2(True), ('end', 1, 10))
|
||||
|
||||
def test_continue_in_finally_after_return(self):
|
||||
# See issue #37830
|
||||
def g1(x):
|
||||
count = 0
|
||||
while count < 100:
|
||||
count += 1
|
||||
try:
|
||||
return count
|
||||
finally:
|
||||
if x:
|
||||
continue
|
||||
return 'end', count
|
||||
self.assertEqual(g1(False), 1)
|
||||
self.assertEqual(g1(True), ('end', 100))
|
||||
|
||||
def g2(x):
|
||||
for count in [0, 1]:
|
||||
try:
|
||||
return count
|
||||
finally:
|
||||
if x:
|
||||
continue
|
||||
return 'end', count
|
||||
self.assertEqual(g2(False), 0)
|
||||
self.assertEqual(g2(True), ('end', 1))
|
||||
|
||||
def test_yield(self):
|
||||
# Allowed as standalone statement
|
||||
def g(): yield 1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue