]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix escape reason for MAKESLICE with no cap
authorAlberto Donizetti <alb.donizetti@gmail.com>
Sat, 26 Sep 2020 07:42:59 +0000 (09:42 +0200)
committerAlberto Donizetti <alb.donizetti@gmail.com>
Mon, 28 Sep 2020 06:38:58 +0000 (06:38 +0000)
When explaining why the slice from a make() call escapes for the -m -m
message, we print "non-const size" if any one of Isconst(n.Left) and
Isconst(n.Right) return false; but for OMAKESLICE nodes with no cap,
n.Right is nil, so Isconst(n.Right, CTINT) will be always false.

Only call Isconst on n.Right if it's not nil.

Fixes #41635

Change-Id: I8729801a9b234b68ae40adad64d66fa7653adf09
Reviewed-on: https://go-review.googlesource.com/c/go/+/257641
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@golang.org>
Trust: Alberto Donizetti <alb.donizetti@gmail.com>

src/cmd/compile/internal/gc/escape.go
test/fixedbugs/issue41635.go [new file with mode: 0644]

index f435d8ff6adb14f55c8e989cbb5c8c0018aa4a56..d79d32ec48a58e51f46f069ec059ecb841f3eafb 100644 (file)
@@ -1053,7 +1053,7 @@ func (e *Escape) newLoc(n *Node, transient bool) *EscLocation {
 
                if mustHeapAlloc(n) {
                        why := "too large for stack"
-                       if n.Op == OMAKESLICE && (!Isconst(n.Left, CTINT) || !Isconst(n.Right, CTINT)) {
+                       if n.Op == OMAKESLICE && (!Isconst(n.Left, CTINT) || (n.Right != nil && !Isconst(n.Right, CTINT))) {
                                why = "non-constant size"
                        }
                        e.flow(e.heapHole().addr(n, why), loc)
diff --git a/test/fixedbugs/issue41635.go b/test/fixedbugs/issue41635.go
new file mode 100644 (file)
index 0000000..b33c1a0
--- /dev/null
@@ -0,0 +1,18 @@
+//errorcheck -0 -m -m
+
+// Copyright 2020 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.
+
+package p
+
+func f() { // ERROR ""
+       b1 := make([]byte, 1<<17)      // ERROR "too large for stack" ""
+       b2 := make([]byte, 100, 1<<17) // ERROR "too large for stack" ""
+
+       n, m := 100, 200
+       b1 = make([]byte, n)      // ERROR "non-constant size" ""
+       b2 = make([]byte, 100, m) // ERROR "non-constant size" ""
+
+       _, _ = b1, b2
+}