The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
## name Basic failure
## failures 9
## cut

eval { foo; };
{ eval { baz; } };
[ eval { buz; } ];
( eval { blrfl; } );

eval 'foo;';
{ eval 'baz;' };
[ eval 'buz;' ];
( eval 'blrfl;' );

eval { something };
if ($@) {
    blahblah
}

#-----------------------------------------------------------------------------

## name Assignment
## failures 0
## cut

$result = eval { foo; };
@result = eval { bar; };
$result = { eval { baz; } };
$result = [ eval { buz; } ];
@result = ( 0, eval { blrfl; } );
@result = [ qw< one two >, { thrpt => ( eval { frlbfrnk; } ) } ];

$result = eval 'foo;';
@result = eval 'bar;';
$result = { eval 'baz;' };
$result = [ eval 'buz;' ];
@result = ( 0, eval 'blrfl;' );
@result = [ qw< one two >, { thrpt => ( eval 'frlbfrnk;' ) } ];

#-----------------------------------------------------------------------------

## name Assignment with comma separated statements.
## failures 12
## cut

$result = 1, eval { foo; };
@result = 1, eval { bar; };
$result = 1, { eval { baz; } };
$result = 1, [ eval { buz; } ];
@result = 1, ( eval { blrfl; } );
@result = 1, [ qw< one two >, { thrpt => ( eval { frlbfrnk; } ) } ];

$result = 1, eval 'foo;';
@result = 1, eval 'bar;';
$result = 1, { eval 'baz;' };
$result = 1, [ eval 'buz;' ];
@result = 1, ( eval 'blrfl;' );
@result = 1, [ qw< one two >, { thrpt => ( eval 'frlbfrnk;' ) } ];

#-----------------------------------------------------------------------------

## name if
## failures 0
## cut

if ( eval { bar; } ) {
    something
}

if ( ( eval { blrfl; } ) ) {
    something
}

if ( 5 == eval { bar; } ) {
    something
}

if ( scalar ( eval { blrfl; } ) ) {
    something
}

if ( not eval { whatever; } ) {
    something
}



if ( eval 'bar;' ) {
    something
}

if ( ( eval 'blrfl;' ) ) {
    something
}

if ( 5 == eval 'bar;' ) {
    something
}

if ( scalar ( eval 'blrfl;' ) ) {
    something
}

if ( ! eval 'whatever;' ) {
    something
}

#-----------------------------------------------------------------------------

## name foreach
## failures 0
## cut

foreach my $thingy ( eval { bar; } ) {
    something
}

foreach my $thingy ( ( eval { blrfl; } ) ) {
    something
}

foreach my $thingy ( qw< one two >, eval { bar; } ) {
    something
}


foreach my $thingy ( eval 'bar;' ) {
    something
}

foreach my $thingy ( ( eval 'blrfl;' ) ) {
    something
}

foreach my $thingy ( qw< one two >, eval 'bar;' ) {
    something
}

#-----------------------------------------------------------------------------

## name C-style for with eval in condition or assignment
## failures 0
## cut

for (blah; eval { bar; }; blah ) {
    something
}

for (blah; ( eval { blrfl; } ); blah ) {
    something
}

for (blah; eval { bar; } eq 'bing bang bong'; blah ) {
    something
}

for (my $x = eval { thrp; }; $x < 1587; $x = eval { thrp; } ) {
    something
}


for (blah; eval 'bar;'; blah ) {
    something
}

for (blah; ( eval 'blrfl;' ); blah ) {
    something
}

for (blah; eval 'bar;' eq 'bing bang bong'; blah ) {
    something
}

for (my $x = eval 'thrp;'; $x < 1587; $x = eval 'thrp;' ) {
    something
}

#-----------------------------------------------------------------------------

## name C-style for with eval in initialization or increment with no assignment
## failures 4
## cut

for (eval { bar; }; blah; blah) {
    something
}

for ( blah; blah; ( eval { blrfl; } ) ) {
    something
}


for (eval 'bar;'; blah; blah) {
    something
}

for ( blah; blah; ( eval 'blrfl;' ) ) {
    something
}

#-----------------------------------------------------------------------------

## name while
## failures 0
## cut

while ( eval { bar; } ) {
    something
}

while ( ( ( eval { blrfl; } ) ) ) {
    something
}


