On Thu, Sep 8, 2016, at 04:09, Christian Heimes wrote:
On 2016-09-07 17:47, benjamin.peterson wrote:
https://hg.python.org/cpython/rev/234f758449f8 changeset: 103223:234f758449f8 branch: 3.5 parent: 103213:7537ca1c2aaf user: Benjamin Peterson
date: Wed Sep 07 08:46:59 2016 -0700 summary: supress coroutine warning when an exception is pending (#27968) files: Objects/genobject.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/Objects/genobject.c b/Objects/genobject.c --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -21,7 +21,7 @@ _PyGen_Finalize(PyObject *self) { PyGenObject *gen = (PyGenObject *)self; - PyObject *res; + PyObject *res = NULL; PyObject *error_type, *error_value, *error_traceback;
if (gen->gi_frame == NULL || gen->gi_frame->f_stacktop == NULL) @@ -33,23 +33,26 @@
/* If `gen` is a coroutine, and if it was never awaited on, issue a RuntimeWarning. */ - if (gen->gi_code != NULL - && ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE - && gen->gi_frame->f_lasti == -1 - && !PyErr_Occurred() - && PyErr_WarnFormat(PyExc_RuntimeWarning, 1, - "coroutine '%.50S' was never awaited", - gen->gi_qualname)) { - res = NULL; /* oops, exception */ + if (gen->gi_code != NULL && + ((PyCodeObject *)gen->gi_code)->co_flags & CO_COROUTINE && + gen->gi_frame->f_lasti == -1) { + if (!error_value) { + PyErr_WarnFormat(PyExc_RuntimeWarning, 1, + "coroutine '%.50S' was never awaited", + gen->gi_qualname); + }
You don't check the return value of PyErr_WarnFormat(). It does not signal an exception in case warnings are turned into exceptions.
It's checked by PyErr_Occurred() several lines later.