gh-112205: Require @getter and @setter to be methods (#113278)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Erlend E. Aasland 2023-12-19 12:32:28 +01:00 committed by GitHub
parent e51b400945
commit 6a69b80d1b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 0 deletions

View File

@ -2249,6 +2249,17 @@ class ClinicParserTest(TestCase):
expected_error = "Cannot apply both @getter and @setter to the same function!" expected_error = "Cannot apply both @getter and @setter to the same function!"
self.expect_failure(block, expected_error, lineno=3) self.expect_failure(block, expected_error, lineno=3)
def test_getset_no_class(self):
for annotation in "@getter", "@setter":
with self.subTest(annotation=annotation):
block = f"""
module m
{annotation}
m.func
"""
expected_error = "@getter and @setter must be methods"
self.expect_failure(block, expected_error, lineno=2)
def test_duplicate_coexist(self): def test_duplicate_coexist(self):
err = "Called @coexist twice" err = "Called @coexist twice"
block = """ block = """

View File

@ -5614,6 +5614,10 @@ class DSLParser:
function_name = fields.pop() function_name = fields.pop()
module, cls = self.clinic._module_and_class(fields) module, cls = self.clinic._module_and_class(fields)
if self.kind in {GETTER, SETTER}:
if not cls:
fail("@getter and @setter must be methods")
self.update_function_kind(full_name) self.update_function_kind(full_name)
if self.kind is METHOD_INIT and not return_converter: if self.kind is METHOD_INIT and not return_converter:
return_converter = init_return_converter() return_converter = init_return_converter()