mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00:00
![Josh Bleecher Snyder](/assets/img/avatar_default.png)
This is simpler than the sorting technique. It also allows us to simplify or eliminate some of the sorting decisions. Most important, sorting will not work when case clauses represent ranges of integers: There is no correct sort order that allows overlap detection by comparing neighbors. Using a map allows of a cheap, simple approach to ranges, namely to insert every int in the map. The equivalent approach for sorting means juggling temporary Nodes for every int, which is a lot more expensive. Change-Id: I84df3cb805992a1b04d14e0e4b2334f943e0ce05 Reviewed-on: https://go-review.googlesource.com/26766 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
93 lines
1.8 KiB
Go
93 lines
1.8 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 {
|
|
i int "tag1"
|
|
}: // ERROR "duplicate case struct { i int .tag1. } in type switch"
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|