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