There are custom Argument Clinic converters that define `format_unit` but omit `parse_arg`. As a result, generation of positional argument parsers is forced to back up from the fastest possible `_PyArg_CheckPositional` to slower `_PyArg_ParseStack`-based format strings. Here is a list of such classes (and fixing PRs except complex cases): - [x] Modules\\_multiprocessing\multiprocessing.c (gh-94517) - HANDLE_converter - [ ] Modules\\_multiprocessing\semaphore.c - SEM_HANDLE_converter - [x] Modules\overlapped.c (gh-94516) - OVERLAPPED_converter - HANDLE_converter - ULONG_PTR_converter - DWORD_converter - BOOL_converter - [x] Modules\posixmodule.c (gh-122516) - pid_t_converter - idtype_t_converter - id_t_converter - intptr_t_converter - Py_off_t_converter - [x] Modules\resource.c (gh-94515) - pid_t_converter - [x] PC\msvcrtmodule.c (gh-94514) - HANDLE_converter - [x] PC\winreg.c (gh-94513) - REGSAM_converter - DWORD_converter - HKEY_converter An example of such a converter: ```cpp class BOOL_converter(CConverter): type = 'BOOL' format_unit = 'i' class pid_t_converter(CConverter): type = 'pid_t' format_unit = '" _Py_PARSE_PID "' ``` I'm going to teach all of them about low-level generation by replacing manual `format_unit` definitions with: - inheritance from a corresponding builtin converter where possible - and custom `parse_arg`s in other places. For the example it gives: ```cpp class BOOL_converter(int_converter): type = 'BOOL' class pid_t_converter(CConverter): type = 'pid_t' # Left as a backup for potential complex cases format_unit = '" _Py_PARSE_PID "' def parse_arg(self, argname, displayname): return """ {paramname} = PyLong_AsPid({argname}); if ({paramname} == -1 && PyErr_Occurred()) {{{{ goto exit; }}}} """.format(argname=argname, paramname=self.parser_name) ```