From d3fc56dcfa7b408cc3b6788efad36fd8df3e55da Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 13 Feb 2025 21:17:04 -0800 Subject: [PATCH] merge revision(s) 127325a4bad409ee5da91084fac768934a8fd9e3: [Backport #21117] [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 ++++- version.h | 2 +- 7 files changed, 30 insertions(+), 3 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 8e30f09629..37910f981f 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -21058,6 +21058,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); @@ -21176,6 +21181,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); @@ -21304,6 +21314,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 diff --git a/version.h b/version.h index 7dfea6f354..782a4fce30 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 1 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 25 +#define RUBY_PATCHLEVEL 26 #include "ruby/version.h" #include "ruby/internal/abi.h"