Home | History | Annotate | Download | only in test
      1 // errorcheck -0 -N -d=nil
      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 // Test that nil checks are inserted.
      8 // Optimization is disabled, so redundant checks are not removed.
      9 
     10 package p
     11 
     12 type Struct struct {
     13 	X int
     14 	Y float64
     15 }
     16 
     17 type BigStruct struct {
     18 	X int
     19 	Y float64
     20 	A [1 << 20]int
     21 	Z string
     22 }
     23 
     24 type Empty struct {
     25 }
     26 
     27 type Empty1 struct {
     28 	Empty
     29 }
     30 
     31 var (
     32 	intp       *int
     33 	arrayp     *[10]int
     34 	array0p    *[0]int
     35 	bigarrayp  *[1 << 26]int
     36 	structp    *Struct
     37 	bigstructp *BigStruct
     38 	emptyp     *Empty
     39 	empty1p    *Empty1
     40 )
     41 
     42 func f1() {
     43 	_ = *intp    // ERROR "nil check"
     44 	_ = *arrayp  // ERROR "nil check"
     45 	_ = *array0p // ERROR "nil check"
     46 	_ = *array0p // ERROR "nil check"
     47 	_ = *intp    // ERROR "nil check"
     48 	_ = *arrayp  // ERROR "nil check"
     49 	_ = *structp // ERROR "nil check"
     50 	_ = *emptyp  // ERROR "nil check"
     51 	_ = *arrayp  // ERROR "nil check"
     52 }
     53 
     54 func f2() {
     55 	var (
     56 		intp       *int
     57 		arrayp     *[10]int
     58 		array0p    *[0]int
     59 		bigarrayp  *[1 << 20]int
     60 		structp    *Struct
     61 		bigstructp *BigStruct
     62 		emptyp     *Empty
     63 		empty1p    *Empty1
     64 	)
     65 
     66 	_ = *intp       // ERROR "nil check"
     67 	_ = *arrayp     // ERROR "nil check"
     68 	_ = *array0p    // ERROR "nil check"
     69 	_ = *array0p    // ERROR "nil check"
     70 	_ = *intp       // ERROR "nil check"
     71 	_ = *arrayp     // ERROR "nil check"
     72 	_ = *structp    // ERROR "nil check"
     73 	_ = *emptyp     // ERROR "nil check"
     74 	_ = *arrayp     // ERROR "nil check"
     75 	_ = *bigarrayp  // ERROR "nil check"
     76 	_ = *bigstructp // ERROR "nil check"
     77 	_ = *empty1p    // ERROR "nil check"
     78 }
     79 
     80 func fx10k() *[10000]int
     81 
     82 var b bool
     83 
     84 func f3(x *[10000]int) {
     85 	// Using a huge type and huge offsets so the compiler
     86 	// does not expect the memory hardware to fault.
     87 	_ = x[9999] // ERROR "nil check"
     88 
     89 	for {
     90 		if x[9999] != 0 { // ERROR "nil check"
     91 			break
     92 		}
     93 	}
     94 
     95 	x = fx10k()
     96 	_ = x[9999] // ERROR "nil check"
     97 	if b {
     98 		_ = x[9999] // ERROR "nil check"
     99 	} else {
    100 		_ = x[9999] // ERROR "nil check"
    101 	}
    102 	_ = x[9999] // ERROR "nil check"
    103 
    104 	x = fx10k()
    105 	if b {
    106 		_ = x[9999] // ERROR "nil check"
    107 	} else {
    108 		_ = x[9999] // ERROR "nil check"
    109 	}
    110 	_ = x[9999] // ERROR "nil check"
    111 
    112 	fx10k()
    113 	// This one is a bit redundant, if we figured out that
    114 	// x wasn't going to change across the function call.
    115 	// But it's a little complex to do and in practice doesn't
    116 	// matter enough.
    117 	_ = x[9999] // ERROR "nil check"
    118 }
    119 
    120 func f3a() {
    121 	x := fx10k()
    122 	y := fx10k()
    123 	z := fx10k()
    124 	_ = &x[9] // ERROR "nil check"
    125 	y = z
    126 	_ = &x[9] // ERROR "nil check"
    127 	x = y
    128 	_ = &x[9] // ERROR "nil check"
    129 }
    130 
    131 func f3b() {
    132 	x := fx10k()
    133 	y := fx10k()
    134 	_ = &x[9] // ERROR "nil check"
    135 	y = x
    136 	_ = &x[9] // ERROR "nil check"
    137 	x = y
    138 	_ = &x[9] // ERROR "nil check"
    139 }
    140 
    141 func fx10() *[10]int
    142 
    143 func f4(x *[10]int) {
    144 	// Most of these have no checks because a real memory reference follows,
    145 	// and the offset is small enough that if x is nil, the address will still be
    146 	// in the first unmapped page of memory.
    147 
    148 	_ = x[9] // ERROR "nil check"
    149 
    150 	for {
    151 		if x[9] != 0 { // ERROR "nil check"
    152 			break
    153 		}
    154 	}
    155 
    156 	x = fx10()
    157 	_ = x[9] // ERROR "nil check"
    158 	if b {
    159 		_ = x[9] // ERROR "nil check"
    160 	} else {
    161 		_ = x[9] // ERROR "nil check"
    162 	}
    163 	_ = x[9] // ERROR "nil check"
    164 
    165 	x = fx10()
    166 	if b {
    167 		_ = x[9] // ERROR "nil check"
    168 	} else {
    169 		_ = &x[9] // ERROR "nil check"
    170 	}
    171 	_ = x[9] // ERROR "nil check"
    172 
    173 	fx10()
    174 	_ = x[9] // ERROR "nil check"
    175 
    176 	x = fx10()
    177 	y := fx10()
    178 	_ = &x[9] // ERROR "nil check"
    179 	y = x
    180 	_ = &x[9] // ERROR "nil check"
    181 	x = y
    182 	_ = &x[9] // ERROR "nil check"
    183 }
    184 
    185 func f5(m map[string]struct{}) bool {
    186 	// Existence-only map lookups should not generate a nil check
    187 	_, ok := m[""]
    188 	return ok
    189 }
    190