mirror of
https://github.com/golang/go
synced 2024-11-26 22:31:23 -07:00
cmd/compile: fix escape reason for MAKESLICE with no cap
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>
This commit is contained in:
parent
5755bad42a
commit
e572218d12
@ -1053,7 +1053,7 @@ func (e *Escape) newLoc(n *Node, transient bool) *EscLocation {
|
|||||||
|
|
||||||
if mustHeapAlloc(n) {
|
if mustHeapAlloc(n) {
|
||||||
why := "too large for stack"
|
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"
|
why = "non-constant size"
|
||||||
}
|
}
|
||||||
e.flow(e.heapHole().addr(n, why), loc)
|
e.flow(e.heapHole().addr(n, why), loc)
|
||||||
|
18
test/fixedbugs/issue41635.go
Normal file
18
test/fixedbugs/issue41635.go
Normal file
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user