1// errorcheck
2
3// Copyright 2016 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// Literals that happen to resolve to named constants
8// may be used as label names (see issue 13684). Make
9// sure that other literals don't crash the compiler.
10
11package main
12
13const labelname = 1
14
15func main() {
16	goto labelname
17labelname:
18}
19
20func f() {
21	var x int
22	switch x {
23	case 1:
24		2:	// ERROR "unexpected :|expected .*;.* or .*}.* or newline|value computed is not used"
25	case 2:
26	}
27
28	switch x {
29	case 1:
30		2: ;	// ERROR "unexpected :|expected .*;.* or .*}.* or newline|value computed is not used"
31	case 2:
32	}
33
34	var y string
35	switch y {
36	case "foo":
37		"bar":	// ERROR "unexpected :|expected .*;.* or .*}.* or newline|value computed is not used"
38	case "bar":
39	}
40
41	switch y {
42	case "foo":
43		"bar": ;	// ERROR "unexpected :|expected .*;.* or .*}.* or newline|value computed is not used"
44	case "bar":
45	}
46
47	var z bool
48	switch {
49	case z:
50		labelname:	// ERROR "missing statement after label"
51	case false:
52	}
53}
54
55func g() {
56	var z bool
57	switch {
58	case z:
59		labelname:	// ERROR "label labelname defined and not used|previous definition|defined and not used"
60	}
61
62	switch {
63	case z:
64		labelname: ;	// ERROR "label labelname already defined at LINE-5|label .*labelname.* already defined"
65	case false:
66	}
67}
68