diff --git a/ast/compile.go b/ast/compile.go index 28392cade0..c4c89ca6f4 100644 --- a/ast/compile.go +++ b/ast/compile.go @@ -2385,8 +2385,9 @@ func (c *Compiler) rewriteLocalVarsInRule(rule *Rule, unusedArgs VarSet, argsSta // Rewrite assignments in body. used := NewVarSet() - last := rule.Head.Ref()[len(rule.Head.Ref())-1] - used.Update(last.Vars()) + for _, t := range rule.Head.Ref()[1:] { + used.Update(t.Vars()) + } if rule.Head.Key != nil { used.Update(rule.Head.Key.Vars()) diff --git a/ast/compile_test.go b/ast/compile_test.go index 2dcdf75ab8..a771f5439e 100644 --- a/ast/compile_test.go +++ b/ast/compile_test.go @@ -6861,6 +6861,8 @@ func TestCompilerMockVirtualDocumentPartially(t *testing.T) { } func TestCompilerCheckUnusedAssignedVar(t *testing.T) { + t.Setenv("EXPERIMENTAL_GENERAL_RULE_REFS", "true") + type testCase struct { note string module string @@ -7278,6 +7280,29 @@ func TestCompilerCheckUnusedAssignedVar(t *testing.T) { &Error{Message: "assigned var y unused"}, }, }, + { + note: "general ref in rule head", + module: `package test + p[q].r[s] := 1 { + q := "foo" + s := "bar" + t := "baz" + } + `, + expectedErrors: Errors{ + &Error{Message: "assigned var t unused"}, + }, + }, + { + note: "general ref in rule head (no errors)", + module: `package test + p[q].r[s] := 1 { + q := "foo" + s := "bar" + } + `, + expectedErrors: Errors{}, + }, } makeTestRunner := func(tc testCase, strict bool) func(t *testing.T) {