mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
![Robert Griesemer](/assets/img/avatar_default.png)
The gcCompat mode was introduced to match the new parser's node position setup exactly with the positions used by the original parser. Some of the gcCompat adjustments were required to satisfy syntax error test cases, and the rest were required to make toolstash cmp pass. This change removes the former gcCompat adjustments and instead adjusts the respective test cases as necessary. In some cases this makes the error lines consistent with the ones reported by gccgo. Where it has changed, the position associated with a given syntactic construct is the position (line/col number) of the left-most token belonging to the construct. Change-Id: I5b60c00c5999a895c4d6d6e9b383c6405ccf725c Reviewed-on: https://go-review.googlesource.com/36695 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
102 lines
2 KiB
Go
102 lines
2 KiB
Go
// errorcheck
|
|
|
|
// Copyright 2016 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Verify that switch statements with duplicate cases are detected by the compiler.
|
|
// Does not compile.
|
|
|
|
package main
|
|
|
|
import "fmt"
|
|
|
|
func f0(x int) {
|
|
switch x {
|
|
case 0:
|
|
case 0: // ERROR "duplicate case 0 in switch"
|
|
}
|
|
|
|
switch x {
|
|
case 0:
|
|
case int(0): // ERROR "duplicate case 0 in switch"
|
|
}
|
|
}
|
|
|
|
func f1(x float32) {
|
|
switch x {
|
|
case 5:
|
|
case 5: // ERROR "duplicate case 5 in switch"
|
|
case 5.0: // ERROR "duplicate case 5 in switch"
|
|
}
|
|
}
|
|
|
|
func f2(s string) {
|
|
switch s {
|
|
case "":
|
|
case "": // ERROR "duplicate case .. in switch"
|
|
case "abc":
|
|
case "abc": // ERROR "duplicate case .abc. in switch"
|
|
}
|
|
}
|
|
|
|
func f3(e interface{}) {
|
|
switch e {
|
|
case 0:
|
|
case 0: // ERROR "duplicate case 0 in switch"
|
|
case int64(0):
|
|
case float32(10):
|
|
case float32(10): // ERROR "duplicate case float32\(10\) in switch"
|
|
case float64(10):
|
|
case float64(10): // ERROR "duplicate case float64\(10\) in switch"
|
|
}
|
|
}
|
|
|
|
func f4(e interface{}) {
|
|
switch e.(type) {
|
|
case int:
|
|
case int: // ERROR "duplicate case int in type switch"
|
|
case int64:
|
|
case error:
|
|
case error: // ERROR "duplicate case error in type switch"
|
|
case fmt.Stringer:
|
|
case fmt.Stringer: // ERROR "duplicate case fmt.Stringer in type switch"
|
|
case struct {
|
|
i int "tag1"
|
|
}:
|
|
case struct {
|
|
i int "tag2"
|
|
}:
|
|
case struct { // ERROR "duplicate case struct { i int .tag1. } in type switch"
|
|
i int "tag1"
|
|
}:
|
|
}
|
|
}
|
|
|
|
func f5(a [1]int) {
|
|
switch a {
|
|
case [1]int{0}:
|
|
case [1]int{0}: // OK -- see issue 15896
|
|
}
|
|
}
|
|
|
|
// Ensure duplicate const bool clauses are accepted.
|
|
func f6() int {
|
|
switch {
|
|
case 0 == 0:
|
|
return 0
|
|
case 1 == 1: // Intentionally OK, even though a duplicate of the above const true
|
|
return 1
|
|
}
|
|
return 2
|
|
}
|
|
|
|
// Ensure duplicates in ranges are detected (issue #17517).
|
|
func f7(a int) {
|
|
switch a {
|
|
case 0:
|
|
case 0, 1: // ERROR "duplicate case 0"
|
|
case 1, 2, 3, 4: // ERROR "duplicate case 1"
|
|
}
|
|
}
|