parse.y: fix line in rescue

* parse.y (set_line_body, primary): fix line number of bodystmt as
  the beginning of the block.  [ruby-core:79388] [Bug #13181]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58499 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-04-28 08:06:33 +00:00
parent efdc6d78ac
commit 7d085cca4b
2 changed files with 30 additions and 3 deletions

20
parse.y
View File

@ -327,6 +327,17 @@ parser_set_line(NODE *n, int l)
nd_set_line(n, l);
}
static inline void
set_line_body(NODE *body, int line)
{
if (!body) return;
switch (nd_type(body)) {
case NODE_RESCUE:
case NODE_ENSURE:
nd_set_line(body, line);
}
}
#ifndef RIPPER
#define yyparse ruby_yyparse
@ -2463,9 +2474,7 @@ primary : literal
$$ = NEW_NIL();
}
else {
if (nd_type($3) == NODE_RESCUE ||
nd_type($3) == NODE_ENSURE)
nd_set_line($3, $<num>2);
set_line_body($3, $<num>2);
$$ = NEW_BEGIN($3);
}
nd_set_line($$, $<num>2);
@ -2742,6 +2751,7 @@ primary : literal
{
/*%%%*/
$$ = NEW_CLASS($2, $5, $3);
set_line_body($5, $<num>4);
nd_set_line($$, $<num>4);
/*%
$$ = dispatch3(class, $2, $3, $5);
@ -2761,6 +2771,7 @@ primary : literal
{
/*%%%*/
$$ = NEW_SCLASS($3, $6);
set_line_body($6, nd_line($3));
fixpos($$, $3);
/*%
$$ = dispatch2(sclass, $3, $6);
@ -2784,6 +2795,7 @@ primary : literal
{
/*%%%*/
$$ = NEW_MODULE($2, $4);
set_line_body($4, $<num>3);
nd_set_line($$, $<num>3);
/*%
$$ = dispatch2(module, $2, $4);
@ -2808,6 +2820,7 @@ primary : literal
NODE *body = remove_begin($6);
reduce_nodes(&body);
$$ = NEW_DEFN($2, $5, body, METHOD_VISI_PRIVATE);
set_line_body(body, $<num>1);
nd_set_line($$, $<num>1);
/*%
$$ = dispatch3(def, $2, $5, $6);
@ -2833,6 +2846,7 @@ primary : literal
NODE *body = remove_begin($8);
reduce_nodes(&body);
$$ = NEW_DEFS($2, $5, $7, body);
set_line_body(body, $<num>1);
nd_set_line($$, $<num>1);
/*%
$$ = dispatch5(defs, $2, $<val>3, $5, $7, $8);

View File

@ -965,6 +965,19 @@ x = __ENCODING__
end;
end
def test_method_location_in_rescue
bug = '[ruby-core:79388] [Bug #13181]'
obj, line = Object.new, __LINE__+1
def obj.location
#
raise
rescue
caller_locations(1, 1)[0]
end
assert_equal(line, obj.location.lineno, bug)
end
=begin
def test_past_scope_variable
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}