X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?p=subdirmk.git;a=blobdiff_plain;f=generate;h=ffd3e5dfdb1e18951ac9771efef71c93e3e64143;hp=3caf4e65a0bac0d559c7d891904cefae29584179;hb=291014f5a360a39bf99e4519e3ffb6c12d90d253;hpb=62ddb6b1bd58afe028dfe8799aa86bc9bd4b1a48 diff --git a/generate b/generate index 3caf4e6..ffd3e5d 100755 --- a/generate +++ b/generate @@ -177,6 +177,7 @@ our @warn_ena_dfl = map { $_ => 1 } qw( local+global single-char-var unknown-warning + broken-var-ref ); our %warn_ena = @warn_ena_dfl; @@ -198,6 +199,8 @@ sub wrncore ($$) { sub wrn ($$) { my ($wk,$m) = @_; + our %warn_dedupe; + return 0 if $warn_dedupe{$err_file,$.,$wk,$m}++; wrncore($wk, "${err_file}:$.: $m"); } @@ -289,9 +292,15 @@ sub process_input_mk ($$$$) { } } 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'; @@ -324,6 +333,10 @@ sub process_input_mk ($$$$) { 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); @@ -337,7 +350,7 @@ sub process_input_mk ($$$$) { 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 } @@ -513,6 +526,7 @@ sub print_varref_warnings () { 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",