github.com/gocuntian/go@v0.0.0-20160610041250-fee02d270bf8/test/nilptr3.go (about)

     1  // errorcheck -0 -d=nil
     2  // Fails on ppc64x because of incomplete optimization.
     3  // See issues 9058.
     4  // Same reason for mips64x and s390x.
     5  // +build !ppc64,!ppc64le,!mips64,!mips64le,!amd64,!s390x
     6  
     7  // Copyright 2013 The Go Authors. All rights reserved.
     8  // Use of this source code is governed by a BSD-style
     9  // license that can be found in the LICENSE file.
    10  
    11  // Test that nil checks are removed.
    12  // Optimization is enabled.
    13  
    14  package p
    15  
    16  type Struct struct {
    17  	X int
    18  	Y float64
    19  }
    20  
    21  type BigStruct struct {
    22  	X int
    23  	Y float64
    24  	A [1 << 20]int
    25  	Z string
    26  }
    27  
    28  type Empty struct {
    29  }
    30  
    31  type Empty1 struct {
    32  	Empty
    33  }
    34  
    35  var (
    36  	intp       *int
    37  	arrayp     *[10]int
    38  	array0p    *[0]int
    39  	bigarrayp  *[1 << 26]int
    40  	structp    *Struct
    41  	bigstructp *BigStruct
    42  	emptyp     *Empty
    43  	empty1p    *Empty1
    44  )
    45  
    46  func f1() {
    47  	_ = *intp // ERROR "generated nil check"
    48  
    49  	// This one should be removed but the block copy needs
    50  	// to be turned into its own pseudo-op in order to see
    51  	// the indirect.
    52  	_ = *arrayp // ERROR "generated nil check"
    53  
    54  	// 0-byte indirect doesn't suffice.
    55  	// we don't registerize globals, so there are no removed repeated nil checks.
    56  	_ = *array0p // ERROR "generated nil check"
    57  	_ = *array0p // ERROR "generated nil check"
    58  
    59  	_ = *intp    // ERROR "generated nil check"
    60  	_ = *arrayp  // ERROR "generated nil check"
    61  	_ = *structp // ERROR "generated nil check"
    62  	_ = *emptyp  // ERROR "generated nil check"
    63  	_ = *arrayp  // ERROR "generated nil check"
    64  }
    65  
    66  func f2() {
    67  	var (
    68  		intp       *int
    69  		arrayp     *[10]int
    70  		array0p    *[0]int
    71  		bigarrayp  *[1 << 20]int
    72  		structp    *Struct
    73  		bigstructp *BigStruct
    74  		emptyp     *Empty
    75  		empty1p    *Empty1
    76  	)
    77  
    78  	_ = *intp       // ERROR "generated nil check"
    79  	_ = *arrayp     // ERROR "generated nil check"
    80  	_ = *array0p    // ERROR "generated nil check"
    81  	_ = *array0p    // ERROR "removed repeated nil check"
    82  	_ = *intp       // ERROR "removed repeated nil check"
    83  	_ = *arrayp     // ERROR "removed repeated nil check"
    84  	_ = *structp    // ERROR "generated nil check"
    85  	_ = *emptyp     // ERROR "generated nil check"
    86  	_ = *arrayp     // ERROR "removed repeated nil check"
    87  	_ = *bigarrayp  // ERROR "generated nil check" ARM removed nil check before indirect!!
    88  	_ = *bigstructp // ERROR "generated nil check"
    89  	_ = *empty1p    // ERROR "generated nil check"
    90  }
    91  
    92  func fx10k() *[10000]int
    93  
    94  var b bool
    95  
    96  func f3(x *[10000]int) {
    97  	// Using a huge type and huge offsets so the compiler
    98  	// does not expect the memory hardware to fault.
    99  	_ = x[9999] // ERROR "generated nil check"
   100  
   101  	for {
   102  		if x[9999] != 0 { // ERROR "generated nil check"
   103  			break
   104  		}
   105  	}
   106  
   107  	x = fx10k()
   108  	_ = x[9999] // ERROR "generated nil check"
   109  	if b {
   110  		_ = x[9999] // ERROR "removed repeated nil check"
   111  	} else {
   112  		_ = x[9999] // ERROR "removed repeated nil check"
   113  	}
   114  	_ = x[9999] // ERROR "generated nil check"
   115  
   116  	x = fx10k()
   117  	if b {
   118  		_ = x[9999] // ERROR "generated nil check"
   119  	} else {
   120  		_ = x[9999] // ERROR "generated nil check"
   121  	}
   122  	_ = x[9999] // ERROR "generated nil check"
   123  
   124  	fx10k()
   125  	// This one is a bit redundant, if we figured out that
   126  	// x wasn't going to change across the function call.
   127  	// But it's a little complex to do and in practice doesn't
   128  	// matter enough.
   129  	_ = x[9999] // ERROR "generated nil check"
   130  }
   131  
   132  func f3a() {
   133  	x := fx10k()
   134  	y := fx10k()
   135  	z := fx10k()
   136  	_ = &x[9] // ERROR "generated nil check"
   137  	y = z
   138  	_ = &x[9] // ERROR "removed repeated nil check"
   139  	x = y
   140  	_ = &x[9] // ERROR "generated nil check"
   141  }
   142  
   143  func f3b() {
   144  	x := fx10k()
   145  	y := fx10k()
   146  	_ = &x[9] // ERROR "generated nil check"
   147  	y = x
   148  	_ = &x[9] // ERROR "removed repeated nil check"
   149  	x = y
   150  	_ = &x[9] // ERROR "removed repeated nil check"
   151  }
   152  
   153  func fx10() *[10]int
   154  
   155  func f4(x *[10]int) {
   156  	// Most of these have no checks because a real memory reference follows,
   157  	// and the offset is small enough that if x is nil, the address will still be
   158  	// in the first unmapped page of memory.
   159  
   160  	_ = x[9] // ERROR "removed nil check before indirect"
   161  
   162  	for {
   163  		if x[9] != 0 { // ERROR "removed nil check before indirect"
   164  			break
   165  		}
   166  	}
   167  
   168  	x = fx10()
   169  	_ = x[9] // ERROR "removed nil check before indirect"
   170  	if b {
   171  		_ = x[9] // ERROR "removed nil check before indirect"
   172  	} else {
   173  		_ = x[9] // ERROR "removed nil check before indirect"
   174  	}
   175  	_ = x[9] // ERROR "removed nil check before indirect"
   176  
   177  	x = fx10()
   178  	if b {
   179  		_ = x[9] // ERROR "removed nil check before indirect"
   180  	} else {
   181  		_ = &x[9] // ERROR "generated nil check"
   182  	}
   183  	_ = x[9] // ERROR "removed nil check before indirect"
   184  
   185  	fx10()
   186  	_ = x[9] // ERROR "removed nil check before indirect"
   187  
   188  	x = fx10()
   189  	y := fx10()
   190  	_ = &x[9] // ERROR "generated nil check"
   191  	y = x
   192  	_ = &x[9] // ERROR "removed repeated nil check"
   193  	x = y
   194  	_ = &x[9] // ERROR "removed repeated nil check"
   195  }
   196  
   197  func m1(m map[int][80]byte) byte {
   198  	v := m[3] // ERROR "removed nil check"
   199  	return v[5]
   200  }
   201  func m2(m map[int][800]byte) byte {
   202  	v := m[3] // ERROR "removed nil check"
   203  	return v[5]
   204  }
   205  func m3(m map[int][80]byte) (byte, bool) {
   206  	v, ok := m[3] // ERROR "removed nil check"
   207  	return v[5], ok
   208  }
   209  func m4(m map[int][800]byte) (byte, bool) {
   210  	v, ok := m[3] // ERROR "removed nil check"
   211  	return v[5], ok
   212  }
   213  func p1() byte {
   214  	p := new([100]byte)
   215  	return p[5] // ERROR "removed nil check"
   216  }