summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-08-21 13:59:58 (GMT)
committerGitHub <noreply@github.com>2023-08-21 13:59:58 (GMT)
commit60942cccb18cfd43240c1a1eb5deab7b31fcb81c (patch)
treeca1623ac6c9afd3ac2e13ee1a2a8f244e61da27d /Modules
parent13104f3b7412dce9bf7cfd09bf2d6dad1f3cc2ed (diff)
downloadcpython-60942cccb18cfd43240c1a1eb5deab7b31fcb81c.zip
cpython-60942cccb18cfd43240c1a1eb5deab7b31fcb81c.tar.gz
cpython-60942cccb18cfd43240c1a1eb5deab7b31fcb81c.tar.bz2
gh-95065, gh-107704: Argument Clinic: support multiple '/ [from ...]' and '* [from ...]' markers (GH-108132)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_testclinic.c82
-rw-r--r--Modules/clinic/_testclinic_depr.c.h363
2 files changed, 413 insertions, 32 deletions
diff --git a/Modules/_testclinic.c b/Modules/_testclinic.c
index efec04d..2e0535d 100644
--- a/Modules/_testclinic.c
+++ b/Modules/_testclinic.c
@@ -1581,6 +1581,32 @@ depr_star_noinline_impl(PyObject *module, PyObject *a, PyObject *b,
/*[clinic input]
+depr_star_multi
+ a: object
+ * [from 3.16]
+ b: object
+ * [from 3.15]
+ c: object
+ d: object
+ * [from 3.14]
+ e: object
+ f: object
+ g: object
+ *
+ h: object
+[clinic start generated code]*/
+
+static PyObject *
+depr_star_multi_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c,
+ PyObject *d, PyObject *e, PyObject *f, PyObject *g,
+ PyObject *h)
+/*[clinic end generated code: output=77681653f4202068 input=3ebd05d888a957ea]*/
+{
+ Py_RETURN_NONE;
+}
+
+
+/*[clinic input]
depr_kwd_required_1
a: object
/
@@ -1702,6 +1728,59 @@ depr_kwd_noinline_impl(PyObject *module, PyObject *a, PyObject *b,
Py_RETURN_NONE;
}
+
+/*[clinic input]
+depr_kwd_multi
+ a: object
+ /
+ b: object
+ / [from 3.14]
+ c: object
+ d: object
+ / [from 3.15]
+ e: object
+ f: object
+ g: object
+ / [from 3.16]
+ h: object
+[clinic start generated code]*/
+
+static PyObject *
+depr_kwd_multi_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c,
+ PyObject *d, PyObject *e, PyObject *f, PyObject *g,
+ PyObject *h)
+/*[clinic end generated code: output=ddfbde80fe1942e1 input=7a074e621c79efd7]*/
+{
+ Py_RETURN_NONE;
+}
+
+
+/*[clinic input]
+depr_multi
+ a: object
+ /
+ b: object
+ / [from 3.14]
+ c: object
+ / [from 3.15]
+ d: object
+ * [from 3.15]
+ e: object
+ * [from 3.14]
+ f: object
+ *
+ g: object
+[clinic start generated code]*/
+
+static PyObject *
+depr_multi_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c,
+ PyObject *d, PyObject *e, PyObject *f, PyObject *g)
+/*[clinic end generated code: output=f81c92852ca2d4ee input=5b847c5e44bedd02]*/
+{
+ Py_RETURN_NONE;
+}
+
+
// Reset PY_VERSION_HEX
#undef PY_VERSION_HEX
#define PY_VERSION_HEX _SAVED_PY_VERSION
@@ -1779,6 +1858,7 @@ static PyMethodDef tester_methods[] = {
DEPR_STAR_POS2_LEN2_METHODDEF
DEPR_STAR_POS2_LEN2_WITH_KWD_METHODDEF
DEPR_STAR_NOINLINE_METHODDEF
+ DEPR_STAR_MULTI_METHODDEF
DEPR_KWD_REQUIRED_1_METHODDEF
DEPR_KWD_REQUIRED_2_METHODDEF
DEPR_KWD_OPTIONAL_1_METHODDEF
@@ -1786,6 +1866,8 @@ static PyMethodDef tester_methods[] = {
DEPR_KWD_OPTIONAL_3_METHODDEF
DEPR_KWD_REQUIRED_OPTIONAL_METHODDEF
DEPR_KWD_NOINLINE_METHODDEF
+ DEPR_KWD_MULTI_METHODDEF
+ DEPR_MULTI_METHODDEF
{NULL, NULL}
};
diff --git a/Modules/clinic/_testclinic_depr.c.h b/Modules/clinic/_testclinic_depr.c.h
index 661fdaf..b8365bd 100644
--- a/Modules/clinic/_testclinic_depr.c.h
+++ b/Modules/clinic/_testclinic_depr.c.h
@@ -419,8 +419,7 @@ PyDoc_STRVAR(depr_kwd_new__doc__,
"The deprecation message should use the class name instead of __new__.\n"
"\n"
"Note: Passing keyword argument \'a\' to _testclinic.DeprKwdNew() is\n"
-"deprecated. Corresponding parameter will become positional-only in\n"
-"Python 3.14.\n"
+"deprecated. Parameter \'a\' will become positional-only in Python 3.14.\n"
"");
static PyObject *
@@ -479,8 +478,8 @@ depr_kwd_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
if (kwargs && PyDict_GET_SIZE(kwargs) && nargs < 1 && fastargs[0]) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword argument 'a' to _testclinic.DeprKwdNew() is "
- "deprecated. Corresponding parameter will become positional-only "
- "in Python 3.14.", 1))
+ "deprecated. Parameter 'a' will become positional-only in Python "
+ "3.14.", 1))
{
goto exit;
}
@@ -503,8 +502,7 @@ PyDoc_STRVAR(depr_kwd_init__doc__,
"The deprecation message should use the class name instead of __init__.\n"
"\n"
"Note: Passing keyword argument \'a\' to _testclinic.DeprKwdInit() is\n"
-"deprecated. Corresponding parameter will become positional-only in\n"
-"Python 3.14.\n"
+"deprecated. Parameter \'a\' will become positional-only in Python 3.14.\n"
"");
static int
@@ -563,8 +561,8 @@ depr_kwd_init(PyObject *self, PyObject *args, PyObject *kwargs)
if (kwargs && PyDict_GET_SIZE(kwargs) && nargs < 1 && fastargs[0]) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword argument 'a' to _testclinic.DeprKwdInit() is "
- "deprecated. Corresponding parameter will become positional-only "
- "in Python 3.14.", 1))
+ "deprecated. Parameter 'a' will become positional-only in Python "
+ "3.14.", 1))
{
goto exit;
}
@@ -641,8 +639,8 @@ depr_kwd_init_noinline(PyObject *self, PyObject *args, PyObject *kwargs)
}
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword arguments 'b' and 'c' to "
- "_testclinic.DeprKwdInitNoInline() is deprecated. Corresponding "
- "parameters will become positional-only in Python 3.14.", 1))
+ "_testclinic.DeprKwdInitNoInline() is deprecated. Parameters 'b' "
+ "and 'c' will become positional-only in Python 3.14.", 1))
{
goto exit;
}
@@ -1482,13 +1480,110 @@ exit:
return return_value;
}
+PyDoc_STRVAR(depr_star_multi__doc__,
+"depr_star_multi($module, /, a, b, c, d, e, f, g, *, h)\n"
+"--\n"
+"\n"
+"Note: Passing more than 1 positional argument to depr_star_multi() is\n"
+"deprecated. Parameter \'b\' will become a keyword-only parameter in\n"
+"Python 3.16. Parameters \'c\' and \'d\' will become keyword-only\n"
+"parameters in Python 3.15. Parameters \'e\', \'f\' and \'g\' will become\n"
+"keyword-only parameters in Python 3.14.\n"
+"");
+
+#define DEPR_STAR_MULTI_METHODDEF \
+ {"depr_star_multi", _PyCFunction_CAST(depr_star_multi), METH_FASTCALL|METH_KEYWORDS, depr_star_multi__doc__},
+
+static PyObject *
+depr_star_multi_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c,
+ PyObject *d, PyObject *e, PyObject *f, PyObject *g,
+ PyObject *h);
+
+// Emit compiler warnings when we get to Python 3.14.
+#if PY_VERSION_HEX >= 0x030e00C0
+# error "Update the clinic input of 'depr_star_multi'."
+#elif PY_VERSION_HEX >= 0x030e00A0
+# ifdef _MSC_VER
+# pragma message ("Update the clinic input of 'depr_star_multi'.")
+# else
+# warning "Update the clinic input of 'depr_star_multi'."
+# endif
+#endif
+
+static PyObject *
+depr_star_multi(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 8
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { &_Py_ID(a), &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), &_Py_ID(f), &_Py_ID(g), &_Py_ID(h), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"a", "b", "c", "d", "e", "f", "g", "h", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "depr_star_multi",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[8];
+ PyObject *a;
+ PyObject *b;
+ PyObject *c;
+ PyObject *d;
+ PyObject *e;
+ PyObject *f;
+ PyObject *g;
+ PyObject *h;
+
+ if (nargs > 1 && nargs <= 7) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "Passing more than 1 positional argument to depr_star_multi() is "
+ "deprecated. Parameter 'b' will become a keyword-only parameter "
+ "in Python 3.16. Parameters 'c' and 'd' will become keyword-only "
+ "parameters in Python 3.15. Parameters 'e', 'f' and 'g' will "
+ "become keyword-only parameters in Python 3.14.", 1))
+ {
+ goto exit;
+ }
+ }
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 7, 7, 1, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ a = args[0];
+ b = args[1];
+ c = args[2];
+ d = args[3];
+ e = args[4];
+ f = args[5];
+ g = args[6];
+ h = args[7];
+ return_value = depr_star_multi_impl(module, a, b, c, d, e, f, g, h);
+
+exit:
+ return return_value;
+}
+
PyDoc_STRVAR(depr_kwd_required_1__doc__,
"depr_kwd_required_1($module, a, /, b)\n"
"--\n"
"\n"
"Note: Passing keyword argument \'b\' to depr_kwd_required_1() is\n"
-"deprecated. Corresponding parameter will become positional-only in\n"
-"Python 3.14.\n"
+"deprecated. Parameter \'b\' will become positional-only in Python 3.14.\n"
"");
#define DEPR_KWD_REQUIRED_1_METHODDEF \
@@ -1548,8 +1643,8 @@ depr_kwd_required_1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
if (nargs < 2) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword argument 'b' to depr_kwd_required_1() is "
- "deprecated. Corresponding parameter will become positional-only "
- "in Python 3.14.", 1))
+ "deprecated. Parameter 'b' will become positional-only in Python "
+ "3.14.", 1))
{
goto exit;
}
@@ -1567,7 +1662,7 @@ PyDoc_STRVAR(depr_kwd_required_2__doc__,
"--\n"
"\n"
"Note: Passing keyword arguments \'b\' and \'c\' to depr_kwd_required_2()\n"
-"is deprecated. Corresponding parameters will become positional-only in\n"
+"is deprecated. Parameters \'b\' and \'c\' will become positional-only in\n"
"Python 3.14.\n"
"");
@@ -1630,7 +1725,7 @@ depr_kwd_required_2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
if (nargs < 3) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword arguments 'b' and 'c' to depr_kwd_required_2() "
- "is deprecated. Corresponding parameters will become "
+ "is deprecated. Parameters 'b' and 'c' will become "
"positional-only in Python 3.14.", 1))
{
goto exit;
@@ -1650,8 +1745,7 @@ PyDoc_STRVAR(depr_kwd_optional_1__doc__,
"--\n"
"\n"
"Note: Passing keyword argument \'b\' to depr_kwd_optional_1() is\n"
-"deprecated. Corresponding parameter will become positional-only in\n"
-"Python 3.14.\n"
+"deprecated. Parameter \'b\' will become positional-only in Python 3.14.\n"
"");
#define DEPR_KWD_OPTIONAL_1_METHODDEF \
@@ -1712,8 +1806,8 @@ depr_kwd_optional_1(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
if (kwnames && PyTuple_GET_SIZE(kwnames) && nargs < 2 && args[1]) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword argument 'b' to depr_kwd_optional_1() is "
- "deprecated. Corresponding parameter will become positional-only "
- "in Python 3.14.", 1))
+ "deprecated. Parameter 'b' will become positional-only in Python "
+ "3.14.", 1))
{
goto exit;
}
@@ -1735,7 +1829,7 @@ PyDoc_STRVAR(depr_kwd_optional_2__doc__,
"--\n"
"\n"
"Note: Passing keyword arguments \'b\' and \'c\' to depr_kwd_optional_2()\n"
-"is deprecated. Corresponding parameters will become positional-only in\n"
+"is deprecated. Parameters \'b\' and \'c\' will become positional-only in\n"
"Python 3.14.\n"
"");
@@ -1799,7 +1893,7 @@ depr_kwd_optional_2(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
if (kwnames && PyTuple_GET_SIZE(kwnames) && ((nargs < 2 && args[1]) || (nargs < 3 && args[2]))) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword arguments 'b' and 'c' to depr_kwd_optional_2() "
- "is deprecated. Corresponding parameters will become "
+ "is deprecated. Parameters 'b' and 'c' will become "
"positional-only in Python 3.14.", 1))
{
goto exit;
@@ -1828,7 +1922,7 @@ PyDoc_STRVAR(depr_kwd_optional_3__doc__,
"--\n"
"\n"
"Note: Passing keyword arguments \'a\', \'b\' and \'c\' to\n"
-"depr_kwd_optional_3() is deprecated. Corresponding parameters will\n"
+"depr_kwd_optional_3() is deprecated. Parameters \'a\', \'b\' and \'c\' will\n"
"become positional-only in Python 3.14.\n"
"");
@@ -1892,8 +1986,8 @@ depr_kwd_optional_3(PyObject *module, PyObject *const *args, Py_ssize_t nargs, P
if (kwnames && PyTuple_GET_SIZE(kwnames) && ((nargs < 1 && args[0]) || (nargs < 2 && args[1]) || (nargs < 3 && args[2]))) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword arguments 'a', 'b' and 'c' to "
- "depr_kwd_optional_3() is deprecated. Corresponding parameters "
- "will become positional-only in Python 3.14.", 1))
+ "depr_kwd_optional_3() is deprecated. Parameters 'a', 'b' and 'c'"
+ " will become positional-only in Python 3.14.", 1))
{
goto exit;
}
@@ -1926,7 +2020,7 @@ PyDoc_STRVAR(depr_kwd_required_optional__doc__,
"--\n"
"\n"
"Note: Passing keyword arguments \'b\' and \'c\' to\n"
-"depr_kwd_required_optional() is deprecated. Corresponding parameters\n"
+"depr_kwd_required_optional() is deprecated. Parameters \'b\' and \'c\'\n"
"will become positional-only in Python 3.14.\n"
"");
@@ -1990,8 +2084,8 @@ depr_kwd_required_optional(PyObject *module, PyObject *const *args, Py_ssize_t n
if (kwnames && PyTuple_GET_SIZE(kwnames) && ((nargs < 2) || (nargs < 3 && args[2]))) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword arguments 'b' and 'c' to "
- "depr_kwd_required_optional() is deprecated. Corresponding "
- "parameters will become positional-only in Python 3.14.", 1))
+ "depr_kwd_required_optional() is deprecated. Parameters 'b' and "
+ "'c' will become positional-only in Python 3.14.", 1))
{
goto exit;
}
@@ -2014,7 +2108,7 @@ PyDoc_STRVAR(depr_kwd_noinline__doc__,
"--\n"
"\n"
"Note: Passing keyword arguments \'b\' and \'c\' to depr_kwd_noinline() is\n"
-"deprecated. Corresponding parameters will become positional-only in\n"
+"deprecated. Parameters \'b\' and \'c\' will become positional-only in\n"
"Python 3.14.\n"
"");
@@ -2081,8 +2175,8 @@ depr_kwd_noinline(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyO
}
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"Passing keyword arguments 'b' and 'c' to depr_kwd_noinline() is "
- "deprecated. Corresponding parameters will become positional-only"
- " in Python 3.14.", 1))
+ "deprecated. Parameters 'b' and 'c' will become positional-only "
+ "in Python 3.14.", 1))
{
goto exit;
}
@@ -2092,4 +2186,209 @@ depr_kwd_noinline(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyO
exit:
return return_value;
}
-/*[clinic end generated code: output=fc558c1efdcab076 input=a9049054013a1b77]*/
+
+PyDoc_STRVAR(depr_kwd_multi__doc__,
+"depr_kwd_multi($module, a, /, b, c, d, e, f, g, h)\n"
+"--\n"
+"\n"
+"Note: Passing keyword arguments \'b\', \'c\', \'d\', \'e\', \'f\' and \'g\' to\n"
+"depr_kwd_multi() is deprecated. Parameter \'b\' will become positional-\n"
+"only in Python 3.14. Parameters \'c\' and \'d\' will become positional-\n"
+"only in Python 3.15. Parameters \'e\', \'f\' and \'g\' will become\n"
+"positional-only in Python 3.16.\n"
+"");
+
+#define DEPR_KWD_MULTI_METHODDEF \
+ {"depr_kwd_multi", _PyCFunction_CAST(depr_kwd_multi), METH_FASTCALL|METH_KEYWORDS, depr_kwd_multi__doc__},
+
+static PyObject *
+depr_kwd_multi_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c,
+ PyObject *d, PyObject *e, PyObject *f, PyObject *g,
+ PyObject *h);
+
+// Emit compiler warnings when we get to Python 3.14.
+#if PY_VERSION_HEX >= 0x030e00C0
+# error "Update the clinic input of 'depr_kwd_multi'."
+#elif PY_VERSION_HEX >= 0x030e00A0
+# ifdef _MSC_VER
+# pragma message ("Update the clinic input of 'depr_kwd_multi'.")
+# else
+# warning "Update the clinic input of 'depr_kwd_multi'."
+# endif
+#endif
+
+static PyObject *
+depr_kwd_multi(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 7
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), &_Py_ID(f), &_Py_ID(g), &_Py_ID(h), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"", "b", "c", "d", "e", "f", "g", "h", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "depr_kwd_multi",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[8];
+ PyObject *a;
+ PyObject *b;
+ PyObject *c;
+ PyObject *d;
+ PyObject *e;
+ PyObject *f;
+ PyObject *g;
+ PyObject *h;
+
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 8, 8, 0, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ if (nargs < 7) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "Passing keyword arguments 'b', 'c', 'd', 'e', 'f' and 'g' to "
+ "depr_kwd_multi() is deprecated. Parameter 'b' will become "
+ "positional-only in Python 3.14. Parameters 'c' and 'd' will "
+ "become positional-only in Python 3.15. Parameters 'e', 'f' and "
+ "'g' will become positional-only in Python 3.16.", 1))
+ {
+ goto exit;
+ }
+ }
+ a = args[0];
+ b = args[1];
+ c = args[2];
+ d = args[3];
+ e = args[4];
+ f = args[5];
+ g = args[6];
+ h = args[7];
+ return_value = depr_kwd_multi_impl(module, a, b, c, d, e, f, g, h);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(depr_multi__doc__,
+"depr_multi($module, a, /, b, c, d, e, f, *, g)\n"
+"--\n"
+"\n"
+"Note: Passing keyword arguments \'b\' and \'c\' to depr_multi() is\n"
+"deprecated. Parameter \'b\' will become positional-only in Python 3.14.\n"
+"Parameter \'c\' will become positional-only in Python 3.15.\n"
+"\n"
+"\n"
+"Note: Passing more than 4 positional arguments to depr_multi() is\n"
+"deprecated. Parameter \'e\' will become a keyword-only parameter in\n"
+"Python 3.15. Parameter \'f\' will become a keyword-only parameter in\n"
+"Python 3.14.\n"
+"");
+
+#define DEPR_MULTI_METHODDEF \
+ {"depr_multi", _PyCFunction_CAST(depr_multi), METH_FASTCALL|METH_KEYWORDS, depr_multi__doc__},
+
+static PyObject *
+depr_multi_impl(PyObject *module, PyObject *a, PyObject *b, PyObject *c,
+ PyObject *d, PyObject *e, PyObject *f, PyObject *g);
+
+// Emit compiler warnings when we get to Python 3.14.
+#if PY_VERSION_HEX >= 0x030e00C0
+# error "Update the clinic input of 'depr_multi'."
+#elif PY_VERSION_HEX >= 0x030e00A0
+# ifdef _MSC_VER
+# pragma message ("Update the clinic input of 'depr_multi'.")
+# else
+# warning "Update the clinic input of 'depr_multi'."
+# endif
+#endif
+
+static PyObject *
+depr_multi(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
+{
+ PyObject *return_value = NULL;
+ #if defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_MODULE)
+
+ #define NUM_KEYWORDS 6
+ static struct {
+ PyGC_Head _this_is_not_used;
+ PyObject_VAR_HEAD
+ PyObject *ob_item[NUM_KEYWORDS];
+ } _kwtuple = {
+ .ob_base = PyVarObject_HEAD_INIT(&PyTuple_Type, NUM_KEYWORDS)
+ .ob_item = { &_Py_ID(b), &_Py_ID(c), &_Py_ID(d), &_Py_ID(e), &_Py_ID(f), &_Py_ID(g), },
+ };
+ #undef NUM_KEYWORDS
+ #define KWTUPLE (&_kwtuple.ob_base.ob_base)
+
+ #else // !Py_BUILD_CORE
+ # define KWTUPLE NULL
+ #endif // !Py_BUILD_CORE
+
+ static const char * const _keywords[] = {"", "b", "c", "d", "e", "f", "g", NULL};
+ static _PyArg_Parser _parser = {
+ .keywords = _keywords,
+ .fname = "depr_multi",
+ .kwtuple = KWTUPLE,
+ };
+ #undef KWTUPLE
+ PyObject *argsbuf[7];
+ PyObject *a;
+ PyObject *b;
+ PyObject *c;
+ PyObject *d;
+ PyObject *e;
+ PyObject *f;
+ PyObject *g;
+
+ if (nargs > 4 && nargs <= 6) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "Passing more than 4 positional arguments to depr_multi() is "
+ "deprecated. Parameter 'e' will become a keyword-only parameter "
+ "in Python 3.15. Parameter 'f' will become a keyword-only "
+ "parameter in Python 3.14.", 1))
+ {
+ goto exit;
+ }
+ }
+ args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 6, 6, 1, argsbuf);
+ if (!args) {
+ goto exit;
+ }
+ if (nargs < 3) {
+ if (PyErr_WarnEx(PyExc_DeprecationWarning,
+ "Passing keyword arguments 'b' and 'c' to depr_multi() is "
+ "deprecated. Parameter 'b' will become positional-only in Python "
+ "3.14. Parameter 'c' will become positional-only in Python 3.15.", 1))
+ {
+ goto exit;
+ }
+ }
+ a = args[0];
+ b = args[1];
+ c = args[2];
+ d = args[3];
+ e = args[4];
+ f = args[5];
+ g = args[6];
+ return_value = depr_multi_impl(module, a, b, c, d, e, f, g);
+
+exit:
+ return return_value;
+}
+/*[clinic end generated code: output=ee8b1933e4bf4dc4 input=a9049054013a1b77]*/