From cc6f807760300b575195bb8e678b82c10e24231c Mon Sep 17 00:00:00 2001 From: "Erlend E. Aasland" Date: Fri, 1 Mar 2024 18:41:20 +0100 Subject: gh-116171: Argument Clinic: disallow overriding return converter for __init__ methods (#116172) --- Lib/test/clinic.test.c | 41 ----------------------------------------- Lib/test/test_clinic.py | 8 ++++++++ Tools/clinic/clinic.py | 2 ++ 3 files changed, 10 insertions(+), 41 deletions(-) diff --git a/Lib/test/clinic.test.c b/Lib/test/clinic.test.c index 168f6f7..e4dbb70 100644 --- a/Lib/test/clinic.test.c +++ b/Lib/test/clinic.test.c @@ -5327,47 +5327,6 @@ Test__pyarg_parsestackandkeywords_impl(TestObj *self, PyTypeObject *cls, /*[clinic end generated code: output=4fda8a7f2547137c input=fc72ef4b4cfafabc]*/ -/*[clinic input] -Test.__init__ -> long -Test overriding the __init__ return converter -[clinic start generated code]*/ - -PyDoc_STRVAR(Test___init____doc__, -"Test()\n" -"--\n" -"\n" -"Test overriding the __init__ return converter"); - -static long -Test___init___impl(TestObj *self); - -static int -Test___init__(PyObject *self, PyObject *args, PyObject *kwargs) -{ - int return_value = -1; - PyTypeObject *base_tp = TestType; - long _return_value; - - if ((Py_IS_TYPE(self, base_tp) || - Py_TYPE(self)->tp_new == base_tp->tp_new) && - !_PyArg_NoPositional("Test", args)) { - goto exit; - } - if ((Py_IS_TYPE(self, base_tp) || - Py_TYPE(self)->tp_new == base_tp->tp_new) && - !_PyArg_NoKeywords("Test", kwargs)) { - goto exit; - } - _return_value = Test___init___impl((TestObj *)self); - if ((_return_value == -1) && PyErr_Occurred()) { - goto exit; - } - return_value = PyLong_FromLong(_return_value); - -exit: - return return_value; -} - static long Test___init___impl(TestObj *self) /*[clinic end generated code: output=daf6ee12c4e443fb input=311af0dc7f17e8e9]*/ diff --git a/Lib/test/test_clinic.py b/Lib/test/test_clinic.py index f5e9b11..0a16f98 100644 --- a/Lib/test/test_clinic.py +++ b/Lib/test/test_clinic.py @@ -2146,6 +2146,14 @@ class ClinicParserTest(TestCase): expected_error = err_template.format(invalid_kind) self.expect_failure(block, expected_error, lineno=3) + def test_init_cannot_define_a_return_type(self): + block = """ + class Foo "" "" + Foo.__init__ -> long + """ + expected_error = "__init__ methods cannot define a return type" + self.expect_failure(block, expected_error, lineno=1) + def test_invalid_getset(self): annotations = ["@getter", "@setter"] for annotation in annotations: diff --git a/Tools/clinic/clinic.py b/Tools/clinic/clinic.py index 7906e7c..80da035 100755 --- a/Tools/clinic/clinic.py +++ b/Tools/clinic/clinic.py @@ -5092,6 +5092,8 @@ class DSLParser: if forced_converter: if self.kind in {GETTER, SETTER}: fail(f"@{self.kind.name.lower()} method cannot define a return type") + if self.kind is METHOD_INIT: + fail("__init__ methods cannot define a return type") ast_input = f"def x() -> {forced_converter}: pass" try: module_node = ast.parse(ast_input) -- cgit v0.12