Skip to content

Commit e06aab3

Browse files
committed
gh-160704: Restore C11-C17 static_assert fallback
`_Py_STDC_VERSION` needs to be defined before its value can be checked. In 8335bcb (gh-160208: Add a private wrapper around __STDC_VERSION__ (GH-160376), 2026-10-23), the condition `defined(_Py_STDC_VERSION)` is incorrectly negated, which prevents the fallback definition of `static_assert` in C11-C17 builds and causes a build error when building with an old C library that does not define `static_assert`. Below is an example when building CPython 3.15.2 with glibc 2.13: gcc -pthread -c -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -std=c11 -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wstrict-prototypes -Werror=implicit-function-declaration -fvisibility=hidden -I/usr/local/src/python/Include/internal -I/usr/local/src/python/Include/internal/mimalloc -IObjects -IInclude -IPython -I. -I/usr/local/src/python/Include -DPy_BUILD_CORE -o Objects/longobject.o /usr/local/src/python/Objects/longobject.c In file included from /usr/local/src/python/Include/Python.h:70, from /usr/local/src/python/Objects/longobject.c:5: /usr/local/src/python/Include/internal/pycore_bitutils.h: In function '_Py_popcount32': /usr/local/src/python/Include/pymacro.h:175:13: error: implicit declaration of function 'static_assert' [-Wimplicit-function-declaration] 175 | static_assert((cond), #cond); \ | ^~~~~~~~~~~~~ /usr/local/src/python/Include/internal/pycore_bitutils.h:100:5: note: in expansion of macro 'Py_BUILD_ASSERT' 100 | Py_BUILD_ASSERT(sizeof(x) <= sizeof(unsigned int)); | ^~~~~~~~~~~~~~~ make: *** [Makefile:3407: Objects/longobject.o] Error 1 Restore compilation in such environments by fixing the negation. Signed-off-by: Ruoyu Zhong <zhongruoyu@outlook.com>
1 parent c436e8d commit e06aab3

2 files changed

Lines changed: 3 additions & 1 deletion

File tree

‎Include/pymacro.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
// behaviour. So only define if building as C, not C++ (if __cplusplus is
2626
// not defined), and only for C11-17.
2727
#if !defined(static_assert) && (defined(__GNUC__) || defined(__clang__)) \
28-
&& !defined(_Py_STDC_VERSION) \
28+
&& defined(_Py_STDC_VERSION) \
2929
&& _Py_STDC_VERSION >= 201112L && _Py_STDC_VERSION <= 201710L
3030
# define static_assert _Static_assert
3131
#endif
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix C11-C17 builds with old C library headers that do not define
2+
``static_assert``, including glibc versions older than 2.16.

0 commit comments

Comments
 (0)