...
Run Format

Source file test/nilptr3.go

Documentation: test

     1  // errorcheck -0 -d=nil
     2  
     3  // +build !wasm
     4  
     5  // Copyright 2013 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  
     9  // Test that nil checks are removed.
    10  // Optimization is enabled.
    11  
    12  package p
    13  
    14  type Struct struct {
    15  	X int
    16  	Y float64
    17  }
    18  
    19  type BigStruct struct {
    20  	X int
    21  	Y float64
    22  	A [1 << 20]int
    23  	Z string
    24  }
    25  
    26  type Empty struct {
    27  }
    28  
    29  type Empty1 struct {
    30  	Empty
    31  }
    32  
    33  var (
    34  	intp       *int
    35  	arrayp     *[10]int
    36  	array0p    *[0]int
    37  	bigarrayp  *[1 << 26]int
    38  	structp    *Struct
    39  	bigstructp *BigStruct
    40  	emptyp     *Empty
    41  	empty1p    *Empty1
    42  )
    43  
    44  func f1() {
    45  	_ = *intp // ERROR "generated nil check"
    46  
    47  	// This one should be removed but the block copy needs
    48  	// to be turned into its own pseudo-op in order to see
    49  	// the indirect.
    50  	_ = *arrayp // ERROR "generated nil check"
    51  
    52  	// 0-byte indirect doesn't suffice.
    53  	// we don't registerize globals, so there are no removed.* nil checks.
    54  	_ = *array0p // ERROR "generated nil check"
    55  	_ = *array0p // ERROR "removed nil check"
    56  
    57  	_ = *intp    // ERROR "removed nil check"
    58  	_ = *arrayp  // ERROR "removed nil check"
    59  	_ = *structp // ERROR "generated nil check"
    60  	_ = *emptyp  // ERROR "generated nil check"
    61  	_ = *arrayp  // ERROR "removed nil check"
    62  }
    63  
    64  func f2() {
    65  	var (
    66  		intp       *int
    67  		arrayp     *[10]int
    68  		array0p    *[0]int
    69  		bigarrayp  *[1 << 20]int
    70  		structp    *Struct
    71  		bigstructp *BigStruct
    72  		emptyp     *Empty
    73  		empty1p    *Empty1
    74  	)
    75  
    76  	_ = *intp       // ERROR "generated nil check"
    77  	_ = *arrayp     // ERROR "generated nil check"
    78  	_ = *array0p    // ERROR "generated nil check"
    79  	_ = *array0p    // ERROR "removed.* nil check"
    80  	_ = *intp       // ERROR "removed.* nil check"
    81  	_ = *arrayp     // ERROR "removed.* nil check"
    82  	_ = *structp    // ERROR "generated nil check"
    83  	_ = *emptyp     // ERROR "generated nil check"
    84  	_ = *arrayp     // ERROR "removed.* nil check"
    85  	_ = *bigarrayp  // ERROR "generated nil check" ARM removed nil check before indirect!!
    86  	_ = *bigstructp // ERROR "generated nil check"
    87  	_ = *empty1p    // ERROR "generated nil check"
    88  }
    89  
    90  func fx10k() *[10000]int
    91  
    92  var b bool
    93  
    94  func f3(x *[10000]int) {
    95  	// Using a huge type and huge offsets so the compiler
    96  	// does not expect the memory hardware to fault.
    97  	_ = x[9999] // ERROR "generated nil check"
    98  
    99  	for {
   100  		if x[9999] != 0 { // ERROR "removed nil check"
   101  			break
   102  		}
   103  	}
   104  
   105  	x = fx10k()
   106  	_ = x[9999] // ERROR "generated nil check"
   107  	if b {
   108  		_ = x[9999] // ERROR "removed.* nil check"
   109  	} else {
   110  		_ = x[9999] // ERROR "removed.* nil check"
   111  	}
   112  	_ = x[9999] // ERROR "removed nil check"
   113  
   114  	x = fx10k()
   115  	if b {
   116  		_ = x[9999] // ERROR "generated nil check"
   117  	} else {
   118  		_ = x[9999] // ERROR "generated nil check"
   119  	}
   120  	_ = x[9999] // ERROR "generated nil check"
   121  
   122  	fx10k()
   123  	// This one is a bit redundant, if we figured out that
   124  	// x wasn't going to change across the function call.
   125  	// But it's a little complex to do and in practice doesn't
   126  	// matter enough.
   127  	_ = x[9999] // ERROR "removed nil check"
   128  }
   129  
   130  func f3a() {
   131  	x := fx10k()
   132  	y := fx10k()
   133  	z := fx10k()
   134  	_ = &x[9] // ERROR "generated nil check"
   135  	y = z
   136  	_ = &x[9] // ERROR "removed.* nil check"
   137  	x = y
   138  	_ = &x[9] // ERROR "generated nil check"
   139  }
   140  
   141  func f3b() {
   142  	x := fx10k()
   143  	y := fx10k()
   144  	_ = &x[9] // ERROR "generated nil check"
   145  	y = x
   146  	_ = &x[9] // ERROR "removed.* nil check"
   147  	x = y
   148  	_ = &x[9] // ERROR "removed.* nil check"
   149  }
   150  
   151  func fx10() *[10]int
   152  
   153  func f4(x *[10]int) {
   154  	// Most of these have no checks because a real memory reference follows,
   155  	// and the offset is small enough that if x is nil, the address will still be
   156  	// in the first unmapped page of memory.
   157  
   158  	_ = x[9] // ERROR "generated nil check" // bug: would like to remove this check (but nilcheck and load are in different blocks)
   159  
   160  	for {
   161  		if x[9] != 0 { // ERROR "removed nil check"
   162  			break
   163  		}
   164  	}
   165  
   166  	x = fx10()
   167  	_ = x[9] // ERROR "generated nil check" // bug would like to remove before indirect
   168  	if b {
   169  		_ = x[9] // ERROR "removed nil check"
   170  	} else {
   171  		_ = x[9] // ERROR "removed nil check"
   172  	}
   173  	_ = x[9] // ERROR "removed nil check"
   174  
   175  	x = fx10()
   176  	if b {
   177  		_ = x[9] // ERROR "generated nil check"  // bug would like to remove before indirect
   178  	} else {
   179  		_ = &x[9] // ERROR "generated nil check"
   180  	}
   181  	_ = x[9] // ERROR "generated nil check"  // bug would like to remove before indirect
   182  
   183  	fx10()
   184  	_ = x[9] // ERROR "removed nil check"
   185  
   186  	x = fx10()
   187  	y := fx10()
   188  	_ = &x[9] // ERROR "generated nil check"
   189  	y = x
   190  	_ = &x[9] // ERROR "removed[a-z ]* nil check"
   191  	x = y
   192  	_ = &x[9] // ERROR "removed[a-z ]* nil check"
   193  }
   194  
   195  func f5(p *float32, q *float64, r *float32, s *float64) float64 {
   196  	x := float64(*p) // ERROR "removed nil check"
   197  	y := *q          // ERROR "removed nil check"
   198  	*r = 7           // ERROR "removed nil check"
   199  	*s = 9           // ERROR "removed nil check"
   200  	return x + y
   201  }
   202  
   203  type T [29]byte
   204  
   205  func f6(p, q *T) {
   206  	x := *p // ERROR "removed nil check"
   207  	*q = x  // ERROR "removed nil check"
   208  }
   209  
   210  func m1(m map[int][80]byte) byte {
   211  	v := m[3] // ERROR "removed nil check"
   212  	return v[5]
   213  }
   214  func m2(m map[int][800]byte) byte {
   215  	v := m[3] // ERROR "removed nil check"
   216  	return v[5]
   217  }
   218  func m3(m map[int][80]byte) (byte, bool) {
   219  	v, ok := m[3] // ERROR "removed nil check"
   220  	return v[5], ok
   221  }
   222  func m4(m map[int][800]byte) (byte, bool) {
   223  	v, ok := m[3] // ERROR "removed nil check"
   224  	return v[5], ok
   225  }
   226  func p1() byte {
   227  	p := new([100]byte)
   228  	return p[5] // ERROR "removed nil check"
   229  }
   230  
   231  // make sure not to do nil check for access of PAUTOHEAP
   232  //go:noinline
   233  func (p *Struct) m() {}
   234  func c1() {
   235  	var x Struct
   236  	func() { x.m() }() // ERROR "removed nil check"
   237  }
   238  
   239  type SS struct {
   240  	x byte
   241  }
   242  
   243  type TT struct {
   244  	SS
   245  }
   246  
   247  func f(t *TT) *byte {
   248  	// See issue 17242.
   249  	s := &t.SS  // ERROR "removed nil check"
   250  	return &s.x // ERROR "generated nil check"
   251  }
   252  
   253  // make sure not to do nil check for newobject
   254  func f7() (*Struct, float64) {
   255  	t := new(Struct)
   256  	p := &t.Y    // ERROR "removed nil check"
   257  	return t, *p // ERROR "removed nil check"
   258  }
   259  
   260  // make sure to remove nil check for memory move (issue #18003)
   261  func f8(t *[8]int) [8]int {
   262  	return *t // ERROR "removed nil check"
   263  }
   264  
   265  func f9() []int {
   266  	x := new([1]int)
   267  	x[0] = 1  // ERROR "removed nil check"
   268  	y := x[:] // ERROR "removed nil check"
   269  	return y
   270  }
   271  

View as plain text