From 127325a4bad409ee5da91084fac768934a8fd9e3 Mon Sep 17 00:00:00 2001 From: Kevin Newton Date: Thu, 13 Feb 2025 14:17:53 -0500 Subject: [PATCH] [ruby/prism] No writing to numbered parameters Fixes [Bug #21117] https://github.com/ruby/prism/commit/19d4bab5a0 --- lib/prism/parse_result/newlines.rb | 2 +- prism/prism.c | 15 +++++++++++++++ test/prism/errors/numbered_and_write.txt | 3 +++ test/prism/errors/numbered_operator_write.txt | 3 +++ test/prism/errors/numbered_or_write.txt | 3 +++ test/prism/errors_test.rb | 5 ++++- 6 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 test/prism/errors/numbered_and_write.txt create mode 100644 test/prism/errors/numbered_operator_write.txt create mode 100644 test/prism/errors/numbered_or_write.txt diff --git a/lib/prism/parse_result/newlines.rb b/lib/prism/parse_result/newlines.rb index a04fa78a75..37f64f8ae2 100644 --- a/lib/prism/parse_result/newlines.rb +++ b/lib/prism/parse_result/newlines.rb @@ -63,7 +63,7 @@ module Prism class Node def newline_flag? # :nodoc: - @newline_flag ? true : false + !!defined?(@newline_flag) end def newline_flag!(lines) # :nodoc: diff --git a/prism/prism.c b/prism/prism.c index 6f8d5b005d..ffa5d3ddc4 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21219,6 +21219,11 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t return result; } case PM_LOCAL_VARIABLE_READ_NODE: { + if (pm_token_is_numbered_parameter(node->location.start, node->location.end)) { + PM_PARSER_ERR_FORMAT(parser, node->location.start, node->location.end, PM_ERR_PARAMETER_NUMBERED_RESERVED, node->location.start); + parse_target_implicit_parameter(parser, node); + } + pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); @@ -21337,6 +21342,11 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t return result; } case PM_LOCAL_VARIABLE_READ_NODE: { + if (pm_token_is_numbered_parameter(node->location.start, node->location.end)) { + PM_PARSER_ERR_FORMAT(parser, node->location.start, node->location.end, PM_ERR_PARAMETER_NUMBERED_RESERVED, node->location.start); + parse_target_implicit_parameter(parser, node); + } + pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); @@ -21465,6 +21475,11 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t return result; } case PM_LOCAL_VARIABLE_READ_NODE: { + if (pm_token_is_numbered_parameter(node->location.start, node->location.end)) { + PM_PARSER_ERR_FORMAT(parser, node->location.start, node->location.end, PM_ERR_PARAMETER_NUMBERED_RESERVED, node->location.start); + parse_target_implicit_parameter(parser, node); + } + pm_local_variable_read_node_t *cast = (pm_local_variable_read_node_t *) node; parser_lex(parser); diff --git a/test/prism/errors/numbered_and_write.txt b/test/prism/errors/numbered_and_write.txt new file mode 100644 index 0000000000..f80b97b2d5 --- /dev/null +++ b/test/prism/errors/numbered_and_write.txt @@ -0,0 +1,3 @@ +tap { _1 &&= 1 } + ^~ _1 is reserved for numbered parameters + diff --git a/test/prism/errors/numbered_operator_write.txt b/test/prism/errors/numbered_operator_write.txt new file mode 100644 index 0000000000..70cd58c811 --- /dev/null +++ b/test/prism/errors/numbered_operator_write.txt @@ -0,0 +1,3 @@ +tap { _1 += 1 } + ^~ _1 is reserved for numbered parameters + diff --git a/test/prism/errors/numbered_or_write.txt b/test/prism/errors/numbered_or_write.txt new file mode 100644 index 0000000000..b27495498d --- /dev/null +++ b/test/prism/errors/numbered_or_write.txt @@ -0,0 +1,3 @@ +tap { _1 ||= 1 } + ^~ _1 is reserved for numbered parameters + diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb index cb2fd48d37..62bbd8458b 100644 --- a/test/prism/errors_test.rb +++ b/test/prism/errors_test.rb @@ -14,7 +14,10 @@ module Prism "targeting_numbered_parameter.txt", "defining_numbered_parameter.txt", "defining_numbered_parameter_2.txt", - "numbered_parameters_in_block_arguments.txt" + "numbered_parameters_in_block_arguments.txt", + "numbered_and_write.txt", + "numbered_or_write.txt", + "numbered_operator_write.txt" ] end