1// run 2 3//go:build !wasm 4 5// Copyright 2021 The Go Authors. All rights reserved. 6// Use of this source code is governed by a BSD-style 7// license that can be found in the LICENSE file. 8 9package main 10 11import ( 12 "fmt" 13) 14 15var sink *string 16 17var y int 18 19//go:registerparams 20//go:noinline 21func F(a, b, c *int) (x int) { 22 x = *a 23 G(&x) 24 x += *b 25 G(&x) 26 x += *c 27 G(&x) 28 return 29} 30 31//go:registerparams 32//go:noinline 33func G(x *int) { 34 y += *x 35 fmt.Println("y = ", y) 36} 37 38//go:registerparams 39//go:noinline 40func X() { 41 *sink += " !!!!!!!!!!!!!!!" 42} 43 44//go:registerparams 45//go:noinline 46func H(s, t string) (result string) { // result leaks to heap 47 result = "Aloha! " + s + " " + t 48 sink = &result 49 r := "" 50 if len(s) <= len(t) { 51 r = "OKAY! " 52 X() 53 } 54 return r + result 55} 56 57//go:registerparams 58//go:noinline 59func K(s, t string) (result string) { // result spills 60 result = "Aloha! " + s + " " + t 61 r := "" 62 if len(s) <= len(t) { 63 r = "OKAY! " 64 X() 65 } 66 return r + result 67} 68 69func main() { 70 a, b, c := 1, 4, 16 71 x := F(&a, &b, &c) 72 fmt.Printf("x = %d\n", x) 73 74 y := H("Hello", "World!") 75 fmt.Println("len(y) =", len(y)) 76 fmt.Println("y =", y) 77 z := H("Hello", "Pal!") 78 fmt.Println("len(z) =", len(z)) 79 fmt.Println("z =", z) 80 81 fmt.Println() 82 83 y = K("Hello", "World!") 84 fmt.Println("len(y) =", len(y)) 85 fmt.Println("y =", y) 86 z = K("Hello", "Pal!") 87 fmt.Println("len(z) =", len(z)) 88 fmt.Println("z =", z) 89 90} 91