summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--parse.y7
-rw-r--r--test/ruby/test_ast.rb5
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