| // Copyright 2019 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 b | |
| import ( | |
| "io/ioutil" | |
| "./a" | |
| ) | |
| var G int | |
| // An inlinable function. To trigger the bug in question this needs | |
| // to be inlined here within the package and also inlined into some | |
| // other package that imports it. | |
| func ReadValues(data []byte) (vals map[string]interface{}, err error) { | |
| err = a.Unmarshal(data, &vals) | |
| if len(vals) == 0 { | |
| vals = map[string]interface{}{} | |
| } | |
| return | |
| } | |
| // A local call to the function above, which triggers the "move to heap" | |
| // of the output param. | |
| func CallReadValues(filename string) (map[string]interface{}, error) { | |
| defer func() { G++ }() | |
| data, err := ioutil.ReadFile(filename) | |
| if err != nil { | |
| return map[string]interface{}{}, err | |
| } | |
| return ReadValues(data) | |
| } |