The problem is that the void_expr macro is used in void_stmts and
modifies the tree, but only if -v is on:
#define void_expr(node) void_expr0((node) = remove_begin(node))
static void
void_stmts(node)
NODE *node;
{
if (!RTEST(ruby_verbose)) return;
if (!node) return;
if (nd_type(node) != NODE_BLOCK) return;
for (;;) {
if (!node->nd_next) return;
void_expr(node->nd_head); // <--- modifies tree if
-v !!!
node = node->nd_next;
}
}
----
This can be seen here:
537 % ruby -v -I.:lib:test -e "require 'test/unit'; require 'test/
test_parse_tree.rb'"
ruby 1.8.6 (2007-06-07 patchlevel 36) [universal-darwin9.0]
nuking /Users/ryan/.ruby_inline
Loaded ParseTree 2.0.3 from ./lib/parse_tree.rb
Loaded suite -e
Started
......................................................................................................................................................................................................................
Finished in 0.080023 seconds.
214 tests, 811 assertions, 0 failures, 0 errors
537 % ruby -I.:lib:test -e "require 'test/unit'; require 'test/
test_parse_tree.rb'"
nuking /Users/ryan/.ruby_inline
Loaded ParseTree 2.0.3 from ./lib/parse_tree.rb
Loaded suite -e
Started
...............F
......................................................................................................................................................................................................
Finished in 0.098921 seconds.
1) Failure:
test_begin_rescue_twice(TestParseTree) [./test/pt_testcase.rb:1758]:
failed on input: "\nbegin\nrescue => mes\nend\n\nbegin\nrescue => mes
\nend\n".
<[:block,
[:rescue, [:resbody, nil, [:lasgn, :mes, [:gvar, :$!]]]],
[:begin, [:rescue, [:resbody, nil, [:lasgn, :mes, [:gvar, :$!]]]]]]>
expected but was
<[:block,
[:begin, [:rescue, [:resbody, nil, [:lasgn, :mes, [:gvar, :$!]]]]],
[:begin, [:rescue, [:resbody, nil, [:lasgn, :mes, [:gvar, :$!]]]]]]>.
214 tests, 810 assertions, 1 failures, 0 errors