github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/test/fixedbugs/issue4909b.go (about)

     1  // errorcheckoutput
     2  
     3  package main
     4  
     5  import "fmt"
     6  
     7  // We are going to define 256 types T(n),
     8  // such that T(n) embeds T(2n) and *T(2n+1).
     9  
    10  func main() {
    11  	fmt.Printf("// errorcheck\n\n")
    12  	fmt.Printf("package p\n\n")
    13  	fmt.Println(`import "unsafe"`)
    14  
    15  	// Dump types.
    16  	for n := 1; n < 256; n++ {
    17  		writeStruct(n)
    18  	}
    19  	// Dump leaves
    20  	for n := 256; n < 512; n++ {
    21  		fmt.Printf("type T%d int\n", n)
    22  	}
    23  
    24  	fmt.Printf("var t T1\n")
    25  	fmt.Printf("var p *T1\n")
    26  
    27  	// Simple selectors
    28  	for n := 2; n < 256; n++ {
    29  		writeDot(n)
    30  	}
    31  
    32  	// Double selectors
    33  	for n := 128; n < 256; n++ {
    34  		writeDot(n/16, n)
    35  	}
    36  
    37  	// Triple selectors
    38  	for n := 128; n < 256; n++ {
    39  		writeDot(n/64, n/8, n)
    40  	}
    41  }
    42  
    43  const structTpl = `
    44  type T%d struct {
    45  	A%d int
    46  	T%d
    47  	*T%d
    48  }
    49  `
    50  
    51  func writeStruct(n int) {
    52  	fmt.Printf(structTpl, n, n, 2*n, 2*n+1)
    53  }
    54  
    55  func writeDot(ns ...int) {
    56  	for _, root := range []string{"t", "p"} {
    57  		fmt.Printf("const _ = unsafe.Offsetof(%s", root)
    58  		for _, n := range ns {
    59  			fmt.Printf(".T%d", n)
    60  		}
    61  		// Does it involve an indirection?
    62  		nlast := ns[len(ns)-1]
    63  		nprev := 1
    64  		if len(ns) > 1 {
    65  			nprev = ns[len(ns)-2]
    66  		}
    67  		isIndirect := false
    68  		for n := nlast / 2; n > nprev; n /= 2 {
    69  			if n%2 == 1 {
    70  				isIndirect = true
    71  				break
    72  			}
    73  		}
    74  		fmt.Print(")")
    75  		if isIndirect {
    76  			fmt.Print(` // ERROR "indirection"`)
    77  		}
    78  		fmt.Print("\n")
    79  	}
    80  }