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