https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100438
Filipe Brandenburger <filbranden at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |filbranden at gmail dot com
--- Comment #8 from Filipe Brandenburger <filbranden at gmail dot com> ---
We encountered an issue due to the introduction of the `_serialize()` define in
the build of the fbthrift package on GCC 11 (Fedora 34/35.)
The error we get is coming from Cython code in a *.pyx file, which gets
compiled to *.cpp and then compiled. Note that the name `_serialize` in this
context is coming from Python code conventions, where this particular name is
the most appropriate for its particular situation (the `_` indicating a
protected method.)
Also interesting is that the error we're seeing is actually in a method *call*
and not even a function definition!
Backtrace here:
```
/builddir/build/BUILD/fbthrift-2021.06.28.00/x86_64-redhat-linux-gnu/thrift/lib/py3/cybld/thrift/py3/serializer.cpp:3482:154:
error: macro "_serialize" passed 2 arguments, but takes just 0
3482 | __pyx_t_1 = ((PyObject *)((struct
__pyx_vtabstruct_6thrift_3py3_5types_Struct
*)__pyx_v_cy_struct->__pyx_vtab)->_serialize(__pyx_v_cy_struct, __pyx_t_5)); if
(unlikely(!__pyx_t_1)) __PYX_ERR(0, 30, __pyx_L1_error)
|
^
In file included from
/usr/lib/gcc/x86_64-redhat-linux/11/include/x86gprintrin.h:71,
from
/usr/lib/gcc/x86_64-redhat-linux/11/include/immintrin.h:27,
from /usr/include/folly/container/detail/F14Table.h:74,
from /usr/include/folly/container/detail/F14Policy.h:28,
from /usr/include/folly/container/F14Map.h:42,
from /usr/include/folly/io/async/Request.h:26,
from /usr/include/folly/io/async/AsyncTimeout.h:23,
from /usr/include/folly/io/async/HHWheelTimer.h:28,
from /usr/include/folly/fibers/Baton.h:24,
from /usr/include/folly/futures/Future.h:36,
from
/builddir/build/BUILD/fbthrift-2021.06.28.00/x86_64-redhat-linux-gnu/thrift/lib/py3/cybld/thrift/py3/serializer.cpp:645:
/usr/lib/gcc/x86_64-redhat-linux/11/include/serializeintrin.h:37: note: macro
"_serialize" defined here
37 | #define _serialize() __builtin_ia32_serialize ()
|
```
This is coming from the F14Map.h header from folly, which defines a map
container type. That header file includes intrinsics in order to use a __m128i
type definition.
It's very unfortunate that intrinsics produce this kind of namespace pollution
and that this particular one was defined with a name that's not uncommon enough
not to cause real world problems.
At the very least, can this particular case be changed from a `#define` to a
`static inline void _serialize() { __builtin_ia32_serialize(); }` so that it
only clashes with a `_serialize()` name defined in the top-level?
For C++ code, would it be possible to have a C++ version of intrinsics headers
that would define them inside a C++ namespace, so that it would be easy to
introduce new intrinsics without further polluting the main namespace?
Thanks!
Filipe