From 48e837e4368040fffd1629a80a4ca18d7b16da7c Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Mon, 22 Jun 2026 15:38:26 -0400 Subject: [PATCH] Dynamic constant writes on operator writes --- src/prism.c | 12 ++++++++++++ .../constant_operator_assignment_in_method.txt | 9 +++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/prism/errors/constant_operator_assignment_in_method.txt diff --git a/src/prism.c b/src/prism.c index 0512afae41..30d0a16749 100644 --- a/src/prism.c +++ b/src/prism.c @@ -21283,6 +21283,10 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, flags, PM_ERR_EXPECT_EXPRESSION_AFTER_AMPAMPEQ, (uint16_t) (depth + 1)); pm_node_t *write = UP(pm_constant_and_write_node_create(parser, (pm_constant_read_node_t *) node, &token, value)); + if (context_def_p(parser)) { + pm_parser_err_node(parser, write, PM_ERR_WRITE_TARGET_IN_METHOD); + } + return parse_shareable_constant_write(parser, write); } case PM_INSTANCE_VARIABLE_READ_NODE: { @@ -21408,6 +21412,10 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, flags, PM_ERR_EXPECT_EXPRESSION_AFTER_PIPEPIPEEQ, (uint16_t) (depth + 1)); pm_node_t *write = UP(pm_constant_or_write_node_create(parser, (pm_constant_read_node_t *) node, &token, value)); + if (context_def_p(parser)) { + pm_parser_err_node(parser, write, PM_ERR_WRITE_TARGET_IN_METHOD); + } + return parse_shareable_constant_write(parser, write); } case PM_INSTANCE_VARIABLE_READ_NODE: { @@ -21543,6 +21551,10 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t pm_node_t *value = parse_assignment_value(parser, previous_binding_power, binding_power, flags, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1)); pm_node_t *write = UP(pm_constant_operator_write_node_create(parser, (pm_constant_read_node_t *) node, &token, value)); + if (context_def_p(parser)) { + pm_parser_err_node(parser, write, PM_ERR_WRITE_TARGET_IN_METHOD); + } + return parse_shareable_constant_write(parser, write); } case PM_INSTANCE_VARIABLE_READ_NODE: { diff --git a/test/prism/errors/constant_operator_assignment_in_method.txt b/test/prism/errors/constant_operator_assignment_in_method.txt new file mode 100644 index 0000000000..7115d590a2 --- /dev/null +++ b/test/prism/errors/constant_operator_assignment_in_method.txt @@ -0,0 +1,9 @@ +def foo();A+=1;end + ^~~~ dynamic constant assignment + +def bar();B||=1;end + ^~~~~ dynamic constant assignment + +def baz();C&&=1;end + ^~~~~ dynamic constant assignment +