From 8b961ade5405ac72da66c09e90ed92aa5254f0c5 Mon Sep 17 00:00:00 2001 From: alperyoney Date: Wed, 26 Nov 2025 11:07:27 -0800 Subject: [PATCH 1/5] gh-116738: Make cmath module thread-safe --- .../2025-12-01-10-03-08.gh-issue-116738.972YsG.rst | 2 ++ Modules/cmathmodule.c | 13 +++++++++++++ Tools/c-analyzer/cpython/ignored.tsv | 1 + 3 files changed, 16 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst new file mode 100644 index 00000000000000..6b473ffe849271 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst @@ -0,0 +1,2 @@ +Make the :mod:`cmath` module thread-safe during import in free-threading and +subinterpreter use cases. diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index aee3e4f343d8be..dcd02f9dbce481 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -9,6 +9,7 @@ #include "Python.h" #include "pycore_complexobject.h" // _Py_c_neg() #include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR +#include "pycore_lock.h" // _PyOnceFlag_CallOnce /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from float.h. We assume that FLT_RADIX is either 2 or 16. */ #include @@ -1173,6 +1174,9 @@ static PyMethodDef cmath_methods[] = { {NULL, NULL} /* sentinel */ }; +static int init_special_value_tables(void *Py_UNUSED(arg)); +static _PyOnceFlag special_values_init_once = {0}; + static int cmath_exec(PyObject *mod) { @@ -1203,6 +1207,15 @@ cmath_exec(PyObject *mod) } /* initialize special value tables */ + if (_PyOnceFlag_CallOnce(&special_values_init_once, init_special_value_tables, NULL) < 0) { + return -1; + } + + return 0; +} + +static int +init_special_value_tables(void *Py_UNUSED(arg)) { #define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY } #define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p; diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index adb183000deeff..3debf041030fe8 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -167,6 +167,7 @@ Python/sysmodule.c - _preinit_xoptions - # thread-safety # XXX need race protection? +Modules/cmathmodule.c - special_values_init_once - Modules/faulthandler.c faulthandler_dump_traceback reentrant - Modules/faulthandler.c faulthandler_dump_c_stack reentrant - Modules/grpmodule.c - group_db_mutex - From 90be0d7ef0b4df56fb69d2bcbd234e7057c1d692 Mon Sep 17 00:00:00 2001 From: alperyoney Date: Mon, 1 Dec 2025 14:19:23 -0800 Subject: [PATCH 2/5] Address review comments --- .../2025-12-01-10-03-08.gh-issue-116738.972YsG.rst | 4 ++-- Modules/cmathmodule.c | 3 ++- Tools/c-analyzer/cpython/ignored.tsv | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst index 6b473ffe849271..d6d9d02b017473 100644 --- a/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-12-01-10-03-08.gh-issue-116738.972YsG.rst @@ -1,2 +1,2 @@ -Make the :mod:`cmath` module thread-safe during import in free-threading and -subinterpreter use cases. +Fix :mod:`cmath` data race when initializing trigonometric tables with +subinterpreters. diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index dcd02f9dbce481..db7193ea764c2d 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -1215,7 +1215,8 @@ cmath_exec(PyObject *mod) } static int -init_special_value_tables(void *Py_UNUSED(arg)) { +init_special_value_tables(void *Py_UNUSED(arg)) +{ #define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY } #define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p; diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 3debf041030fe8..043772162203f3 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -26,6 +26,7 @@ Modules/posixmodule.c os_dup2_impl dup3_works - ## guards around resource init Python/thread_pthread.h PyThread__init_thread lib_initialized - Modules/_struct.c - endian_tables_init_once - +Modules/cmathmodule.c - special_values_init_once - ##----------------------- ## other values (not Python-specific) @@ -167,7 +168,6 @@ Python/sysmodule.c - _preinit_xoptions - # thread-safety # XXX need race protection? -Modules/cmathmodule.c - special_values_init_once - Modules/faulthandler.c faulthandler_dump_traceback reentrant - Modules/faulthandler.c faulthandler_dump_c_stack reentrant - Modules/grpmodule.c - group_db_mutex - From 90ab34c585ab87449b541caa32d014580c8e27f0 Mon Sep 17 00:00:00 2001 From: alperyoney Date: Tue, 2 Dec 2025 11:17:07 -0800 Subject: [PATCH 3/5] Static initialize trigonometric tables --- Modules/cmathmodule.c | 240 +++++++++++---------------- Tools/c-analyzer/cpython/ignored.tsv | 1 - 2 files changed, 100 insertions(+), 141 deletions(-) diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index db7193ea764c2d..ec8536df3f928b 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -9,7 +9,6 @@ #include "Python.h" #include "pycore_complexobject.h" // _Py_c_neg() #include "pycore_pymath.h" // _PY_SHORT_FLOAT_REPR -#include "pycore_lock.h" // _PyOnceFlag_CallOnce /* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from float.h. We assume that FLT_RADIX is either 2 or 16. */ #include @@ -164,8 +163,16 @@ special_type(double d) raised. */ -static Py_complex acos_special_values[7][7]; - +#define C(R, I) (Py_complex){(R), (I)} +static Py_complex acos_special_values[7][7] = { + C(P34,INF), C(P,INF), C(P,INF), C(P,-INF), C(P,-INF), C(P34,-INF), C(N,INF), + C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N), + C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N), + C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N), + C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N), + C(P14,INF), C(0.,INF), C(0.,INF), C(0.,-INF), C(0.,-INF), C(P14,-INF), C(N,INF), + C(N,INF), C(N,N), C(N,N), C(N,N), C(N,N), C(N,-INF), C(N,N), +}; /*[clinic input] cmath.acos -> Py_complex_protected @@ -203,7 +210,15 @@ cmath_acos_impl(PyObject *module, Py_complex z) } -static Py_complex acosh_special_values[7][7]; +static Py_complex acosh_special_values[7][7] = { + C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N), + C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), + C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12), + C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12), + C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), + C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N), + C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N), +}; /*[clinic input] cmath.acosh = cmath.acos @@ -258,7 +273,15 @@ cmath_asin_impl(PyObject *module, Py_complex z) } -static Py_complex asinh_special_values[7][7]; +static Py_complex asinh_special_values[7][7] = { + C(-INF,-P14), C(-INF,-0.), C(-INF,-0.), C(-INF,0.), C(-INF,0.), C(-INF,P14), C(-INF,N), + C(-INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-INF,P12), C(N,N), + C(-INF,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-INF,P12), C(N,N), + C(INF,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,P12), C(N,N), + C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), + C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N), + C(INF,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(INF,N), C(N,N), +}; /*[clinic input] cmath.asinh = cmath.acos @@ -319,7 +342,15 @@ cmath_atan_impl(PyObject *module, Py_complex z) } -static Py_complex atanh_special_values[7][7]; +static Py_complex atanh_special_values[7][7] = { + C(-0.,-P12), C(-0.,-P12), C(-0.,-P12), C(-0.,P12), C(-0.,P12), C(-0.,P12), C(-0.,N), + C(-0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-0.,P12), C(N,N), + C(-0.,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.,P12), C(-0.,N), + C(0.,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,P12), C(0.,N), + C(0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(0.,P12), C(N,N), + C(0.,-P12), C(0.,-P12), C(0.,-P12), C(0.,P12), C(0.,P12), C(0.,P12), C(0.,N), + C(0.,-P12), C(N,N), C(N,N), C(N,N), C(N,N), C(0.,P12), C(N,N), +}; /*[clinic input] cmath.atanh = cmath.acos @@ -392,7 +423,15 @@ cmath_cos_impl(PyObject *module, Py_complex z) /* cosh(infinity + i*y) needs to be dealt with specially */ -static Py_complex cosh_special_values[7][7]; +static Py_complex cosh_special_values[7][7] = { + C(INF,N), C(U,U), C(INF,0.), C(INF,-0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(N,0.), C(U,U), C(1.,0.), C(1.,-0.), C(U,U), C(N,0.), C(N,0.), + C(N,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,0.), C(N,0.), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N), +}; /*[clinic input] cmath.cosh = cmath.acos @@ -454,7 +493,15 @@ cmath_cosh_impl(PyObject *module, Py_complex z) /* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for finite y */ -static Py_complex exp_special_values[7][7]; +static Py_complex exp_special_values[7][7] = { + C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N), + C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N), +}; /*[clinic input] cmath.exp = cmath.acos @@ -513,7 +560,15 @@ cmath_exp_impl(PyObject *module, Py_complex z) return r; } -static Py_complex log_special_values[7][7]; +static Py_complex log_special_values[7][7] = { + C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N), + C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), + C(INF,-P12), C(U,U), C(-INF,-P), C(-INF,P), C(U,U), C(INF,P12), C(N,N), + C(INF,-P12), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,P12), C(N,N), + C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), + C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N), + C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N), +}; static Py_complex c_log(Py_complex z) @@ -629,7 +684,15 @@ cmath_sin_impl(PyObject *module, Py_complex z) /* sinh(infinity + i*y) needs to be dealt with specially */ -static Py_complex sinh_special_values[7][7]; +static Py_complex sinh_special_values[7][7] = { + C(INF,N), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(0.,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(0.,N), C(0.,N), + C(0.,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,N), C(0.,N), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N), +}; /*[clinic input] cmath.sinh = cmath.acos @@ -688,7 +751,15 @@ cmath_sinh_impl(PyObject *module, Py_complex z) } -static Py_complex sqrt_special_values[7][7]; +static Py_complex sqrt_special_values[7][7] = { + C(INF,-INF), C(0.,-INF), C(0.,-INF), C(0.,INF), C(0.,INF), C(INF,INF), C(N,INF), + C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N), + C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N), + C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N), + C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N), + C(INF,-INF), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,INF), C(INF,N), + C(INF,-INF), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,INF), C(N,N), +}; /*[clinic input] cmath.sqrt = cmath.acos @@ -787,7 +858,15 @@ cmath_tan_impl(PyObject *module, Py_complex z) /* tanh(infinity + i*y) needs to be dealt with specially */ -static Py_complex tanh_special_values[7][7]; +static Py_complex tanh_special_values[7][7] = { + C(-1.,0.), C(U,U), C(-1.,-0.), C(-1.,0.), C(U,U), C(-1.,0.), C(-1.,0.), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(-0.0,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.0,N), C(-0.,N), + C(0.0,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.0,N), C(0.,N), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(1.,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(1.,0.), C(1.,0.), + C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N), +}; /*[clinic input] cmath.tanh = cmath.acos @@ -970,7 +1049,15 @@ cmath_polar_impl(PyObject *module, Py_complex z) */ -static Py_complex rect_special_values[7][7]; +static Py_complex rect_special_values[7][7] = { + C(INF,N), C(U,U), C(-INF,0.), C(-INF,-0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(0.,0.), C(U,U), C(-0.,0.), C(-0.,-0.), C(U,U), C(0.,0.), C(0.,0.), + C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.), + C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), + C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), + C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N), +}; /*[clinic input] cmath.rect @@ -1174,9 +1261,6 @@ static PyMethodDef cmath_methods[] = { {NULL, NULL} /* sentinel */ }; -static int init_special_value_tables(void *Py_UNUSED(arg)); -static _PyOnceFlag special_values_init_once = {0}; - static int cmath_exec(PyObject *mod) { @@ -1206,130 +1290,6 @@ cmath_exec(PyObject *mod) return -1; } - /* initialize special value tables */ - if (_PyOnceFlag_CallOnce(&special_values_init_once, init_special_value_tables, NULL) < 0) { - return -1; - } - - return 0; -} - -static int -init_special_value_tables(void *Py_UNUSED(arg)) -{ - -#define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY } -#define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p; - - INIT_SPECIAL_VALUES(acos_special_values, { - C(P34,INF) C(P,INF) C(P,INF) C(P,-INF) C(P,-INF) C(P34,-INF) C(N,INF) - C(P12,INF) C(U,U) C(U,U) C(U,U) C(U,U) C(P12,-INF) C(N,N) - C(P12,INF) C(U,U) C(P12,0.) C(P12,-0.) C(U,U) C(P12,-INF) C(P12,N) - C(P12,INF) C(U,U) C(P12,0.) C(P12,-0.) C(U,U) C(P12,-INF) C(P12,N) - C(P12,INF) C(U,U) C(U,U) C(U,U) C(U,U) C(P12,-INF) C(N,N) - C(P14,INF) C(0.,INF) C(0.,INF) C(0.,-INF) C(0.,-INF) C(P14,-INF) C(N,INF) - C(N,INF) C(N,N) C(N,N) C(N,N) C(N,N) C(N,-INF) C(N,N) - }) - - INIT_SPECIAL_VALUES(acosh_special_values, { - C(INF,-P34) C(INF,-P) C(INF,-P) C(INF,P) C(INF,P) C(INF,P34) C(INF,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(0.,-P12) C(0.,P12) C(U,U) C(INF,P12) C(N,P12) - C(INF,-P12) C(U,U) C(0.,-P12) C(0.,P12) C(U,U) C(INF,P12) C(N,P12) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N) - C(INF,N) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(asinh_special_values, { - C(-INF,-P14) C(-INF,-0.) C(-INF,-0.) C(-INF,0.) C(-INF,0.) C(-INF,P14) C(-INF,N) - C(-INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(-INF,P12) C(N,N) - C(-INF,-P12) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N) - C(INF,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(INF,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(atanh_special_values, { - C(-0.,-P12) C(-0.,-P12) C(-0.,-P12) C(-0.,P12) C(-0.,P12) C(-0.,P12) C(-0.,N) - C(-0.,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(-0.,P12) C(N,N) - C(-0.,-P12) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-0.,P12) C(-0.,N) - C(0.,-P12) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,P12) C(0.,N) - C(0.,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(0.,P12) C(N,N) - C(0.,-P12) C(0.,-P12) C(0.,-P12) C(0.,P12) C(0.,P12) C(0.,P12) C(0.,N) - C(0.,-P12) C(N,N) C(N,N) C(N,N) C(N,N) C(0.,P12) C(N,N) - }) - - INIT_SPECIAL_VALUES(cosh_special_values, { - C(INF,N) C(U,U) C(INF,0.) C(INF,-0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(N,0.) C(U,U) C(1.,0.) C(1.,-0.) C(U,U) C(N,0.) C(N,0.) - C(N,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,0.) C(N,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(exp_special_values, { - C(0.,0.) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,0.) C(0.,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(N,N) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,N) C(N,N) - C(N,N) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(N,N) C(N,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(log_special_values, { - C(INF,-P34) C(INF,-P) C(INF,-P) C(INF,P) C(INF,P) C(INF,P34) C(INF,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(-INF,-P) C(-INF,P) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,P12) C(N,N) - C(INF,-P12) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,P12) C(N,N) - C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N) - C(INF,N) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(sinh_special_values, { - C(INF,N) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(0.,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(0.,N) C(0.,N) - C(0.,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,N) C(0.,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(sqrt_special_values, { - C(INF,-INF) C(0.,-INF) C(0.,-INF) C(0.,INF) C(0.,INF) C(INF,INF) C(N,INF) - C(INF,-INF) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(U,U) C(U,U) C(U,U) C(U,U) C(INF,INF) C(N,N) - C(INF,-INF) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,INF) C(INF,N) - C(INF,-INF) C(N,N) C(N,N) C(N,N) C(N,N) C(INF,INF) C(N,N) - }) - - INIT_SPECIAL_VALUES(tanh_special_values, { - C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(-0.0,N) C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(-0.0,N) C(-0.,N) - C(0.0,N) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.0,N) C(0.,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(1.,0.) C(U,U) C(1.,-0.) C(1.,0.) C(U,U) C(1.,0.) C(1.,0.) - C(N,N) C(N,N) C(N,-0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) - - INIT_SPECIAL_VALUES(rect_special_values, { - C(INF,N) C(U,U) C(-INF,0.) C(-INF,-0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(0.,0.) C(U,U) C(-0.,0.) C(-0.,-0.) C(U,U) C(0.,0.) C(0.,0.) - C(0.,0.) C(U,U) C(0.,-0.) C(0.,0.) C(U,U) C(0.,0.) C(0.,0.) - C(N,N) C(U,U) C(U,U) C(U,U) C(U,U) C(N,N) C(N,N) - C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N) - C(N,N) C(N,N) C(N,0.) C(N,0.) C(N,N) C(N,N) C(N,N) - }) return 0; } diff --git a/Tools/c-analyzer/cpython/ignored.tsv b/Tools/c-analyzer/cpython/ignored.tsv index 043772162203f3..adb183000deeff 100644 --- a/Tools/c-analyzer/cpython/ignored.tsv +++ b/Tools/c-analyzer/cpython/ignored.tsv @@ -26,7 +26,6 @@ Modules/posixmodule.c os_dup2_impl dup3_works - ## guards around resource init Python/thread_pthread.h PyThread__init_thread lib_initialized - Modules/_struct.c - endian_tables_init_once - -Modules/cmathmodule.c - special_values_init_once - ##----------------------- ## other values (not Python-specific) From a36573446881db6bc6d67ae39061b89dc651f03b Mon Sep 17 00:00:00 2001 From: alperyoney Date: Tue, 2 Dec 2025 11:56:57 -0800 Subject: [PATCH 4/5] Address Windows compiler error --- Modules/cmathmodule.c | 156 +++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index ec8536df3f928b..773432f3bc346c 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -163,15 +163,15 @@ special_type(double d) raised. */ -#define C(R, I) (Py_complex){(R), (I)} +#define C(R, I) {(R), (I)} static Py_complex acos_special_values[7][7] = { - C(P34,INF), C(P,INF), C(P,INF), C(P,-INF), C(P,-INF), C(P34,-INF), C(N,INF), - C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N), - C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N), - C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N), - C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N), - C(P14,INF), C(0.,INF), C(0.,INF), C(0.,-INF), C(0.,-INF), C(P14,-INF), C(N,INF), - C(N,INF), C(N,N), C(N,N), C(N,N), C(N,N), C(N,-INF), C(N,N), + { C(P34,INF), C(P,INF), C(P,INF), C(P,-INF), C(P,-INF), C(P34,-INF), C(N,INF) }, + { C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N) }, + { C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N) }, + { C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N) }, + { C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N) }, + { C(P14,INF), C(0.,INF), C(0.,INF), C(0.,-INF), C(0.,-INF), C(P14,-INF), C(N,INF) }, + { C(N,INF), C(N,N), C(N,N), C(N,N), C(N,N), C(N,-INF), C(N,N) } }; /*[clinic input] cmath.acos -> Py_complex_protected @@ -211,13 +211,13 @@ cmath_acos_impl(PyObject *module, Py_complex z) static Py_complex acosh_special_values[7][7] = { - C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N), - C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), - C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12), - C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12), - C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), - C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N), - C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N), + { C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N) }, + { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12) }, + { C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12) }, + { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N) }, + { C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N) } }; /*[clinic input] @@ -274,13 +274,13 @@ cmath_asin_impl(PyObject *module, Py_complex z) static Py_complex asinh_special_values[7][7] = { - C(-INF,-P14), C(-INF,-0.), C(-INF,-0.), C(-INF,0.), C(-INF,0.), C(-INF,P14), C(-INF,N), - C(-INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-INF,P12), C(N,N), - C(-INF,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-INF,P12), C(N,N), - C(INF,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,P12), C(N,N), - C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), - C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N), - C(INF,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(INF,N), C(N,N), + { C(-INF,-P14), C(-INF,-0.), C(-INF,-0.), C(-INF,0.), C(-INF,0.), C(-INF,P14), C(-INF,N) }, + { C(-INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-INF,P12), C(N,N) }, + { C(-INF,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-INF,P12), C(N,N) }, + { C(INF,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N) }, + { C(INF,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(INF,N), C(N,N) } }; /*[clinic input] @@ -343,13 +343,13 @@ cmath_atan_impl(PyObject *module, Py_complex z) static Py_complex atanh_special_values[7][7] = { - C(-0.,-P12), C(-0.,-P12), C(-0.,-P12), C(-0.,P12), C(-0.,P12), C(-0.,P12), C(-0.,N), - C(-0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-0.,P12), C(N,N), - C(-0.,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.,P12), C(-0.,N), - C(0.,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,P12), C(0.,N), - C(0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(0.,P12), C(N,N), - C(0.,-P12), C(0.,-P12), C(0.,-P12), C(0.,P12), C(0.,P12), C(0.,P12), C(0.,N), - C(0.,-P12), C(N,N), C(N,N), C(N,N), C(N,N), C(0.,P12), C(N,N), + { C(-0.,-P12), C(-0.,-P12), C(-0.,-P12), C(-0.,P12), C(-0.,P12), C(-0.,P12), C(-0.,N) }, + { C(-0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-0.,P12), C(N,N) }, + { C(-0.,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.,P12), C(-0.,N) }, + { C(0.,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,P12), C(0.,N) }, + { C(0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(0.,P12), C(N,N) }, + { C(0.,-P12), C(0.,-P12), C(0.,-P12), C(0.,P12), C(0.,P12), C(0.,P12), C(0.,N) }, + { C(0.,-P12), C(N,N), C(N,N), C(N,N), C(N,N), C(0.,P12), C(N,N) } }; /*[clinic input] @@ -424,13 +424,13 @@ cmath_cos_impl(PyObject *module, Py_complex z) /* cosh(infinity + i*y) needs to be dealt with specially */ static Py_complex cosh_special_values[7][7] = { - C(INF,N), C(U,U), C(INF,0.), C(INF,-0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(N,0.), C(U,U), C(1.,0.), C(1.,-0.), C(U,U), C(N,0.), C(N,0.), - C(N,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,0.), C(N,0.), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N), + { C(INF,N), C(U,U), C(INF,0.), C(INF,-0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(N,0.), C(U,U), C(1.,0.), C(1.,-0.), C(U,U), C(N,0.), C(N,0.) }, + { C(N,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,0.), C(N,0.) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N) } }; /*[clinic input] @@ -494,13 +494,13 @@ cmath_cosh_impl(PyObject *module, Py_complex z) /* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for finite y */ static Py_complex exp_special_values[7][7] = { - C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N), - C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N), + { C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N) }, + { C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N) } }; /*[clinic input] @@ -561,13 +561,13 @@ cmath_exp_impl(PyObject *module, Py_complex z) } static Py_complex log_special_values[7][7] = { - C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N), - C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), - C(INF,-P12), C(U,U), C(-INF,-P), C(-INF,P), C(U,U), C(INF,P12), C(N,N), - C(INF,-P12), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,P12), C(N,N), - C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N), - C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N), - C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N), + { C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N) }, + { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P12), C(U,U), C(-INF,-P), C(-INF,P), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P12), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, + { C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N) }, + { C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N) } }; static Py_complex @@ -685,13 +685,13 @@ cmath_sin_impl(PyObject *module, Py_complex z) /* sinh(infinity + i*y) needs to be dealt with specially */ static Py_complex sinh_special_values[7][7] = { - C(INF,N), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(0.,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(0.,N), C(0.,N), - C(0.,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,N), C(0.,N), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N), + { C(INF,N), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(0.,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(0.,N), C(0.,N) }, + { C(0.,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,N), C(0.,N) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N) } }; /*[clinic input] @@ -752,13 +752,13 @@ cmath_sinh_impl(PyObject *module, Py_complex z) static Py_complex sqrt_special_values[7][7] = { - C(INF,-INF), C(0.,-INF), C(0.,-INF), C(0.,INF), C(0.,INF), C(INF,INF), C(N,INF), - C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N), - C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N), - C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N), - C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N), - C(INF,-INF), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,INF), C(INF,N), - C(INF,-INF), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,INF), C(N,N), + { C(INF,-INF), C(0.,-INF), C(0.,-INF), C(0.,INF), C(0.,INF), C(INF,INF), C(N,INF) }, + { C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N) }, + { C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N) }, + { C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N) }, + { C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N) }, + { C(INF,-INF), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,INF), C(INF,N) }, + { C(INF,-INF), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,INF), C(N,N) } }; /*[clinic input] @@ -859,13 +859,13 @@ cmath_tan_impl(PyObject *module, Py_complex z) /* tanh(infinity + i*y) needs to be dealt with specially */ static Py_complex tanh_special_values[7][7] = { - C(-1.,0.), C(U,U), C(-1.,-0.), C(-1.,0.), C(U,U), C(-1.,0.), C(-1.,0.), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(-0.0,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.0,N), C(-0.,N), - C(0.0,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.0,N), C(0.,N), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(1.,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(1.,0.), C(1.,0.), - C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N), + { C(-1.,0.), C(U,U), C(-1.,-0.), C(-1.,0.), C(U,U), C(-1.,0.), C(-1.,0.) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(-0.0,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.0,N), C(-0.,N) }, + { C(0.0,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.0,N), C(0.,N) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(1.,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(1.,0.), C(1.,0.) }, + { C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N) } }; /*[clinic input] @@ -1050,13 +1050,13 @@ cmath_polar_impl(PyObject *module, Py_complex z) */ static Py_complex rect_special_values[7][7] = { - C(INF,N), C(U,U), C(-INF,0.), C(-INF,-0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(0.,0.), C(U,U), C(-0.,0.), C(-0.,-0.), C(U,U), C(0.,0.), C(0.,0.), - C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.), - C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N), - C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N), - C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N), + { C(INF,N), C(U,U), C(-INF,0.), C(-INF,-0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(0.,0.), C(U,U), C(-0.,0.), C(-0.,-0.), C(U,U), C(0.,0.), C(0.,0.) }, + { C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.) }, + { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, + { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, + { C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N) } }; /*[clinic input] From 64254ba9a96bd616e9bec5a71491021d79922a81 Mon Sep 17 00:00:00 2001 From: alperyoney Date: Tue, 2 Dec 2025 12:26:13 -0800 Subject: [PATCH 5/5] Remove C(R, I) macro --- Modules/cmathmodule.c | 155 +++++++++++++++++++++--------------------- 1 file changed, 77 insertions(+), 78 deletions(-) diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c index 773432f3bc346c..65fbcf5cdaa73f 100644 --- a/Modules/cmathmodule.c +++ b/Modules/cmathmodule.c @@ -163,15 +163,14 @@ special_type(double d) raised. */ -#define C(R, I) {(R), (I)} static Py_complex acos_special_values[7][7] = { - { C(P34,INF), C(P,INF), C(P,INF), C(P,-INF), C(P,-INF), C(P34,-INF), C(N,INF) }, - { C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N) }, - { C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N) }, - { C(P12,INF), C(U,U), C(P12,0.), C(P12,-0.), C(U,U), C(P12,-INF), C(P12,N) }, - { C(P12,INF), C(U,U), C(U,U), C(U,U), C(U,U), C(P12,-INF), C(N,N) }, - { C(P14,INF), C(0.,INF), C(0.,INF), C(0.,-INF), C(0.,-INF), C(P14,-INF), C(N,INF) }, - { C(N,INF), C(N,N), C(N,N), C(N,N), C(N,N), C(N,-INF), C(N,N) } + { {P34,INF}, {P,INF}, {P,INF}, {P,-INF}, {P,-INF}, {P34,-INF}, {N,INF} }, + { {P12,INF}, {U,U}, {U,U}, {U,U}, {U,U}, {P12,-INF}, {N,N} }, + { {P12,INF}, {U,U}, {P12,0.}, {P12,-0.}, {U,U}, {P12,-INF}, {P12,N} }, + { {P12,INF}, {U,U}, {P12,0.}, {P12,-0.}, {U,U}, {P12,-INF}, {P12,N} }, + { {P12,INF}, {U,U}, {U,U}, {U,U}, {U,U}, {P12,-INF}, {N,N} }, + { {P14,INF}, {0.,INF}, {0.,INF}, {0.,-INF}, {0.,-INF}, {P14,-INF}, {N,INF} }, + { {N,INF}, {N,N}, {N,N}, {N,N}, {N,N}, {N,-INF}, {N,N} } }; /*[clinic input] cmath.acos -> Py_complex_protected @@ -211,13 +210,13 @@ cmath_acos_impl(PyObject *module, Py_complex z) static Py_complex acosh_special_values[7][7] = { - { C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N) }, - { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12) }, - { C(INF,-P12), C(U,U), C(0.,-P12), C(0.,P12), C(U,U), C(INF,P12), C(N,P12) }, - { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N) }, - { C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N) } + { {INF,-P34}, {INF,-P}, {INF,-P}, {INF,P}, {INF,P}, {INF,P34}, {INF,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {0.,-P12}, {0.,P12}, {U,U}, {INF,P12}, {N,P12} }, + { {INF,-P12}, {U,U}, {0.,-P12}, {0.,P12}, {U,U}, {INF,P12}, {N,P12} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P14}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,P14}, {INF,N} }, + { {INF,N}, {N,N}, {N,N}, {N,N}, {N,N}, {INF,N}, {N,N} } }; /*[clinic input] @@ -274,13 +273,13 @@ cmath_asin_impl(PyObject *module, Py_complex z) static Py_complex asinh_special_values[7][7] = { - { C(-INF,-P14), C(-INF,-0.), C(-INF,-0.), C(-INF,0.), C(-INF,0.), C(-INF,P14), C(-INF,N) }, - { C(-INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-INF,P12), C(N,N) }, - { C(-INF,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-INF,P12), C(N,N) }, - { C(INF,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N) }, - { C(INF,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(INF,N), C(N,N) } + { {-INF,-P14}, {-INF,-0.}, {-INF,-0.}, {-INF,0.}, {-INF,0.}, {-INF,P14}, {-INF,N} }, + { {-INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {-INF,P12}, {N,N} }, + { {-INF,-P12}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {-INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P14}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,P14}, {INF,N} }, + { {INF,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {INF,N}, {N,N} } }; /*[clinic input] @@ -343,13 +342,13 @@ cmath_atan_impl(PyObject *module, Py_complex z) static Py_complex atanh_special_values[7][7] = { - { C(-0.,-P12), C(-0.,-P12), C(-0.,-P12), C(-0.,P12), C(-0.,P12), C(-0.,P12), C(-0.,N) }, - { C(-0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(-0.,P12), C(N,N) }, - { C(-0.,-P12), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.,P12), C(-0.,N) }, - { C(0.,-P12), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,P12), C(0.,N) }, - { C(0.,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(0.,P12), C(N,N) }, - { C(0.,-P12), C(0.,-P12), C(0.,-P12), C(0.,P12), C(0.,P12), C(0.,P12), C(0.,N) }, - { C(0.,-P12), C(N,N), C(N,N), C(N,N), C(N,N), C(0.,P12), C(N,N) } + { {-0.,-P12}, {-0.,-P12}, {-0.,-P12}, {-0.,P12}, {-0.,P12}, {-0.,P12}, {-0.,N} }, + { {-0.,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {-0.,P12}, {N,N} }, + { {-0.,-P12}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {-0.,P12}, {-0.,N} }, + { {0.,-P12}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,P12}, {0.,N} }, + { {0.,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {0.,P12}, {N,N} }, + { {0.,-P12}, {0.,-P12}, {0.,-P12}, {0.,P12}, {0.,P12}, {0.,P12}, {0.,N} }, + { {0.,-P12}, {N,N}, {N,N}, {N,N}, {N,N}, {0.,P12}, {N,N} } }; /*[clinic input] @@ -424,13 +423,13 @@ cmath_cos_impl(PyObject *module, Py_complex z) /* cosh(infinity + i*y) needs to be dealt with specially */ static Py_complex cosh_special_values[7][7] = { - { C(INF,N), C(U,U), C(INF,0.), C(INF,-0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(N,0.), C(U,U), C(1.,0.), C(1.,-0.), C(U,U), C(N,0.), C(N,0.) }, - { C(N,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,0.), C(N,0.) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N) } + { {INF,N}, {U,U}, {INF,0.}, {INF,-0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {N,0.}, {U,U}, {1.,0.}, {1.,-0.}, {U,U}, {N,0.}, {N,0.} }, + { {N,0.}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {N,0.}, {N,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,0.}, {N,0.}, {N,N}, {N,N}, {N,N} } }; /*[clinic input] @@ -494,13 +493,13 @@ cmath_cosh_impl(PyObject *module, Py_complex z) /* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for finite y */ static Py_complex exp_special_values[7][7] = { - { C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N) }, - { C(N,N), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(N,N), C(N,N) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N) } + { {0.,0.}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,0.}, {0.,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {N,N}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {N,N}, {N,N} }, + { {N,N}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {N,N}, {N,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {N,N}, {N,N} } }; /*[clinic input] @@ -561,13 +560,13 @@ cmath_exp_impl(PyObject *module, Py_complex z) } static Py_complex log_special_values[7][7] = { - { C(INF,-P34), C(INF,-P), C(INF,-P), C(INF,P), C(INF,P), C(INF,P34), C(INF,N) }, - { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P12), C(U,U), C(-INF,-P), C(-INF,P), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P12), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P12), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,P12), C(N,N) }, - { C(INF,-P14), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,P14), C(INF,N) }, - { C(INF,N), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,N), C(N,N) } + { {INF,-P34}, {INF,-P}, {INF,-P}, {INF,P}, {INF,P}, {INF,P34}, {INF,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {-INF,-P}, {-INF,P}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {-INF,-0.}, {-INF,0.}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P12}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,P12}, {N,N} }, + { {INF,-P14}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,P14}, {INF,N} }, + { {INF,N}, {N,N}, {N,N}, {N,N}, {N,N}, {INF,N}, {N,N} } }; static Py_complex @@ -685,13 +684,13 @@ cmath_sin_impl(PyObject *module, Py_complex z) /* sinh(infinity + i*y) needs to be dealt with specially */ static Py_complex sinh_special_values[7][7] = { - { C(INF,N), C(U,U), C(-INF,-0.), C(-INF,0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(0.,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(0.,N), C(0.,N) }, - { C(0.,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,N), C(0.,N) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N) } + { {INF,N}, {U,U}, {-INF,-0.}, {-INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {0.,N}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {0.,N}, {0.,N} }, + { {0.,N}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,N}, {0.,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {N,N}, {N,N} } }; /*[clinic input] @@ -752,13 +751,13 @@ cmath_sinh_impl(PyObject *module, Py_complex z) static Py_complex sqrt_special_values[7][7] = { - { C(INF,-INF), C(0.,-INF), C(0.,-INF), C(0.,INF), C(0.,INF), C(INF,INF), C(N,INF) }, - { C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N) }, - { C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N) }, - { C(INF,-INF), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(INF,INF), C(N,N) }, - { C(INF,-INF), C(U,U), C(U,U), C(U,U), C(U,U), C(INF,INF), C(N,N) }, - { C(INF,-INF), C(INF,-0.), C(INF,-0.), C(INF,0.), C(INF,0.), C(INF,INF), C(INF,N) }, - { C(INF,-INF), C(N,N), C(N,N), C(N,N), C(N,N), C(INF,INF), C(N,N) } + { {INF,-INF}, {0.,-INF}, {0.,-INF}, {0.,INF}, {0.,INF}, {INF,INF}, {N,INF} }, + { {INF,-INF}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {U,U}, {U,U}, {U,U}, {U,U}, {INF,INF}, {N,N} }, + { {INF,-INF}, {INF,-0.}, {INF,-0.}, {INF,0.}, {INF,0.}, {INF,INF}, {INF,N} }, + { {INF,-INF}, {N,N}, {N,N}, {N,N}, {N,N}, {INF,INF}, {N,N} } }; /*[clinic input] @@ -859,13 +858,13 @@ cmath_tan_impl(PyObject *module, Py_complex z) /* tanh(infinity + i*y) needs to be dealt with specially */ static Py_complex tanh_special_values[7][7] = { - { C(-1.,0.), C(U,U), C(-1.,-0.), C(-1.,0.), C(U,U), C(-1.,0.), C(-1.,0.) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(-0.0,N), C(U,U), C(-0.,-0.), C(-0.,0.), C(U,U), C(-0.0,N), C(-0.,N) }, - { C(0.0,N), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.0,N), C(0.,N) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(1.,0.), C(U,U), C(1.,-0.), C(1.,0.), C(U,U), C(1.,0.), C(1.,0.) }, - { C(N,N), C(N,N), C(N,-0.), C(N,0.), C(N,N), C(N,N), C(N,N) } + { {-1.,0.}, {U,U}, {-1.,-0.}, {-1.,0.}, {U,U}, {-1.,0.}, {-1.,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {-0.0,N}, {U,U}, {-0.,-0.}, {-0.,0.}, {U,U}, {-0.0,N}, {-0.,N} }, + { {0.0,N}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.0,N}, {0.,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {1.,0.}, {U,U}, {1.,-0.}, {1.,0.}, {U,U}, {1.,0.}, {1.,0.} }, + { {N,N}, {N,N}, {N,-0.}, {N,0.}, {N,N}, {N,N}, {N,N} } }; /*[clinic input] @@ -1050,13 +1049,13 @@ cmath_polar_impl(PyObject *module, Py_complex z) */ static Py_complex rect_special_values[7][7] = { - { C(INF,N), C(U,U), C(-INF,0.), C(-INF,-0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(0.,0.), C(U,U), C(-0.,0.), C(-0.,-0.), C(U,U), C(0.,0.), C(0.,0.) }, - { C(0.,0.), C(U,U), C(0.,-0.), C(0.,0.), C(U,U), C(0.,0.), C(0.,0.) }, - { C(N,N), C(U,U), C(U,U), C(U,U), C(U,U), C(N,N), C(N,N) }, - { C(INF,N), C(U,U), C(INF,-0.), C(INF,0.), C(U,U), C(INF,N), C(INF,N) }, - { C(N,N), C(N,N), C(N,0.), C(N,0.), C(N,N), C(N,N), C(N,N) } + { {INF,N}, {U,U}, {-INF,0.}, {-INF,-0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {0.,0.}, {U,U}, {-0.,0.}, {-0.,-0.}, {U,U}, {0.,0.}, {0.,0.} }, + { {0.,0.}, {U,U}, {0.,-0.}, {0.,0.}, {U,U}, {0.,0.}, {0.,0.} }, + { {N,N}, {U,U}, {U,U}, {U,U}, {U,U}, {N,N}, {N,N} }, + { {INF,N}, {U,U}, {INF,-0.}, {INF,0.}, {U,U}, {INF,N}, {INF,N} }, + { {N,N}, {N,N}, {N,0.}, {N,0.}, {N,N}, {N,N}, {N,N} } }; /*[clinic input]