Issue 6012 proposes to add cleanup support for O& converters; a first client for this would be PyUnicode_FSConverter. Using cleanup is always necessary if the conversion function allocates memory, and a later argument converter fails. The memory allocated must then be released.
There are three options currently to provide such a function: 1. Make a code O&& with two function pointers. I find that too tedious to use. 2. Introduce a new code O$, that takes a O&-style function which, in addition, can also be called with a NULL PyObject*, meaning that it should cleanup. 3. Extend O& so that its function pointers also support the cleanup mode (NULL first argument). Conversion functions that need cleanup would have to return a special constant rather than the usual value of 1.
In addition, there is also the approach introduced in issue 5990: 4. Users of a conversion function that requires cleanup need to initialize the output pointer to NULL, and then release memory explicitly when the argument conversion fails.
Which of these do you like best?