############################################################################## # $URL: http://perlcritic.tigris.org/svn/perlcritic/trunk/Perl-Critic/t/Subroutines/RequireFinalReturn.run $ # $Date: 2008-03-16 17:40:45 -0500 (Sun, 16 Mar 2008) $ # $Author: clonezone $ # $Revision: 2187 $ ############################################################################## #----------------------------------------------------------------------------- ## 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 { exit; } sub quux2 { throw 'nuts'; } #----------------------------------------------------------------------------- ## name Final return is present, but conditional ## failures 4 ## cut sub foo { die if $condition } sub bar { croak unless $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 } ############################################################################## # 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 :