diff --git a/src/cmd/compile/internal/gc/range.go b/src/cmd/compile/internal/gc/range.go index cbe69a1ebc..5c19d54e78 100644 --- a/src/cmd/compile/internal/gc/range.go +++ b/src/cmd/compile/internal/gc/range.go @@ -586,7 +586,7 @@ func arrayClear(n, v1, v2, a *Node) bool { n.Nbody.Append(nod(OAS, hn, tmp)) var fn *Node - if types.Haspointers(a.Type.Elem()) { + if a.Type.Elem().HasHeapPointer() { // memclrHasPointers(hp, hn) Curfn.Func.setWBPos(stmt.Pos) fn = mkcall("memclrHasPointers", nil, nil, hp, hn) diff --git a/test/notinheap3.go b/test/notinheap3.go index d48c2a0cc9..5ace8d6793 100644 --- a/test/notinheap3.go +++ b/test/notinheap3.go @@ -58,3 +58,19 @@ func h() { _ = append(v1s, v1s...) // no barrier _ = append(v2s, v2s...) // ERROR "write barrier" } + +// Slice clearing + +var ( + sliceIH []*ih + sliceNIH []*nih +) + +func sliceClear() { + for i := range sliceIH { + sliceIH[i] = nil // ERROR "write barrier" + } + for i := range sliceNIH { + sliceNIH[i] = nil // no barrier + } +}