diff --git a/Include/cpython/pyatomic.h b/Include/cpython/pyatomic.h index 71a76bdc82ce475..0a11f7781f07e00 100644 --- a/Include/cpython/pyatomic.h +++ b/Include/cpython/pyatomic.h @@ -585,7 +585,7 @@ static inline void _Py_atomic_fence_release(void); # define Py_ATOMIC_GCC_H # include "pyatomic_gcc.h" # undef Py_ATOMIC_GCC_H -#elif _Py_STDC_VERSION >= 201112L && !defined(__STDC_NO_ATOMICS__) +#elif defined(_Py_STDC_VERSION) && _Py_STDC_VERSION >= 201112L && !defined(__STDC_NO_ATOMICS__) # define Py_ATOMIC_STD_H # include "pyatomic_std.h" # undef Py_ATOMIC_STD_H diff --git a/Include/pyport.h b/Include/pyport.h index 3de7fb3d317521a..ee1d8c0e2483dfd 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -491,7 +491,7 @@ extern "C" { #ifdef WITH_THREAD # ifdef thread_local # define _Py_thread_local thread_local -# elif _Py_STDC_VERSION >= 201112L && !defined(__STDC_NO_THREADS__) +# elif defined(_Py_STDC_VERSION) && _Py_STDC_VERSION >= 201112L && !defined(__STDC_NO_THREADS__) # define _Py_thread_local _Thread_local # elif defined(_MSC_VER) /* AKA NT_THREADS */ # define _Py_thread_local __declspec(thread) diff --git a/Lib/test/test_cext/__init__.py b/Lib/test/test_cext/__init__.py index 185f10911370347..4c7c7ef68e0f855 100644 --- a/Lib/test/test_cext/__init__.py +++ b/Lib/test/test_cext/__init__.py @@ -133,6 +133,11 @@ def test_build_abi3t(self): # Test with Py_TARGET_ABI3T self.check_build('_test_cext_abi3t', abi3t=True) + # gh-154643: Test that headers don't use undefined macros in #if + @unittest.skipIf(support.MS_WINDOWS, "MSVC doesn't support -Werror=undef") + def test_build_werror_undef(self): + self.check_build('_test_cext_undef', extra_cflags='-Werror=undef') + class TestPublicCpp(BaseTests, unittest.TestCase): LANGUAGE = 'C++' @@ -174,6 +179,11 @@ def test_build_abi3t(self): # Test with Py_TARGET_ABI3T self.check_build('_test_cppext_abi3t', abi3t=True) + # gh-154643: Test that headers don't use undefined macros in #if + @unittest.skipIf(support.MS_WINDOWS, "MSVC doesn't support -Werror=undef") + def test_build_werror_undef(self): + self.check_build('_testcppext_undef', extra_cflags='-Werror=undef') + class TestInternalC(BaseTests, unittest.TestCase): LANGUAGE = 'C' diff --git a/Lib/test/test_cext/setup.py b/Lib/test/test_cext/setup.py index 10a3887931932ac..3b613ee729f52c4 100644 --- a/Lib/test/test_cext/setup.py +++ b/Lib/test/test_cext/setup.py @@ -42,6 +42,9 @@ # Ask for strict(er) compliance with the standard '-pedantic-errors', + + # gh-154643: Headers should not use undefined macros in #if + '-Werror=undef', ] if not support.Py_GIL_DISABLED: PUBLIC_CFLAGS.append( @@ -94,6 +97,9 @@ # We also use `long long`, a C++11 feature we can enable individually. '-Wno-long-long', + + # gh-154643: Headers should not use undefined macros in #if + '-Werror=undef', ] INTERNAL_CXXFLAGS = [ # Do not complain about unused parameteres in the internal C API diff --git a/Misc/NEWS.d/next/C_API/2026-07-24-22-30-40.gh-issue-154643.z-ZutK.rst b/Misc/NEWS.d/next/C_API/2026-07-24-22-30-40.gh-issue-154643.z-ZutK.rst new file mode 100644 index 000000000000000..17c2a58555e7ae9 --- /dev/null +++ b/Misc/NEWS.d/next/C_API/2026-07-24-22-30-40.gh-issue-154643.z-ZutK.rst @@ -0,0 +1,2 @@ +In ``pyport.h`` and ``pyatomic.h`` don't use ``_Py_STDC_VERSION`` when it is +not defined, fixing build errors for C or C++ code built with ``-Werror=undef``.