github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/nilptr2.go (about)

     1  // run
     2  
     3  // Copyright 2013 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  package main
     8  
     9  func main() {
    10  	ok := true
    11  	for _, tt := range tests {
    12  		func() {
    13  			defer func() {
    14  				if err := recover(); err == nil {
    15  					println(tt.name, "did not panic")
    16  					ok = false
    17  				}
    18  			}()
    19  			tt.fn()
    20  		}()
    21  	}
    22  	if !ok {
    23  		println("BUG")
    24  	}
    25  }
    26  
    27  var intp *int
    28  var slicep *[]byte
    29  var a10p *[10]int
    30  var a10Mp *[1<<20]int
    31  var structp *Struct
    32  var bigstructp *BigStruct
    33  var i int
    34  var m *M
    35  var m1 *M1
    36  var m2 *M2
    37  
    38  func use(interface{}) {
    39  }
    40  
    41  var tests = []struct{
    42  	name string
    43  	fn func()
    44  }{
    45  	// Edit .+1,/^}/s/^[^	].+/	{"&", func() { println(&) }},\n	{"\&&", func() { println(\&&) }},/g
    46  	{"*intp", func() { println(*intp) }},
    47  	{"&*intp", func() { println(&*intp) }},
    48  	{"*slicep", func() { println(*slicep) }},
    49  	{"&*slicep", func() { println(&*slicep) }},
    50  	{"(*slicep)[0]", func() { println((*slicep)[0]) }},
    51  	{"&(*slicep)[0]", func() { println(&(*slicep)[0]) }},
    52  	{"(*slicep)[i]", func() { println((*slicep)[i]) }},
    53  	{"&(*slicep)[i]", func() { println(&(*slicep)[i]) }},
    54  	{"*a10p", func() { use(*a10p) }},
    55  	{"&*a10p", func() { println(&*a10p) }},
    56  	{"a10p[0]", func() { println(a10p[0]) }},
    57  	{"&a10p[0]", func() { println(&a10p[0]) }},
    58  	{"a10p[i]", func() { println(a10p[i]) }},
    59  	{"&a10p[i]", func() { println(&a10p[i]) }},
    60  	{"*structp", func() { use(*structp) }},
    61  	{"&*structp", func() { println(&*structp) }},
    62  	{"structp.i", func() { println(structp.i) }},
    63  	{"&structp.i", func() { println(&structp.i) }},
    64  	{"structp.j", func() { println(structp.j) }},
    65  	{"&structp.j", func() { println(&structp.j) }},
    66  	{"structp.k", func() { println(structp.k) }},
    67  	{"&structp.k", func() { println(&structp.k) }},
    68  	{"structp.x[0]", func() { println(structp.x[0]) }},
    69  	{"&structp.x[0]", func() { println(&structp.x[0]) }},
    70  	{"structp.x[i]", func() { println(structp.x[i]) }},
    71  	{"&structp.x[i]", func() { println(&structp.x[i]) }},
    72  	{"structp.x[9]", func() { println(structp.x[9]) }},
    73  	{"&structp.x[9]", func() { println(&structp.x[9]) }},
    74  	{"structp.l", func() { println(structp.l) }},
    75  	{"&structp.l", func() { println(&structp.l) }},
    76  	{"*bigstructp", func() { use(*bigstructp) }},
    77  	{"&*bigstructp", func() { println(&*bigstructp) }},
    78  	{"bigstructp.i", func() { println(bigstructp.i) }},
    79  	{"&bigstructp.i", func() { println(&bigstructp.i) }},
    80  	{"bigstructp.j", func() { println(bigstructp.j) }},
    81  	{"&bigstructp.j", func() { println(&bigstructp.j) }},
    82  	{"bigstructp.k", func() { println(bigstructp.k) }},
    83  	{"&bigstructp.k", func() { println(&bigstructp.k) }},
    84  	{"bigstructp.x[0]", func() { println(bigstructp.x[0]) }},
    85  	{"&bigstructp.x[0]", func() { println(&bigstructp.x[0]) }},
    86  	{"bigstructp.x[i]", func() { println(bigstructp.x[i]) }},
    87  	{"&bigstructp.x[i]", func() { println(&bigstructp.x[i]) }},
    88  	{"bigstructp.x[9]", func() { println(bigstructp.x[9]) }},
    89  	{"&bigstructp.x[9]", func() { println(&bigstructp.x[9]) }},
    90  	{"bigstructp.x[100<<20]", func() { println(bigstructp.x[100<<20]) }},
    91  	{"&bigstructp.x[100<<20]", func() { println(&bigstructp.x[100<<20]) }},
    92  	{"bigstructp.l", func() { println(bigstructp.l) }},
    93  	{"&bigstructp.l", func() { println(&bigstructp.l) }},
    94  	{"m1.F()", func() { println(m1.F()) }},
    95  	{"m1.M.F()", func() { println(m1.M.F()) }},
    96  	{"m2.F()", func() { println(m2.F()) }},
    97  	{"m2.M.F()", func() { println(m2.M.F()) }},
    98  }
    99  
   100  type Struct struct {
   101  	i int
   102  	j float64
   103  	k string
   104  	x [10]int
   105  	l []byte
   106  }
   107  
   108  type BigStruct struct {
   109  	i int
   110  	j float64
   111  	k string
   112  	x [128<<20]byte
   113  	l []byte
   114  }
   115  
   116  type M struct {
   117  }
   118  
   119  func (m *M) F() int {return 0}
   120  
   121  type M1 struct {
   122  	M
   123  }
   124  
   125  type M2 struct {
   126  	x int
   127  	M
   128  }