]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't double-walk the map argument of clear
authorKeith Randall <khr@golang.org>
Wed, 4 Feb 2026 23:29:40 +0000 (15:29 -0800)
committerKeith Randall <khr@golang.org>
Thu, 5 Feb 2026 01:48:06 +0000 (17:48 -0800)
mkcallstmt1 already walks the map argument of clear. mapClear then
walks it again, which can cause problems if it is some syntax that is
non-idempotent under walk.  That is the case for the new way map
lookups are being lowered in CL 736020.

Fixes #77435

Change-Id: Ib2f6d7f2270308c2462aa276ed4413aaf7799fe3
Reviewed-on: https://go-review.googlesource.com/c/go/+/742120
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/compile/internal/walk/range.go
test/fixedbugs/issue77435.go [new file with mode: 0644]

index 866dd23defead04771097dfe7ba208406fcbc955..e6a9a4bcfb5cb8735ab83e61e63b032df2b0cc6e 100644 (file)
@@ -477,7 +477,7 @@ func mapClear(m, rtyp ir.Node) ir.Node {
        // instantiate mapclear(typ *type, hmap map[any]any)
        fn := typecheck.LookupRuntime("mapclear", t.Key(), t.Elem())
        n := mkcallstmt1(fn, rtyp, m)
-       return walkStmt(typecheck.Stmt(n))
+       return typecheck.Stmt(n)
 }
 
 // Lower n into runtime·memclr if possible, for
diff --git a/test/fixedbugs/issue77435.go b/test/fixedbugs/issue77435.go
new file mode 100644 (file)
index 0000000..f3fc45f
--- /dev/null
@@ -0,0 +1,15 @@
+// compile
+
+// Copyright 2026 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Issue 77435: compiler crash on clear of map resulting
+// from a map lookup (or some other syntax that is
+// non-idempotent during walk).
+
+package p
+
+func f(s map[int]map[int]int) {
+       clear(s[0])
+}