summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/clinic.test.c41
-rw-r--r--Lib/test/test_clinic.py8
-rwxr-xr-xTools/clinic/clinic.py2
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)