|  | // 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) | 
|  | } |