mirror of
https://github.com/python/cpython.git
synced 2025-10-10 00:43:41 +00:00
bpo-39965: Correctly raise SyntaxError if await is used outside async functions when PyCF_ALLOW_TOP_LEVEL_AWAIT is set (GH-19010)
This commit is contained in:
parent
33238ec2af
commit
90235810ec
3 changed files with 49 additions and 4 deletions
|
@ -421,6 +421,44 @@ class BuiltinTest(unittest.TestCase):
|
|||
finally:
|
||||
asyncio.set_event_loop_policy(policy)
|
||||
|
||||
def test_compile_top_level_await_invalid_cases(self):
|
||||
# helper function just to check we can run top=level async-for
|
||||
async def arange(n):
|
||||
for i in range(n):
|
||||
yield i
|
||||
|
||||
modes = ('single', 'exec')
|
||||
code_samples = [
|
||||
'''def f(): await arange(10)\n''',
|
||||
'''def f(): [x async for x in arange(10)]\n''',
|
||||
'''def f(): [await x async for x in arange(10)]\n''',
|
||||
'''def f():
|
||||
async for i in arange(1):
|
||||
a = 1
|
||||
''',
|
||||
'''def f():
|
||||
async with asyncio.Lock() as l:
|
||||
a = 1
|
||||
'''
|
||||
]
|
||||
policy = maybe_get_event_loop_policy()
|
||||
try:
|
||||
for mode, code_sample in product(modes, code_samples):
|
||||
source = dedent(code_sample)
|
||||
with self.assertRaises(
|
||||
SyntaxError, msg=f"source={source} mode={mode}"):
|
||||
compile(source, '?', mode)
|
||||
|
||||
with self.assertRaises(
|
||||
SyntaxError, msg=f"source={source} mode={mode}"):
|
||||
co = compile(source,
|
||||
'?',
|
||||
mode,
|
||||
flags=ast.PyCF_ALLOW_TOP_LEVEL_AWAIT)
|
||||
finally:
|
||||
asyncio.set_event_loop_policy(policy)
|
||||
|
||||
|
||||
def test_compile_async_generator(self):
|
||||
"""
|
||||
With the PyCF_ALLOW_TOP_LEVEL_AWAIT flag added in 3.8, we want to
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue