Currently things are as follows:
Moar get's all of this right:
$ perl6-m -e 'UNDO { say "undone" }; die "foo"'
undone
foo
in block <unit> at -e:1
$ perl6-m -e 'do { UNDO say "undone"; die "foo" }'
undone
foo
in block <unit> at -e:1
$ perl6-m -e 'try { UNDO say "undone"; die "foo" }'
undone
$ perl6-m -e 'sub foo { UNDO say "undone"; fail }; foo; say "alive"'
undone
alive
Parrot has trouble with the first two commands (without block and "do" block),
the other two run fine ("try" block and sub):
$ perl6-p -e 'UNDO { say "undone" }; die "foo"'
undone
$ perl6-p -e 'do { UNDO say "undone"; die "foo" }'
foo
in block <unit> at -e:1
$ perl6-p -e 'try { UNDO say "undone"; die "foo" }'
undone
$ perl6-p -e 'sub foo { UNDO say "undone"; fail }; foo; say "alive"'
undone
alive
JVM has trouble with the second and third command ("do" block and "try" block),
the other two run fine (without block and sub):
$ perl6-j -e 'UNDO { say "undone" }; die "foo"'
undone
foo
in block <unit> at -e:1
$ perl6-j -e 'do { UNDO say "undone"; die "foo" }'
foo
in block <unit> at -e:1
$ perl6-j -e 'try { UNDO say "undone"; die "foo" }'
$ perl6-j -e 'sub foo { UNDO say "undone"; fail }; foo; say "alive"'
undone
alive
I'll add tests later (after this month's Rakudo release).