New submission from Vitaliy <numz...@yandex.ru>:

There is a lot of macros like:
    #define PyObject_TypeCheck(ob, tp) \
    (Py_IS_TYPE(ob, tp) || PyType_IsSubtype(Py_TYPE(ob), (tp)))
These work fine until an argument happen to contain a comma. That’s possible as 
a result of other macro’s expansion. E.g. if U(x) is defined as x,
    PyObject_TypeCheck(ob, U(f<a,b>(c)))
expands to
    (Py_IS_TYPE(ob, f<a,b>(c)) || ...)
but < and > aren’t treated as brackets by the preprocessor so Py_IS_TYPE is now 
invoked with 3 arguments instead of just 2, breaking module compilation.

As arguments are expected to be values, surrounding each with parentheses 
solves the problem. But there are many such macros so that’s not an one-line 
fix.

Note: the example is from PyGLM (simplified), it doesn’t compile on 3.9 due to 
this issue.

----------
components: C API
messages: 386746
nosy: numberZero
priority: normal
severity: normal
status: open
title: Python macros don’t shield arguments
versions: Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue43181>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to