1// Copyright 2013 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package vardecl 6 7// Prerequisites. 8import "math" 9func f() {} 10func g() (x, y int) { return } 11var m map[string]int 12 13// Var decls must have a type or an initializer. 14var _ int 15var _, _ int 16 17// The first error message is produced by the parser. 18// In a real-world scenario, the type-checker would not be run 19// in this case and the 2nd error message would not appear. 20var _ /* ERROR "missing variable type" */ /* ERROR "missing type or init expr" */ 21var _ /* ERROR "missing variable type" */ /* ERROR "missing type or init expr" */, _ 22var _ /* ERROR "missing variable type" */ /* ERROR "missing type or init expr" */, _, _ 23 24// The initializer must be an expression. 25var _ = int /* ERROR "not an expression" */ 26var _ = f /* ERROR "used as value" */ () 27 28// Identifier and expression arity must match. 29var _, _ = 1, 2 30var _ = 1, 2 /* ERROR "extra init expr 2" */ 31var _, _ = 1 /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ 32var _, _, _ /* ERROR "missing init expr for _" */ = 1, 2 33 34var _ = g /* ERROR "2-valued g" */ () 35var _, _ = g() 36var _, _, _ = g /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ () 37 38var _ = m["foo"] 39var _, _ = m["foo"] 40var _, _, _ = m /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ ["foo"] 41 42var _, _ int = 1, 2 43var _ int = 1, 2 /* ERROR "extra init expr 2" */ 44var _, _ int = 1 /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ 45var _, _, _ /* ERROR "missing init expr for _" */ int = 1, 2 46 47var ( 48 _, _ = 1, 2 49 _ = 1, 2 /* ERROR "extra init expr 2" */ 50 _, _ = 1 /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ 51 _, _, _ /* ERROR "missing init expr for _" */ = 1, 2 52 53 _ = g /* ERROR "2-valued g" */ () 54 _, _ = g() 55 _, _, _ = g /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ () 56 57 _ = m["foo"] 58 _, _ = m["foo"] 59 _, _, _ = m /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ ["foo"] 60 61 _, _ int = 1, 2 62 _ int = 1, 2 /* ERROR "extra init expr 2" */ 63 _, _ int = 1 /* ERROR "cannot initialize [0-9]+ variables with [0-9]+ values" */ 64 _, _, _ /* ERROR "missing init expr for _" */ int = 1, 2 65) 66 67// Variables declared in function bodies must be 'used'. 68type T struct{} 69func (r T) _(a, b, c int) (u, v, w int) { 70 var x1 /* ERROR "declared but not used" */ int 71 var x2 /* ERROR "declared but not used" */ int 72 x1 = 1 73 (x2) = 2 74 75 y1 /* ERROR "declared but not used" */ := 1 76 y2 /* ERROR "declared but not used" */ := 2 77 y1 = 1 78 (y1) = 2 79 80 { 81 var x1 /* ERROR "declared but not used" */ int 82 var x2 /* ERROR "declared but not used" */ int 83 x1 = 1 84 (x2) = 2 85 86 y1 /* ERROR "declared but not used" */ := 1 87 y2 /* ERROR "declared but not used" */ := 2 88 y1 = 1 89 (y1) = 2 90 } 91 92 if x /* ERROR "declared but not used" */ := 0; a < b {} 93 94 switch x /* ERROR "declared but not used" */, y := 0, 1; a { 95 case 0: 96 _ = y 97 case 1: 98 x /* ERROR "declared but not used" */ := 0 99 } 100 101 var t interface{} 102 switch t /* ERROR "declared but not used" */ := t.(type) {} 103 104 switch t /* ERROR "declared but not used" */ := t.(type) { 105 case int: 106 } 107 108 switch t /* ERROR "declared but not used" */ := t.(type) { 109 case int: 110 case float32, complex64: 111 t = nil 112 } 113 114 switch t := t.(type) { 115 case int: 116 case float32, complex64: 117 _ = t 118 } 119 120 switch t := t.(type) { 121 case int: 122 case float32: 123 case string: 124 _ = func() string { 125 return t 126 } 127 } 128 129 switch t := t; t /* ERROR "declared but not used" */ := t.(type) {} 130 131 var z1 /* ERROR "declared but not used" */ int 132 var z2 int 133 _ = func(a, b, c int) (u, v, w int) { 134 z1 = a 135 (z1) = b 136 a = z2 137 return 138 } 139 140 var s []int 141 var i /* ERROR "declared but not used" */ , j int 142 for i, j = range s { 143 _ = j 144 } 145 146 for i, j /* ERROR "declared but not used" */ := range s { 147 _ = func() int { 148 return i 149 } 150 } 151 return 152} 153 154// Unused variables in function literals must lead to only one error (issue #22524). 155func _() { 156 _ = func() { 157 var x /* ERROR declared but not used */ int 158 } 159} 160 161// Invalid (unused) expressions must not lead to spurious "declared but not used errors" 162func _() { 163 var a, b, c int 164 var x, y int 165 x, y = a /* ERROR cannot assign [0-9]+ values to [0-9]+ variables */ , b, c 166 _ = x 167 _ = y 168} 169 170func _() { 171 var x int 172 return x /* ERROR no result values expected */ 173 return math /* ERROR no result values expected */ .Sin(0) 174} 175 176func _() int { 177 var x, y int 178 return /* ERROR wrong number of return values */ x, y 179} 180 181// Short variable declarations must declare at least one new non-blank variable. 182func _() { 183 _ := /* ERROR no new variables */ 0 184 _, a := 0, 1 185 _, a := /* ERROR no new variables */ 0, 1 186 _, a, b := 0, 1, 2 187 _, _, _ := /* ERROR no new variables */ 0, 1, 2 188 189 _ = a 190 _ = b 191} 192 193// Test case for variables depending on function literals (see also #22992). 194var A /* ERROR initialization cycle */ = func() int { return A }() 195 196func _() { 197 // The function literal below must not see a. 198 var a = func() int { return a /* ERROR "undeclared name" */ }() 199 var _ = func() int { return a }() 200 201 // The function literal below must not see x, y, or z. 202 var x, y, z = 0, 1, func() int { return x /* ERROR "undeclared name" */ + y /* ERROR "undeclared name" */ + z /* ERROR "undeclared name" */ }() 203 _, _, _ = x, y, z 204} 205 206// TODO(gri) consolidate other var decl checks in this file