The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
##############################################################################
#     $URL: http://perlcritic.tigris.org/svn/perlcritic/trunk/distributions/Perl-Critic/t/Subroutines/RequireFinalReturn.run $
#    $Date: 2010-05-30 21:34:52 -0700 (Sun, 30 May 2010) $
#   $Author: wyant $
# $Revision: 3819 $
##############################################################################


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

## name basic passes
## failures 0
## cut

sub foo { }
sub bar;
sub baz { return; }
sub quux { return {some => [qw(complicated data)], q{ } => /structure/}; }

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

## name complex passes
## failures 0
## cut

sub foo { if ($bool) { return; } else { return; } }
sub bar { unless ($bool) { return; } else { return; } }
sub baz { if ($bool) { return; } elsif ($bool2) { return; } else { return; } }
sub quuz { unless ($bool) { return; } elsif ($bool2) { return; } else { return; } }

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

## name ternary returns
## failures 0
## TODO We are not yet detecting ternaries
## cut

sub foo { 1 ? return : 2 ? return : return; }

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

## name returning ternaries
## failures 0
## cut

sub foo { return 1 ? 1 : 2 ? 2 : 3; }

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

## name implicit returns fail
## failures 2
## cut

sub foo { 1 }
sub foo { 'Club sandwich'; }

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

## name return in a constant loop
## failures 1
## cut

sub foo { while (1==1) { return; } }

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

## name not all code paths returns
## failures 3
## cut

sub foo { if ($bool) { } else { } }
sub foo { if ($bool) { $foo = 'bar'; } else { return; } }
sub foo { unless ($bool) { $foo = 'bar'; } else { return; } }

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

## name special blocks exemption
## failures 0
## cut

BEGIN {
  print 'this should not need a return';
}
INIT {
  print 'nor this';
}
CHECK {
  print 'nor this';
}
END {
  print 'nor this';
}

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

## name goto is equivalent to return
## failures 0
## cut

sub foo { goto &bar; }
END_PERL

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

## name next and last are not equivalent to return (and are invalid Perl)
## failures 2
## cut

sub foo { next; }
sub bar { last; }

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

## name abnormal termination is allowed
## failures 0
## cut

sub foo   { die; }
sub bar   { croak; }
sub baz   { confess; }
sub bar_C { Carp::croak; }
sub baz_C { Carp::confess; }
sub quux  { exec; }
sub quux2 { exit; }
sub quux3 { throw 'nuts'; }

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

## name Final return is present, but conditional
## failures 5
## cut

sub foo   { die if $condition }
sub bar   { croak unless $condition }
sub baz   { exec for @condition }
sub baz   { exit for @condition }
sub quux  { throw 'nuts'if not $condition }

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

## name Compound final return is present, but conditional
## failures 1
## cut
sub foo {

    if( $condition ) {
        return if $today_is_tuesday;
    }
    else {
        exit unless $today_is_wednesday;
    }
}

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

## name Custom terminals
## parms { terminal_funcs => 'bailout abort quit' };
## failures 0
## cut
sub foo  { if ($condition) { return 1; }else{ abort } }
sub bar  { if ($condition) { bailout }else{ return 1 } }
sub baz  { quit }

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

## name ForLoop is a QuoteLike::Words
## failures 0
## cut

sub foo {
    for my $thingy qw<blah> {}

    return;
}

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

## name RT 43309 - given/when followed by return
## failures 0
## cut

sub foo {
    given ($bar) {}
    return;
}

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

## name given/when with return on all branches
## failures 0
## cut

sub foo {
    my ( $val ) = @_;
    given ( $val ) {
        when ( 'end' ) {
            return 'End.';
        }
        default {
            return 'Not end.';
        }
    }
}

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

## name given/suffix when with return on all branches
## failures 0
## cut

sub foo {
    my ( $val ) = @_;
    given ( $val ) {
        return 'End.' when 'end';
        default {
            return 'Not end.';
        }
    }
}

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

## name given/when without return on all branches fails
## failures 1
## cut

sub foo {
    my ( $val ) = @_;
    given ( $val ) {
        when ( 'end' ) {
            return 'End.';
        }
        default {
            print "Not end.\n";
        }
    }
}

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

## name given/when with return on all branches but without default fails
## failures 1
## cut

sub foo {
    my ( $val ) = @_;
    given ( $val ) {
        when ( 'end' ) {
            return 'End.';
        }
    }
}

##############################################################################
# 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 :