local+global
single-char-var
unknown-warning
+ broken-var-ref
);
our %warn_ena = @warn_ena_dfl;
sub wrn ($$) {
my ($wk,$m) = @_;
+ our %warn_dedupe;
+ return 0 if $warn_dedupe{$err_file,$.,$wk,$m}++;
wrncore($wk, "${err_file}:$.: $m");
}
}
}
next;
+ } elsif (s#^\s*$esc\:local\+global\s+(\S.*)$##) {
+ foreach my $vn (split /\s+/, $1) {
+ $vn =~ s{^$esc}{};
+ $varref{$vn}{NoWarn} = 1;
+ }
+ next;
} elsif (s#^\s*$esc\:(?=(-?)include|macro)##) {
$buffering_output='';
- } elsif (m#^\s*$esc\:([a-z][-0-9a-z_]*)#) {
+ } elsif (m#^\s*$esc\:([a-z][-+0-9a-z_]*)#) {
err "unknown directive &:$1 or bad argumnt syntax";
} elsif (s{^\s*${esc}TARGETS(?:_([0-9a-zA-Z_]+))?(?=\W)}{}) {
my $t = $1 // 'all';
wrn 'single-char-var',
'possibly confusing unbracketed single-char $-expansion';
}
+ elsif (m{^$esc}) {
+ wrn 'broken-var-ref',
+ 'broken $&... expansion; you probably meant &$';
+ }
elsif (m{^\(($esc)?([^()\$]+)\)} ||
m{^\{($esc)?([^{}\$]+)\}}) {
$note_varref->($2,!!$1);
elsif (m{^(?=$caps_re)}) { od $var_prefix }
elsif (s{^\$([A-Za-z]\w+)}{}) {
$note_varref->($1,1);
- od "\$(${var_prefix}$1)";
+ od "\${${var_prefix}$1}";
}
elsif (s{^([~^]?)(?=$lc_re)}{}) { od $pfxmap{$1} }
elsif (s{^_}{}) { od $var_prefix }
foreach my $vn (sort keys %varref) {
my $vv = $varref{$vn};
next unless $vv->{''} && $vv->{1};
+ next if $vv->{NoWarn};
wrncore 'local+global', "saw both $vn and &$vn" or return;
foreach my $amp ('', 1) {
printf STDERR " saw %s%s at %s\n",