bpo-39965: Correctly raise SyntaxError if await is used outside async functions when PyCF_ALLOW_TOP_LEVEL_AWAIT is set (GH-19010)
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index e50c273..d6b9ee1 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -421,6 +421,44 @@
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