mirror of
https://github.com/python/cpython.git
synced 2025-07-29 06:05:00 +00:00
gh-95504: Fix negative numbers in PyUnicode_FromFormat (GH-95848)
Co-authored-by: philg314 <110174000+philg314@users.noreply.github.com>
This commit is contained in:
parent
cf28540fd3
commit
71c3d649b5
5 changed files with 86 additions and 7 deletions
|
@ -433,6 +433,16 @@ test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
CHECK_FORMAT_1("%05zu", "00123", (size_t)123);
|
||||
CHECK_FORMAT_1("%05x", "0007b", (int)123);
|
||||
|
||||
CHECK_FORMAT_1("%05d", "-0123", (int)-123);
|
||||
CHECK_FORMAT_1("%05i", "-0123", (int)-123);
|
||||
CHECK_FORMAT_1("%05ld", "-0123", (long)-123);
|
||||
CHECK_FORMAT_1("%05li", "-0123", (long)-123);
|
||||
CHECK_FORMAT_1("%05lld", "-0123", (long long)-123);
|
||||
CHECK_FORMAT_1("%05lli", "-0123", (long long)-123);
|
||||
CHECK_FORMAT_1("%05zd", "-0123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%05zi", "-0123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%09x", "0ffffff85", (int)-123);
|
||||
|
||||
// Integers: precision < length
|
||||
CHECK_FORMAT_1("%.1d", "123", (int)123);
|
||||
CHECK_FORMAT_1("%.1i", "123", (int)123);
|
||||
|
@ -473,6 +483,16 @@ test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
CHECK_FORMAT_1("%.5zu", "00123", (size_t)123);
|
||||
CHECK_FORMAT_1("%.5x", "0007b", (int)123);
|
||||
|
||||
CHECK_FORMAT_1("%.5d", "-00123", (int)-123);
|
||||
CHECK_FORMAT_1("%.5i", "-00123", (int)-123);
|
||||
CHECK_FORMAT_1("%.5ld", "-00123", (long)-123);
|
||||
CHECK_FORMAT_1("%.5li", "-00123", (long)-123);
|
||||
CHECK_FORMAT_1("%.5lld", "-00123", (long long)-123);
|
||||
CHECK_FORMAT_1("%.5lli", "-00123", (long long)-123);
|
||||
CHECK_FORMAT_1("%.5zd", "-00123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%.5zi", "-00123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%.9x", "0ffffff85", (int)-123);
|
||||
|
||||
// Integers: width > precision > length
|
||||
CHECK_FORMAT_1("%7.5d", " 00123", (int)123);
|
||||
CHECK_FORMAT_1("%7.5i", " 00123", (int)123);
|
||||
|
@ -488,6 +508,16 @@ test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
CHECK_FORMAT_1("%7.5zu", " 00123", (size_t)123);
|
||||
CHECK_FORMAT_1("%7.5x", " 0007b", (int)123);
|
||||
|
||||
CHECK_FORMAT_1("%7.5d", " -00123", (int)-123);
|
||||
CHECK_FORMAT_1("%7.5i", " -00123", (int)-123);
|
||||
CHECK_FORMAT_1("%7.5ld", " -00123", (long)-123);
|
||||
CHECK_FORMAT_1("%7.5li", " -00123", (long)-123);
|
||||
CHECK_FORMAT_1("%7.5lld", " -00123", (long long)-123);
|
||||
CHECK_FORMAT_1("%7.5lli", " -00123", (long long)-123);
|
||||
CHECK_FORMAT_1("%7.5zd", " -00123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%7.5zi", " -00123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%10.9x", " 0ffffff85", (int)-123);
|
||||
|
||||
// Integers: width > precision > length, 0-flag
|
||||
CHECK_FORMAT_1("%07.5d", "0000123", (int)123);
|
||||
CHECK_FORMAT_1("%07.5i", "0000123", (int)123);
|
||||
|
@ -503,6 +533,16 @@ test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
CHECK_FORMAT_1("%07.5zu", "0000123", (size_t)123);
|
||||
CHECK_FORMAT_1("%07.5x", "000007b", (int)123);
|
||||
|
||||
CHECK_FORMAT_1("%07.5d", "-000123", (int)-123);
|
||||
CHECK_FORMAT_1("%07.5i", "-000123", (int)-123);
|
||||
CHECK_FORMAT_1("%07.5ld", "-000123", (long)-123);
|
||||
CHECK_FORMAT_1("%07.5li", "-000123", (long)-123);
|
||||
CHECK_FORMAT_1("%07.5lld", "-000123", (long long)-123);
|
||||
CHECK_FORMAT_1("%07.5lli", "-000123", (long long)-123);
|
||||
CHECK_FORMAT_1("%07.5zd", "-000123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%07.5zi", "-000123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%010.9x", "00ffffff85", (int)-123);
|
||||
|
||||
// Integers: precision > width > length
|
||||
CHECK_FORMAT_1("%5.7d", "0000123", (int)123);
|
||||
CHECK_FORMAT_1("%5.7i", "0000123", (int)123);
|
||||
|
@ -518,6 +558,16 @@ test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
CHECK_FORMAT_1("%5.7zu", "0000123", (size_t)123);
|
||||
CHECK_FORMAT_1("%5.7x", "000007b", (int)123);
|
||||
|
||||
CHECK_FORMAT_1("%5.7d", "-0000123", (int)-123);
|
||||
CHECK_FORMAT_1("%5.7i", "-0000123", (int)-123);
|
||||
CHECK_FORMAT_1("%5.7ld", "-0000123", (long)-123);
|
||||
CHECK_FORMAT_1("%5.7li", "-0000123", (long)-123);
|
||||
CHECK_FORMAT_1("%5.7lld", "-0000123", (long long)-123);
|
||||
CHECK_FORMAT_1("%5.7lli", "-0000123", (long long)-123);
|
||||
CHECK_FORMAT_1("%5.7zd", "-0000123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%5.7zi", "-0000123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%9.10x", "00ffffff85", (int)-123);
|
||||
|
||||
// Integers: precision > width > length, 0-flag
|
||||
CHECK_FORMAT_1("%05.7d", "0000123", (int)123);
|
||||
CHECK_FORMAT_1("%05.7i", "0000123", (int)123);
|
||||
|
@ -533,6 +583,16 @@ test_string_from_format(PyObject *self, PyObject *Py_UNUSED(ignored))
|
|||
CHECK_FORMAT_1("%05.7zu", "0000123", (size_t)123);
|
||||
CHECK_FORMAT_1("%05.7x", "000007b", (int)123);
|
||||
|
||||
CHECK_FORMAT_1("%05.7d", "-0000123", (int)-123);
|
||||
CHECK_FORMAT_1("%05.7i", "-0000123", (int)-123);
|
||||
CHECK_FORMAT_1("%05.7ld", "-0000123", (long)-123);
|
||||
CHECK_FORMAT_1("%05.7li", "-0000123", (long)-123);
|
||||
CHECK_FORMAT_1("%05.7lld", "-0000123", (long long)-123);
|
||||
CHECK_FORMAT_1("%05.7lli", "-0000123", (long long)-123);
|
||||
CHECK_FORMAT_1("%05.7zd", "-0000123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%05.7zi", "-0000123", (Py_ssize_t)-123);
|
||||
CHECK_FORMAT_1("%09.10x", "00ffffff85", (int)-123);
|
||||
|
||||
// Integers: precision = 0, arg = 0 (empty string in C)
|
||||
CHECK_FORMAT_1("%.0d", "0", (int)0);
|
||||
CHECK_FORMAT_1("%.0i", "0", (int)0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue