modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/uintptrescapes.dir/main.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  	"sync"
    11  	"unsafe"
    12  
    13  	"./a"
    14  )
    15  
    16  func F1() int {
    17  	var buf [1024]int
    18  	a.F1(uintptr(unsafe.Pointer(&buf[0])))
    19  	return buf[0]
    20  }
    21  
    22  func F2() int {
    23  	var buf [1024]int
    24  	a.F2(uintptr(unsafe.Pointer(&buf[0])))
    25  	return buf[0]
    26  }
    27  
    28  var t = a.GetT()
    29  
    30  func M1() int {
    31  	var buf [1024]int
    32  	t.M1(uintptr(unsafe.Pointer(&buf[0])))
    33  	return buf[0]
    34  }
    35  
    36  func M2() int {
    37  	var buf [1024]int
    38  	t.M2(uintptr(unsafe.Pointer(&buf[0])))
    39  	return buf[0]
    40  }
    41  
    42  func main() {
    43  	// Use different goroutines to force stack growth.
    44  	var wg sync.WaitGroup
    45  	wg.Add(4)
    46  	c := make(chan bool, 4)
    47  
    48  	go func() {
    49  		defer wg.Done()
    50  		b := F1()
    51  		if b != 42 {
    52  			fmt.Printf("F1: got %d, expected 42\n", b)
    53  			c <- false
    54  		}
    55  	}()
    56  
    57  	go func() {
    58  		defer wg.Done()
    59  		b := F2()
    60  		if b != 42 {
    61  			fmt.Printf("F2: got %d, expected 42\n", b)
    62  			c <- false
    63  		}
    64  	}()
    65  
    66  	go func() {
    67  		defer wg.Done()
    68  		b := M1()
    69  		if b != 42 {
    70  			fmt.Printf("M1: got %d, expected 42\n", b)
    71  			c <- false
    72  		}
    73  	}()
    74  
    75  	go func() {
    76  		defer wg.Done()
    77  		b := M2()
    78  		if b != 42 {
    79  			fmt.Printf("M2: got %d, expected 42\n", b)
    80  			c <- false
    81  		}
    82  	}()
    83  
    84  	wg.Wait()
    85  
    86  	select {
    87  	case <-c:
    88  		os.Exit(1)
    89  	default:
    90  	}
    91  }