Commit 9dec0357 authored by Yury Selivanov's avatar Yury Selivanov

Issue #24528: Improve error message for awaits in comprehensions

parent 4a01cab8
...@@ -106,6 +106,16 @@ class AsyncBadSyntaxTest(unittest.TestCase): ...@@ -106,6 +106,16 @@ class AsyncBadSyntaxTest(unittest.TestCase):
with self.assertRaisesRegex(SyntaxError, 'invalid syntax'): with self.assertRaisesRegex(SyntaxError, 'invalid syntax'):
import test.badsyntax_async9 import test.badsyntax_async9
def test_badsyntax_10(self):
ns = {}
for comp in {'(await a for a in b)',
'[await a for a in b]',
'{await a for a in b}',
'{await a: c for a in b}'}:
with self.assertRaisesRegex( SyntaxError, 'await.*in comprehen'):
exec('async def f():\n\t{}'.format(comp), ns, ns)
class TokenizerRegrTest(unittest.TestCase): class TokenizerRegrTest(unittest.TestCase):
......
...@@ -3856,7 +3856,10 @@ compiler_visit_expr(struct compiler *c, expr_ty e) ...@@ -3856,7 +3856,10 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
if (c->u->u_ste->ste_type != FunctionBlock) if (c->u->u_ste->ste_type != FunctionBlock)
return compiler_error(c, "'await' outside function"); return compiler_error(c, "'await' outside function");
/* this check won't be triggered while we have AWAIT token */ if (c->u->u_scope_type == COMPILER_SCOPE_COMPREHENSION)
return compiler_error(
c, "'await' expressions in comprehensions are not supported");
if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION) if (c->u->u_scope_type != COMPILER_SCOPE_ASYNC_FUNCTION)
return compiler_error(c, "'await' outside async function"); return compiler_error(c, "'await' outside async function");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment