go/test/abi/map.go
Cherry Zhang 3ff6ff7f84 cmd/compile: preserve pointerness when creating map key temp
When creating the temporary for map functions, if the key
contains pointer, we need to create pointer-typed temporary. So
if the temporary is live across a function call, the pointer is
live.

Change-Id: Id6e14ec9def8bc7987f0f8ce8423caf1e3754fcb
Reviewed-on: https://go-review.googlesource.com/c/go/+/311379
Trust: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
2021-04-20 14:30:03 +00:00

34 lines
557 B
Go

// run
// Copyright 2021 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 main
import "runtime"
type T [10]int
var m map[*T]int
//go:noinline
func F() {
m = map[*T]int{
K(): V(), // the key temp should be live across call to V
}
}
//go:noinline
func V() int { runtime.GC(); runtime.GC(); runtime.GC(); return 123 }
//go:noinline
func K() *T {
p := new(T)
runtime.SetFinalizer(p, func(*T) { println("FAIL") })
return p
}
func main() {
F()
}