while ( eval 'bar;' ) {
    something
}

while ( ( ( eval 'blrfl;' ) ) ) {
    something
}

#-----------------------------------------------------------------------------

## name Postfix if
## failures 0
## cut

bleah if eval { yadda; };
bleah if ( eval { yadda; } );
bleah if 5 == eval { yadda; };
bleah if eval { yadda; } == 5;

bleah if eval 'yadda;';
bleah if ( eval 'yadda;' );
bleah if 5 == eval 'yadda;';
bleah if eval 'yadda;' == 5;

#-----------------------------------------------------------------------------

## name Ternary
## failures 0
## cut

eval { yadda; } ? 1 : 2;
eval 'yadda;' ? 1 : 2;

#-----------------------------------------------------------------------------

## name Postfix foreach
## failures 0
## cut

blargh($_) foreach eval { bar; };
blargh($_) foreach ( eval { blrfl; } );
blargh($_) foreach qw< one two >, eval { bar; };
blargh($_) foreach eval { bar; }, qw< one two >;

blargh($_) foreach eval 'bar;';
blargh($_) foreach ( eval 'blrfl;' );
blargh($_) foreach eval 'bar;', qw< one two >;

#-----------------------------------------------------------------------------

## name First value in comma-separated list in condition
## failures 4
## cut

if ( eval { 1 }, 0 ) {
    blah blah blah
}

if ( ( eval { 1 }, 0 ) ) {
    blah blah blah
}

if ( eval '1', 0 ) {
    blah blah blah
}

if ( ( eval '1', 0 ) ) {
    blah blah blah
}

#-----------------------------------------------------------------------------

## name Last value in comma-separated list in condition
## failures 0
## cut

if ( 0, eval { 1 }, ) {
    blah blah blah
}

# Comma outside inner parentheses.
if ( ( 0, eval { 1 } ), , ) {
    blah blah blah
}

if ( 0, eval '1', ) {
    blah blah blah
}

# Comma inside inner parentheses.
if ( ( 0, eval '1', , ) ) {
    blah blah blah
}

#-----------------------------------------------------------------------------

## name Last value in comma-separated list that isn't the last element in another list in condition
## failures 4
## cut

if ( ( 0, eval { 1 } ), 0 ) {
    blah blah blah
}

if ( ( ( 0, eval { 1 } ) ), 0 ) {
    blah blah blah
}

if ( ( 0, eval '1' ), 0 ) {
    blah blah blah
}

if ( ( ( 0, eval '1' ) ), 0 ) {
    blah blah blah
}

#-----------------------------------------------------------------------------

## name "Proper" handling of return value
## failures 0
## cut

eval {
    something
}
    or do {
        if ($EVAL_ERROR) {
            yadda
        }
        else {
            blahdda
        };

eval "something_else" or die;

# eval gets the thing following it before || does.
eval {
    something
}
    || do {
        if ($EVAL_ERROR) {
            yadda
        }
        else {
            blahdda
        }
    };

eval "something_else" || die;


eval {
    something
}
    and do {
        yadda
    };

eval "something_else" and thingy;

# eval gets the thing following it before && does.
eval {
    something
}
    && do {
        yadda
    };

eval "something_else" && die;

#-----------------------------------------------------------------------------

## name A grep is a check -- RT #69489
## failures 0
## cut

foreach ( grep { eval $_ } @bar ) { say }
foreach ( grep { ! eval $_ } @bar ) { say }
foreach ( grep eval $_, @bar ) { say }
foreach ( grep ! eval $_, @bar ) { say }

# grep $_, map eval $_, @foo;   # Should this be accepted?
grep { $_ } map { eval $_ } @foo;   # Should this be rejected?

#-----------------------------------------------------------------------------

##############################################################################
#      $URL: http://perlcritic.tigris.org/svn/perlcritic/trunk/distributions/Perl-Critic/t/ErrorHandling/RequireCheckingReturnValueOfEval.run $
#     $Date: 2011-07-15 14:09:27 -0700 (Fri, 15 Jul 2011) $
#   $Author: wyant $
# $Revision: 4088 $
##############################################################################

# Local Variables:
#   mode: cperl
#   cperl-indent-level: 4
#   fill-column: 78
#   indent-tabs-mode: nil
#   c-indentation-style: bsd
# End:
# ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :