summaryrefslogtreecommitdiff
path: root/Python/symtable.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/symtable.c')
-rw-r--r--Python/symtable.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/Python/symtable.c b/Python/symtable.c
index 55815c91cc..bbac25cf37 100644
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -1734,7 +1734,6 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,
e->lineno, e->col_offset)) {
return 0;
}
- st->st_cur->ste_generator = is_generator;
if (outermost->is_async) {
st->st_cur->ste_coroutine = 1;
}
@@ -1754,6 +1753,36 @@ symtable_handle_comprehension(struct symtable *st, expr_ty e,
if (value)
VISIT(st, expr, value);
VISIT(st, expr, elt);
+ if (st->st_cur->ste_generator) {
+ PyObject *msg = PyUnicode_FromString(
+ (e->kind == ListComp_kind) ? "'yield' inside list comprehension" :
+ (e->kind == SetComp_kind) ? "'yield' inside set comprehension" :
+ (e->kind == DictComp_kind) ? "'yield' inside dict comprehension" :
+ "'yield' inside generator expression");
+ if (msg == NULL) {
+ symtable_exit_block(st, (void *)e);
+ return 0;
+ }
+ if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning,
+ msg, st->st_filename, st->st_cur->ste_lineno,
+ NULL, NULL) == -1)
+ {
+ if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
+ /* Replace the DeprecationWarning exception with a SyntaxError
+ to get a more accurate error report */
+ PyErr_Clear();
+ PyErr_SetObject(PyExc_SyntaxError, msg);
+ PyErr_SyntaxLocationObject(st->st_filename,
+ st->st_cur->ste_lineno,
+ st->st_cur->ste_col_offset);
+ }
+ Py_DECREF(msg);
+ symtable_exit_block(st, (void *)e);
+ return 0;
+ }
+ Py_DECREF(msg);
+ }
+ st->st_cur->ste_generator |= is_generator;
return symtable_exit_block(st, (void *)e);
}