--- /dev/null
+##############################################################################
+# $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 :