1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#!./perl -w
BEGIN {
unshift @INC, 't';
push @INC, "../../t";
require Config;
if ( ( $Config::Config{'extensions'} !~ /\bB\b/ ) ) {
print "1..0 # Skip -- Perl configured without B module\n";
exit 0;
}
require 'test.pl';
}
use strict;
use warnings;
plan tests => 31;
# Runs a separate perl interpreter with the appropriate lint options
# turned on
sub runlint ($$$;$) {
my ( $opts, $prog, $result, $testname ) = @_;
my $res = runperl(
switches => ["-MO=Lint,$opts"],
prog => $prog,
stderr => 1,
);
$res =~ s/-e syntax OK\n$//;
local $::Level = $::Level + 1;
is( $res, $result, $testname || $opts );
}
runlint 'magic-diamond', 'while(<>){}', <<'RESULT';
Use of <> at -e line 1
RESULT
runlint 'magic-diamond', 'while(<ARGV>){}', <<'RESULT';
Use of <> at -e line 1
RESULT
runlint 'magic-diamond', 'while(<FOO>){}', <<'RESULT';
RESULT
runlint 'context', '$foo = @bar', <<'RESULT';
Implicit scalar context for array in scalar assignment at -e line 1
RESULT
runlint 'context', '$foo = length @bar', <<'RESULT';
Implicit scalar context for array in length at -e line 1
RESULT
runlint 'context', 'our @bar', '';
runlint 'context', 'exists $BAR{BAZ}', '';
runlint 'context', 'sub foo{return @_}', ''; # return CPAN RT#97873
runlint 'implicit-read', '/foo/', <<'RESULT';
Implicit match on $_ at -e line 1
RESULT
runlint 'implicit-read', 'grep /foo/, ()', '';
runlint 'implicit-read', 'grep { /foo/ } ()', '';
runlint 'implicit-write', 's/foo/bar/', <<'RESULT';
Implicit substitution on $_ at -e line 1
RESULT
runlint 'implicit-read', 'for ( @ARGV ) { 1 }',
<<'RESULT', 'implicit-read in foreach';
Implicit use of $_ in foreach at -e line 1
RESULT
runlint 'implicit-read', '1 for @ARGV', '', 'implicit-read in foreach';
runlint 'dollar-underscore', '$_ = 1', <<'RESULT';
Use of $_ at -e line 1
RESULT
runlint 'dollar-underscore', 'sub foo {}; foo( $_ ) for @A', '';
runlint 'dollar-underscore', 'sub foo {}; map { foo( $_ ) } @A', '';
runlint 'dollar-underscore', 'sub foo {}; grep { foo( $_ ) } @A', '';
runlint 'dollar-underscore', 'print',
<<'RESULT', 'dollar-underscore in print';
Use of $_ at -e line 1
RESULT
runlint 'private-names', 'sub A::_f{};A::_f()', <<'RESULT';
Illegal reference to private name '_f' at -e line 1
RESULT
runlint 'private-names', '$A::_x', <<'RESULT';
Illegal reference to private name '_x' at -e line 1
RESULT
runlint 'private-names', 'sub A::_f{};A->_f()', <<'RESULT',
Illegal reference to private method name '_f' at -e line 1
RESULT
'private-names (method)';
runlint 'undefined-subs', 'foo()', <<'RESULT';
Nonexistent subroutine 'foo' called at -e line 1
RESULT
runlint 'undefined-subs', 'foo();sub foo;', <<'RESULT';
Undefined subroutine 'foo' called at -e line 1
RESULT
runlint 'regexp-variables', 'print $&', <<'RESULT';
Use of regexp variable $& at -e line 1
RESULT
runlint 'regexp-variables', 's/./$&/', <<'RESULT';
Use of regexp variable $& at -e line 1
RESULT
runlint 'bare-subs', 'sub bare(){1};$x=bare', '';
runlint 'bare-subs', 'sub bare(){1}; $x=[bare=>0]', <<'RESULT';
Bare sub name 'bare' interpreted as string at -e line 1
RESULT
SKIP: {
skip 'Perl 5.22 stopped marking $hash{bare} as BARE word, CPAN RT#101115',
1, if $] >= 5.022;
runlint 'bare-subs', 'sub bare(){1}; $x=$y{bare}', <<'RESULT';
Bare sub name 'bare' interpreted as string at -e line 1
RESULT
}
{
# Check for backwards-compatible plugin support. This was where
# preloaded mdoules would register themselves with B::Lint.
my $res = runperl(
switches => ["-MB::Lint"],
prog =>
'BEGIN{B::Lint->register_plugin(X=>[q[x]])};use O(qw[Lint x]);sub X::match{warn qq[X ok.\n]};dummy()',
stderr => 1,
);
like( $res, qr/X ok\./, 'Lint legacy plugin' );
}
{
# Check for Module::Plugin support
my $res = runperl(
switches => [ '-It/pluglib', '-MO=Lint,none' ],
prog => 1,
stderr => 1,
);
like( $res, qr/Module::Pluggable ok\./, 'Lint uses Module::Pluggable' );
}
|