| // Copyright 2020 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. |
| |
| package unreachable |
| |
| // This file produces masses of errors from the type checker due to |
| // missing returns statements and other things. |
| |
| type T int |
| |
| var x interface{} |
| var c chan int |
| |
| func external() int // ok |
| |
| func _() int { |
| } |
| |
| func _() int { |
| print(1) |
| } |
| |
| func _() int { |
| print(1) |
| return 2 |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| goto L |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| panic(2) |
| // want "unreachable code" |
| } |
| |
| // but only builtin panic |
| func _() int { |
| var panic = func(int) {} |
| print(1) |
| panic(2) |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| print(1) |
| return 2 |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| print(1) |
| return 2 |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| { |
| print(1) |
| goto L |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| { |
| print(1) |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| { |
| panic(2) |
| } |
| } |
| |
| func _() int { |
| print(1) |
| { |
| panic(2) |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| { |
| panic(2) |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| return 2 |
| |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| goto L |
| |
| } |
| |
| func _() int { |
| print(1) |
| panic(2) |
| |
| } |
| |
| func _() int { |
| { |
| print(1) |
| return 2 |
| |
| } |
| } |
| |
| func _() int { |
| L: |
| { |
| print(1) |
| goto L |
| |
| } |
| } |
| |
| func _() int { |
| print(1) |
| { |
| panic(2) |
| |
| } |
| } |
| |
| func _() int { |
| { |
| print(1) |
| return 2 |
| } |
| |
| } |
| |
| func _() int { |
| L: |
| { |
| print(1) |
| goto L |
| } |
| |
| } |
| |
| func _() int { |
| print(1) |
| { |
| panic(2) |
| } |
| |
| } |
| |
| func _() int { |
| print(1) |
| if x == nil { |
| panic(2) |
| } else { |
| panic(3) |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| if x == nil { |
| panic(2) |
| } else { |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| if x == nil { |
| panic(2) |
| } else if x == 1 { |
| return 0 |
| } else if x != 2 { |
| panic(3) |
| } else { |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| // if-else chain missing final else is not okay, even if the |
| // conditions cover every possible case. |
| |
| func _() int { |
| print(1) |
| if x == nil { |
| panic(2) |
| } else if x != nil { |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| if x == nil { |
| panic(2) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| if x == nil { |
| panic(2) |
| } else if x == 1 { |
| return 0 |
| } else if x != 1 { |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| for { |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| for { |
| for { |
| break |
| } |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| for { |
| for { |
| break |
| // want "unreachable code" |
| } |
| } |
| } |
| |
| func _() int { |
| for { |
| for { |
| continue |
| // want "unreachable code" |
| } |
| } |
| } |
| |
| func _() int { |
| for { |
| L: |
| for { |
| break L |
| } |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| for { |
| break |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| for { |
| for { |
| } |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| for { |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| for x == nil { |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| for x == nil { |
| for { |
| break |
| } |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| for x == nil { |
| L: |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| for true { |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| for true { |
| for { |
| break |
| } |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| for true { |
| L: |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| select {} |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| for { |
| } |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| for { |
| } |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| case c <- 1: |
| print(2) |
| goto L |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| case c <- 1: |
| print(2) |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| default: |
| select {} |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| default: |
| select {} |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| case c <- 1: |
| print(2) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| default: |
| print(2) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| default: |
| break |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| L: |
| select { |
| case <-c: |
| print(2) |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| L: |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| case c <- 1: |
| print(2) |
| break L |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| select { |
| case <-c: |
| print(1) |
| panic("abc") |
| default: |
| select {} |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| default: |
| return 4 |
| // want "unreachable code" |
| case 1: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| default: |
| return 4 |
| case 1: |
| print(2) |
| panic(3) |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| switch { |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| case 2: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 2: |
| return 4 |
| case 1: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| fallthrough |
| case 2: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| L: |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x { |
| default: |
| return 4 |
| // want "unreachable code" |
| case 1: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| L: |
| switch x { |
| case 1: |
| print(2) |
| for { |
| break L |
| } |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| default: |
| return 4 |
| // want "unreachable code" |
| case int: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| default: |
| return 4 |
| case int: |
| print(2) |
| panic(3) |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| print(1) |
| switch { |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| case float64: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case float64: |
| return 4 |
| case int: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| fallthrough |
| case float64: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| L: |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| switch x.(type) { |
| default: |
| return 4 |
| // want "unreachable code" |
| case int: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| print(1) |
| L: |
| switch x.(type) { |
| case int: |
| print(2) |
| for { |
| break L |
| } |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| // again, but without the leading print(1). |
| // testing that everything works when the terminating statement is first. |
| |
| func _() int { |
| println() // ok |
| } |
| |
| func _() int { |
| return 2 |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| goto L |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| panic(2) |
| // want "unreachable code" |
| } |
| |
| // but only builtin panic |
| func _() int { |
| var panic = func(int) {} |
| panic(2) |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| return 2 |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| { |
| return 2 |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| L: |
| { |
| goto L |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| L: |
| { |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| { |
| panic(2) |
| // want "unreachable code" |
| } |
| } |
| |
| func _() int { |
| { |
| panic(2) |
| } |
| // want "unreachable code" |
| } |
| |
| func _() int { |
| return 2 |
| |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| goto L |
| |
| println() // ok |
| } |
| |
| func _() int { |
| panic(2) |
| |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| return 2 |
| |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| { |
| goto L |
| |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| panic(2) |
| |
| } |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| return 2 |
| } |
| |
| println() // ok |
| } |
| |
| func _() int { |
| L: |
| { |
| goto L |
| } |
| |
| println() // ok |
| } |
| |
| func _() int { |
| { |
| panic(2) |
| } |
| |
| println() // ok |
| } |
| |
| // again, with func literals |
| |
| var _ = func() int { |
| } |
| |
| var _ = func() int { |
| print(1) |
| } |
| |
| var _ = func() int { |
| print(1) |
| return 2 |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| goto L |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| panic(2) |
| // want "unreachable code" |
| } |
| |
| // but only builtin panic |
| var _ = func() int { |
| var panic = func(int) {} |
| print(1) |
| panic(2) |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| print(1) |
| return 2 |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| print(1) |
| return 2 |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| print(1) |
| goto L |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| print(1) |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| { |
| panic(2) |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| { |
| panic(2) |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| { |
| panic(2) |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| return 2 |
| |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| goto L |
| |
| } |
| |
| var _ = func() int { |
| print(1) |
| panic(2) |
| |
| } |
| |
| var _ = func() int { |
| { |
| print(1) |
| return 2 |
| |
| } |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| print(1) |
| goto L |
| |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| { |
| panic(2) |
| |
| } |
| } |
| |
| var _ = func() int { |
| { |
| print(1) |
| return 2 |
| } |
| |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| print(1) |
| goto L |
| } |
| |
| } |
| |
| var _ = func() int { |
| print(1) |
| { |
| panic(2) |
| } |
| |
| } |
| |
| var _ = func() int { |
| print(1) |
| if x == nil { |
| panic(2) |
| } else { |
| panic(3) |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| if x == nil { |
| panic(2) |
| } else { |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| if x == nil { |
| panic(2) |
| } else if x == 1 { |
| return 0 |
| } else if x != 2 { |
| panic(3) |
| } else { |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| // if-else chain missing final else is not okay, even if the |
| // conditions cover every possible case. |
| |
| var _ = func() int { |
| print(1) |
| if x == nil { |
| panic(2) |
| } else if x != nil { |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| if x == nil { |
| panic(2) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| if x == nil { |
| panic(2) |
| } else if x == 1 { |
| return 0 |
| } else if x != 1 { |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| for { |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| for { |
| for { |
| break |
| } |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| for { |
| for { |
| break |
| // want "unreachable code" |
| } |
| } |
| } |
| |
| var _ = func() int { |
| for { |
| for { |
| continue |
| // want "unreachable code" |
| } |
| } |
| } |
| |
| var _ = func() int { |
| for { |
| L: |
| for { |
| break L |
| } |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| for { |
| break |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| for { |
| for { |
| } |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| for { |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| for x == nil { |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| for x == nil { |
| for { |
| break |
| } |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| for x == nil { |
| L: |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| for true { |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| for true { |
| for { |
| break |
| } |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| for true { |
| L: |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| select {} |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| for { |
| } |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| for { |
| } |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| case c <- 1: |
| print(2) |
| goto L |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| case c <- 1: |
| print(2) |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| default: |
| select {} |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| default: |
| select {} |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| case c <- 1: |
| print(2) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| default: |
| print(2) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| default: |
| break |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| L: |
| select { |
| case <-c: |
| print(2) |
| for { |
| break L |
| } |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| L: |
| select { |
| case <-c: |
| print(2) |
| panic("abc") |
| case c <- 1: |
| print(2) |
| break L |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| select { |
| case <-c: |
| print(1) |
| panic("abc") |
| default: |
| select {} |
| // want "unreachable code" |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| default: |
| return 4 |
| // want "unreachable code" |
| case 1: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| default: |
| return 4 |
| case 1: |
| print(2) |
| panic(3) |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch { |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| case 2: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 2: |
| return 4 |
| case 1: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| fallthrough |
| case 2: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| L: |
| switch x { |
| case 1: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x { |
| default: |
| return 4 |
| // want "unreachable code" |
| case 1: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| L: |
| switch x { |
| case 1: |
| print(2) |
| for { |
| break L |
| } |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| default: |
| return 4 |
| // want "unreachable code" |
| case int: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| default: |
| return 4 |
| case int: |
| print(2) |
| panic(3) |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| fallthrough |
| default: |
| return 4 |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch { |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| case float64: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case float64: |
| return 4 |
| case int: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| fallthrough |
| case float64: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| L: |
| switch x.(type) { |
| case int: |
| print(2) |
| panic(3) |
| // want "unreachable code" |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| switch x.(type) { |
| default: |
| return 4 |
| // want "unreachable code" |
| case int: |
| print(2) |
| panic(3) |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| print(1) |
| L: |
| switch x.(type) { |
| case int: |
| print(2) |
| for { |
| break L |
| } |
| default: |
| return 4 |
| } |
| println() // ok |
| } |
| |
| // again, but without the leading print(1). |
| // testing that everything works when the terminating statement is first. |
| |
| var _ = func() int { |
| println() // ok |
| } |
| |
| var _ = func() int { |
| return 2 |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| goto L |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| panic(2) |
| // want "unreachable code" |
| } |
| |
| // but only builtin panic |
| var _ = func() int { |
| var panic = func(int) {} |
| panic(2) |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| return 2 |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| { |
| return 2 |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| goto L |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| goto L |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| { |
| panic(2) |
| // want "unreachable code" |
| } |
| } |
| |
| var _ = func() int { |
| { |
| panic(2) |
| } |
| // want "unreachable code" |
| } |
| |
| var _ = func() int { |
| return 2 |
| |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| goto L |
| |
| println() // ok |
| } |
| |
| var _ = func() int { |
| panic(2) |
| |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| return 2 |
| |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| goto L |
| |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| panic(2) |
| |
| } |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| return 2 |
| } |
| |
| println() // ok |
| } |
| |
| var _ = func() int { |
| L: |
| { |
| goto L |
| } |
| |
| println() // ok |
| } |
| |
| var _ = func() int { |
| { |
| panic(2) |
| } |
| |
| println() // ok |
| } |
| |
| var _ = func() { |
| // goto without label used to panic |
| goto |
| } |
| |
| func _() int { |
| // Empty switch tag with non-bool case value used to panic. |
| switch { |
| case 1: |
| println() |
| } |
| println() |
| } |