From 107c21c5d56682320b38c01b5575c1604a429239 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 17 Jul 2022 08:23:37 +0300 Subject: gh-94864: Fix PyArg_Parse* with deprecated format units "u" and "Z" (GH-94902) It returned 1 (success) when warnings are turned into exceptions. --- Lib/test/test_getargs2.py | 13 +++++++++++++ .../C API/2022-07-16-14-57-23.gh-issue-94864.Pb41ab.rst | 2 ++ Python/getargs.c | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/C API/2022-07-16-14-57-23.gh-issue-94864.Pb41ab.rst diff --git a/Lib/test/test_getargs2.py b/Lib/test/test_getargs2.py index e0db9e4..571cabb 100644 --- a/Lib/test/test_getargs2.py +++ b/Lib/test/test_getargs2.py @@ -2,6 +2,7 @@ import unittest import math import string import sys +import warnings from test import support from test.support import import_helper from test.support import warnings_helper @@ -999,6 +1000,9 @@ class String_TestCase(unittest.TestCase): self.assertRaises(TypeError, getargs_u, memoryview(b'memoryview')) with self.assertWarns(DeprecationWarning): self.assertRaises(TypeError, getargs_u, None) + with warnings.catch_warnings(): + warnings.simplefilter('error', DeprecationWarning) + self.assertRaises(DeprecationWarning, getargs_u, 'abc\xe9') @support.requires_legacy_unicode_capi def test_u_hash(self): @@ -1015,6 +1019,9 @@ class String_TestCase(unittest.TestCase): self.assertRaises(TypeError, getargs_u_hash, memoryview(b'memoryview')) with self.assertWarns(DeprecationWarning): self.assertRaises(TypeError, getargs_u_hash, None) + with warnings.catch_warnings(): + warnings.simplefilter('error', DeprecationWarning) + self.assertRaises(DeprecationWarning, getargs_u_hash, 'abc\xe9') @support.requires_legacy_unicode_capi def test_Z(self): @@ -1031,6 +1038,9 @@ class String_TestCase(unittest.TestCase): self.assertRaises(TypeError, getargs_Z, memoryview(b'memoryview')) with self.assertWarns(DeprecationWarning): self.assertIsNone(getargs_Z(None)) + with warnings.catch_warnings(): + warnings.simplefilter('error', DeprecationWarning) + self.assertRaises(DeprecationWarning, getargs_Z, 'abc\xe9') @support.requires_legacy_unicode_capi def test_Z_hash(self): @@ -1047,6 +1057,9 @@ class String_TestCase(unittest.TestCase): self.assertRaises(TypeError, getargs_Z_hash, memoryview(b'memoryview')) with self.assertWarns(DeprecationWarning): self.assertIsNone(getargs_Z_hash(None)) + with warnings.catch_warnings(): + warnings.simplefilter('error', DeprecationWarning) + self.assertRaises(DeprecationWarning, getargs_Z_hash, 'abc\xe9') class Object_TestCase(unittest.TestCase): diff --git a/Misc/NEWS.d/next/C API/2022-07-16-14-57-23.gh-issue-94864.Pb41ab.rst b/Misc/NEWS.d/next/C API/2022-07-16-14-57-23.gh-issue-94864.Pb41ab.rst new file mode 100644 index 0000000..ed2a954 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2022-07-16-14-57-23.gh-issue-94864.Pb41ab.rst @@ -0,0 +1,2 @@ +Fix ``PyArg_Parse*`` with deprecated format units "u" and "Z". It returned 1 +(success) when warnings are turned into exceptions. diff --git a/Python/getargs.c b/Python/getargs.c index a2ea4d7..d7ba9a1 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1017,7 +1017,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "getargs: The '%c' format is deprecated. Use 'U' instead.", c)) { - return NULL; + RETURN_ERR_OCCURRED; } _Py_COMP_DIAG_PUSH _Py_COMP_DIAG_IGNORE_DEPR_DECLS -- cgit v0.12