modfile: ensure that Cleanup removes extraneous entries after SetRequire

Updates golang/go#34822

Change-Id: If6981c8673c2843f5075d6d9a478bcf80f26e2fb
Reviewed-on: https://go-review.googlesource.com/c/mod/+/204821
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
diff --git a/modfile/rule.go b/modfile/rule.go
index 95fefec..66b08d9 100644
--- a/modfile/rule.go
+++ b/modfile/rule.go
@@ -555,6 +555,8 @@
 		if v, ok := need[r.Mod.Path]; ok {
 			r.Mod.Version = v
 			r.Indirect = indirect[r.Mod.Path]
+		} else {
+			*r = Require{}
 		}
 	}
 
diff --git a/modfile/rule_test.go b/modfile/rule_test.go
index 73e3386..f009f0b 100644
--- a/modfile/rule_test.go
+++ b/modfile/rule_test.go
@@ -75,6 +75,7 @@
 			x.y/b v1.2.3
 
 			x.y/a v1.2.3
+			x.y/d v1.2.3
 		)
 		`,
 		[]struct {
@@ -158,6 +159,11 @@
 			if !bytes.Equal(out, golden) {
 				t.Errorf("have:\n%s\nwant:\n%s", out, golden)
 			}
+
+			f.Cleanup()
+			if len(f.Require) != len(mods) {
+				t.Errorf("after Cleanup, len(Require) = %v; want %v", len(f.Require), len(mods))
+			}
 		})
 	}
 }