From e4271b554c8b13270754a45ee631789237d5cced Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Mon, 11 May 2026 13:40:06 -0700 Subject: merge revision(s) 24a2ba09af13b7c969733ea9370ad59d2442f4c9: [Backport #21985] [PATCH] [Bug #21985] Include the `-` in the negative numbers location --- parse.y | 7 ++++--- test/ruby/test_ast.rb | 5 +++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/parse.y b/parse.y index 9303ed8c32..90c22122ae 100644 --- a/parse.y +++ b/parse.y @@ -1441,7 +1441,7 @@ static NODE *new_hash_pattern_tail(struct parser_params *p, NODE *kw_args, ID kw static rb_node_kw_arg_t *new_kw_arg(struct parser_params *p, NODE *k, const YYLTYPE *loc); static rb_node_args_t *args_with_numbered(struct parser_params*,rb_node_args_t*,int,ID); -static NODE* negate_lit(struct parser_params*, NODE*); +static NODE* negate_lit(struct parser_params*, NODE*,const YYLTYPE*); static void no_blockarg(struct parser_params*,NODE*); static NODE *ret_args(struct parser_params*,NODE*); static NODE *arg_blk_pass(NODE*,rb_node_block_pass_t*); @@ -6186,7 +6186,7 @@ numeric : simple_numeric | tUMINUS_NUM simple_numeric %prec tLOWEST { $$ = $2; - negate_lit(p, $$); + negate_lit(p, $$, &@$); /*% ripper: unary!(ID2VAL(idUMinus), $:2) %*/ } ; @@ -14371,7 +14371,7 @@ ret_args(struct parser_params *p, NODE *node) } static NODE* -negate_lit(struct parser_params *p, NODE* node) +negate_lit(struct parser_params *p, NODE* node, const YYLTYPE *loc) { switch (nd_type(node)) { case NODE_INTEGER: @@ -14387,6 +14387,7 @@ negate_lit(struct parser_params *p, NODE* node) RNODE_IMAGINARY(node)->minus = TRUE; break; } + node->nd_loc = *loc; return node; } diff --git a/test/ruby/test_ast.rb b/test/ruby/test_ast.rb index c7a946dec8..8ab5c14eca 100644 --- a/test/ruby/test_ast.rb +++ b/test/ruby/test_ast.rb @@ -1734,6 +1734,11 @@ dummy assert_locations(node.children[-1].children[-1].children[-1].locations, [[1, 9, 1, 20], [1, 9, 1, 14], [1, 14, 1, 15], [1, 19, 1, 20]]) end + def test_negative_numeric_locations + node = ast_parse("-1") + assert_locations(node.children.last.locations, [[1, 0, 1, 2]]) + end + private def ast_parse(src, **options) begin -- cgit v1.2.3