1
0
mirror of https://github.com/golang/go synced 2024-11-05 14:56:10 -07:00
go/test/abi/wrapdefer_largetmp.go
Than McIntosh cfac62a1cc cmd/compile: fix bug in defer wrapping
The defer wrapping feature added to the compiler's "order" phase
creates temporaries into which it copies defer arguments. If one of
these temps is large enough that we place it into the defer closure by
address (as opposed to by value), then the temp in question can't be
reused later on in the order phase, nor do we want a VARKILL
annotation for it at the end of the current block scope.

Test written by Cherry.

Updates #40724.

Change-Id: Iec7efd87ec5a3e3d7de41cdcc7f39c093ed1e815
Reviewed-on: https://go-review.googlesource.com/c/go/+/312869
Trust: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
2021-04-23 01:16:19 +00:00

38 lines
469 B
Go

// run
//go:build !wasm
// +build !wasm
// 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
//go:noinline
func F() {
b := g()
defer g2(b)
n := g()[20]
println(n)
}
type T [45]int
var x = 0
//go:noinline
func g() T {
x++
return T{20: x}
}
//go:noinline
func g2(t T) {
if t[20] != 1 {
println("FAIL", t[20])
}
}
func main() { F() }