modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/fixedbugs/issue14591.go (about)

     1  // run
     2  
     3  // Copyright 2016 The Go Authors. All rights reserved.
     4  // Use of this source code is governed by a BSD-style
     5  // license that can be found in the LICENSE file.
     6  
     7  // Test to make sure we don't think values are dead
     8  // when they are assigned to a PPARAMOUT slot before
     9  // the last GC safepoint.
    10  
    11  package main
    12  
    13  import (
    14  	"fmt"
    15  	"runtime"
    16  )
    17  
    18  // When a T is deallocated, T[1] is certain to
    19  // get clobbered (the runtime writes 0xdeaddeaddeaddead there).
    20  type T [4]int
    21  
    22  func f() (r, s *T) {
    23  	r = &T{0x30, 0x31, 0x32, 0x33}
    24  	runtime.GC()
    25  	s = &T{0x40, 0x41, 0x42, 0x43}
    26  	runtime.GC()
    27  	return
    28  }
    29  
    30  func main() {
    31  	r, s := f()
    32  	if r[1] != 0x31 {
    33  		fmt.Printf("bad r[1], want 0x31 got %x\n", r[1])
    34  	}
    35  	if s[1] != 0x41 {
    36  		fmt.Printf("bad s[1], want 0x41 got %x\n", s[1])
    37  	}
    38  }