chiark / gitweb /
Syntax: Rescope effect of &:local+global
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 29 Dec 2019 15:18:39 +0000 (15:18 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 30 Dec 2019 11:35:16 +0000 (11:35 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
README
generate
tests/filter/stderr.expected
tests/filter/sub/dir/Dir.mk.expected
tests/filter/sub/dir/Dir.sd.mk

diff --git a/README b/README
index 2f1a1ce..415913b 100644 (file)
--- a/README
+++ b/README
@@ -175,9 +175,9 @@ So pathname syntax is a subset of:
        input files (including Final.sd.mk).
 
 &:local+global [&]VARIABLE ...
-       Suppresses the warning about seeing both VARIABLE and
-       &VARIABLE.  Any & specified in the RHS is redundant: this
-       always affects both versions identically.
+       Suppresses any warnings relating to forthcoming mentions
+       to VARIABLE or &VARIABLE, as applicable.  Scope ends at
+       the end of the current directory's Suffix.sd.mk.
 
 &:changequote NEWQUOTE
        changes the escape sequence from & to literally NEWQUOTE
index f91cba8..2278928 100755 (executable)
--- a/generate
+++ b/generate
@@ -153,6 +153,7 @@ END
 }
 
 our %varref;
+our %varref_exp;
 
 our ($dir_prefix, $dir_suffix, $dir_name,
      $var_prefix, $var_prefix_name);
@@ -262,6 +263,7 @@ sub process_input_mk ($$$$) {
     # accurate, since it is only going to be used for advice to the user.
     my $note_varref = sub {
        my ($vn,$amp) = @_;
+       return if $varref_exp{$vn}{$amp};
        $varref{$vn}{$amp}{"$f:$."} = 1;
     };
 
@@ -294,8 +296,8 @@ 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;
+               my $amp = $vn =~ s{^$esc}{};
+               $varref_exp{$vn}{!!$amp} = 1;
            }
            next;
        } elsif (s#^\s*$esc\:(?=(-?)include|macro)##) {
@@ -435,6 +437,8 @@ sub process_subtree ($$) {
     #use Data::Dumper;
     #print STDERR Dumper(\@_);
 
+    local %varref_exp;
+
     my $dir_prefix = dir_prefix($path);
     # ^ this is the only var which we need before we come back from
     #   the recursion.
@@ -526,7 +530,6 @@ 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",
index 76e32dd..0b4f656 100644 (file)
@@ -4,7 +4,10 @@ subdirmk: warning (broken-var-ref): ./Dir.sd.mk:19: broken $&... expansion; you
 subdirmk: warning (local+global): saw both WARN and &WARN
  saw WARN at ./Dir.sd.mk:6
  saw WARN at ./Dir.sd.mk:9
+ saw WARN at ./sub/dir/Dir.sd.mk:16
+ saw WARN at ./sub/dir/Dir.sd.mk:19
  saw &WARN at ./Dir.sd.mk:7
  saw &WARN at ./Dir.sd.mk:10
  saw &WARN at ./Dir.sd.mk:11
+ saw &WARN at ./sub/dir/Dir.sd.mk:15
 subdirmk: warning (unknown-warning): ./sub/dir/Dir.sd.mk:3: attempt to suppress unknown warning(s) `some-unknown-warning'
index 812e51b..f545495 100644 (file)
@@ -11,6 +11,11 @@ sub_dir_TARGETS_sometarget2
 
 line joining
 
+sub_dir_WARN += 4
+WARN += 4
+sub_dir_WARN += 5 # this warning suppressed, precisely
+WARN += 5
+
 # doctests:
 # Suffix in sub/dir
 
index 4b5a50c..a939bbf 100644 (file)
 line &\
 joining
 
+&WARN += 4
+WARN += 4
+&:local+global &WARN
+&WARN += 5 # this warning suppressed, precisely
+WARN += 5
+
 # doctests:
 &:include &doctests.sd.mk