Skip to content

Argument Clinic does not increase NoneType refcount when returning NoneType from a function with no parameters #95007

Closed
@noamcohen97

Description

@noamcohen97

Bug report

/*[clinic input]
function -> NoneType
[clinic start generated code]*/

will produce this function:

static PyObject *
function(PyObject *module, PyObject *Py_UNUSED(ignored))
{
    return function_impl(module);
}

while function_impl returns Py_None (as it should, if using NoneType return converter), refcount is not increased.

here is a working example of NoneType return converter:

/*[clinic input]
function -> NoneType

    a: int
    /
[clinic start generated code]*/
static PyObject *
function(PyObject *module, PyObject *arg)
{
    PyObject *return_value = NULL;
    int a;
    PyObject *_return_value;

    a = _PyLong_AsInt(arg);
    if (a == -1 && PyErr_Occurred()) {
        goto exit;
    }
    _return_value = function_impl(module, a);
    if (_return_value != Py_None) {
        goto exit;
    }
    return_value = Py_None;
    Py_INCREF(Py_None);

exit:
    return return_value;
}

Generation also fails when generating a function with a single object parameter.

It seems like the problem is with default_return_converter in clinic.py, being set to True

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions