Hi,

Let me start with a sample which resembles some real code in my project:

     sub bar ( $v ) {
         die "don't like it" if $v == 3;
         LEAVE (1..2).map: { "ok" };
         "[" ~ $v ~ "]"
     }

     sub foo ( $v --> Str ) {
         my $str = bar( $v );
         CATCH {
             default {
                 return "«oops»";
             }
         }
         $str
     }

     sub foobar {
         return [~] (1..10).map: {
             foo( $_ );
         };
     }

     say foobar;

With this I get the error:

Type check failed for return value; expected Str but got Int (1)
  in sub foo at ./fail.p6 line 16
  in sub foobar at ./fail.p6 line 21
  in block <unit> at ./fail.p6 line 25

When LEAVE is commented out I get the expected output:

[1][2]«oops»[4][5][6][7][8][9][10]

Somehow LEAVE substitutes return value from CATCH with 1. What's even more 
confusing is that I have no idea where this 1 is coming from!

Moreover, in real code LEAVE belongs to a sub which is one level deeper down 
the stack and is been called from bar(). The effect is the same: I get 1 
instead of «oops». Further investigation pinned down this miraculous phenomenon 
to .map. Any other code within LEAVE, including 'for' loop, makes the whole 
thing to work as expected.

I'm strongly convinced that what is observed is a bug. But before reporting it 
I'd like to make sure that there is nothing about .map that I don't know about 
and that makes the code behave so strange.

Best regards,
Vadim Belman

Reply via email to