Skip to content

Commit 68a34fa

Browse files
Forbid defaults other than NULL for the value of @Setter with @deleter
1 parent 89b8204 commit 68a34fa

2 files changed

Lines changed: 17 additions & 2 deletions

File tree

Lib/test/test_clinic.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2934,6 +2934,18 @@ class Foo "" ""
29342934
"a default value, used to delete the attribute")
29352935
self.expect_failure(block, expected_error)
29362936

2937+
block = """
2938+
module m
2939+
class Foo "" ""
2940+
@setter
2941+
@deleter
2942+
Foo.property
2943+
value: object = None
2944+
"""
2945+
expected_error = ("the value of @setter with @deleter can only have "
2946+
"NULL as a default value")
2947+
self.expect_failure(block, expected_error)
2948+
29372949
def test_setter_value_kind(self):
29382950
expected_error = "the value of @setter must be a positional parameter"
29392951
block = """

Tools/clinic/libclinic/dsl_parser.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1556,8 +1556,8 @@ def do_post_block_processing_cleanup(self, lineno: int) -> None:
15561556
func = self.function
15571557
if func.kind in (SETTER, SETTER_AND_DELETER):
15581558
# The new value is the only parameter of a setter. The setter
1559-
# of a deletable attribute is also called to delete it, hence the
1560-
# default value.
1559+
# of a deletable attribute is also called with NULL to delete it,
1560+
# hence the default value.
15611561
optional = func.kind is SETTER_AND_DELETER
15621562
if len(func.parameters) == 1:
15631563
# It is optional to declare the value, which is usually
@@ -1577,6 +1577,9 @@ def do_post_block_processing_cleanup(self, lineno: int) -> None:
15771577
"a default value, used to delete the attribute")
15781578
else:
15791579
fail("the value of @setter cannot have a default value")
1580+
if optional and p.default is not NULL:
1581+
fail("the value of @setter with @deleter can only have "
1582+
"NULL as a default value")
15801583

15811584
self.check_remaining_star(lineno)
15821585
try:

0 commit comments

Comments
 (0)