https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100438

--- Comment #9 from H.J. Lu <hjl.tools at gmail dot com> ---
(In reply to Filipe Brandenburger from comment #8)
> 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?

Please try:

https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576603.html

on GCC master branch.  I can create a backport branch for GCC 11 if needed.

Reply via email to