| // errorcheck | |
| // Copyright 2013 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. | |
| // Test compiler diagnosis of function missing return statements. | |
| // See issue 65 and golang.org/s/go11return. | |
| package p | |
| type T int | |
| var x interface{} | |
| var c chan int | |
| func external() int // ok | |
| func _() int { | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| } // ERROR "missing return" | |
| // return is okay | |
| func _() int { | |
| print(1) | |
| return 2 | |
| } | |
| // goto is okay | |
| func _() int { | |
| L: | |
| print(1) | |
| goto L | |
| } | |
| // panic is okay | |
| func _() int { | |
| print(1) | |
| panic(2) | |
| } | |
| // but only builtin panic | |
| func _() int { | |
| var panic = func(int) {} | |
| print(1) | |
| panic(2) | |
| } // ERROR "missing return" | |
| // block ending in terminating statement is okay | |
| func _() int { | |
| { | |
| print(1) | |
| return 2 | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| func _() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| func _() int { | |
| print(1) | |
| { | |
| panic(2) | |
| } | |
| } | |
| // adding more code - even though it is dead - now requires a return | |
| func _() int { | |
| print(1) | |
| return 2 | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| print(1) | |
| goto L | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| panic(2) | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| print(1) | |
| return 2 | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| { | |
| panic(2) | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| print(1) | |
| return 2 | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| { | |
| panic(2) | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| // even an empty dead block triggers the message, because it | |
| // becomes the final statement. | |
| func _() int { | |
| print(1) | |
| return 2 | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| print(1) | |
| goto L | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| panic(2) | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| print(1) | |
| return 2 | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| { | |
| panic(2) | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| print(1) | |
| return 2 | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| { | |
| panic(2) | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| // if-else chain with final else and all terminating is okay | |
| func _() int { | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| panic(3) | |
| } | |
| } | |
| func _() int { | |
| L: | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| goto L | |
| } | |
| } | |
| 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 | |
| } | |
| } | |
| // 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) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } else if x == 1 { | |
| return 0 | |
| } else if x != 1 { | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // for { loops that never break are okay. | |
| func _() int { | |
| print(1) | |
| for {} | |
| } | |
| func _() int { | |
| for { | |
| for { | |
| break | |
| } | |
| } | |
| } | |
| func _() int { | |
| for { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } | |
| // for { loops that break are not okay. | |
| func _() int { | |
| print(1) | |
| for { break } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for { | |
| for { | |
| } | |
| break | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| for { | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // if there's a condition - even "true" - the loops are no longer syntactically terminating | |
| func _() int { | |
| print(1) | |
| for x == nil {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| for x == nil { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for x == nil { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| for true {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| for true { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for true { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // select in which all cases terminate and none break are okay. | |
| func _() int { | |
| print(1) | |
| select{} | |
| } | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| } | |
| } | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| for{} | |
| } | |
| } | |
| func _() int { | |
| L: | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| goto L | |
| } | |
| } | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| select{} | |
| } | |
| } | |
| // if any cases don't terminate, the select isn't okay anymore | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| goto L | |
| case c <- 1: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the select, the select isn't okay anymore, even if they're dead | |
| func _() int { | |
| print(1) | |
| select{ default: break } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| break | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| for{ break L } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| break L | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(1) | |
| panic("abc") | |
| default: | |
| select{} | |
| break | |
| } | |
| } // ERROR "missing return" | |
| // switch with default in which all cases terminate is okay | |
| func _() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| func _() int { | |
| print(1) | |
| switch x { | |
| default: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| func _() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| default: | |
| return 4 | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| func _() int { | |
| print(1) | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x { | |
| case 2: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| func _() int { | |
| print(1) | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x { | |
| default: | |
| return 4 | |
| break | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| // type switch with default in which all cases terminate is okay | |
| func _() int { | |
| print(1) | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| func _() int { | |
| print(1) | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| func _() int { | |
| print(1) | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| case float64: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x.(type) { | |
| case float64: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| func _() int { | |
| print(1) | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| break | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| print(1) | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| // again, but without the leading print(1). | |
| // testing that everything works when the terminating statement is first. | |
| func _() int { | |
| } // ERROR "missing return" | |
| // return is okay | |
| func _() int { | |
| return 2 | |
| } | |
| // goto is okay | |
| func _() int { | |
| L: | |
| goto L | |
| } | |
| // panic is okay | |
| func _() int { | |
| panic(2) | |
| } | |
| // but only builtin panic | |
| func _() int { | |
| var panic = func(int) {} | |
| panic(2) | |
| } // ERROR "missing return" | |
| // block ending in terminating statement is okay | |
| func _() int { | |
| { | |
| return 2 | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| func _() int { | |
| L: | |
| { | |
| goto L | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| func _() int { | |
| { | |
| panic(2) | |
| } | |
| } | |
| // adding more code - even though it is dead - now requires a return | |
| func _() int { | |
| return 2 | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| goto L | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| panic(2) | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| return 2 | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| goto L | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| panic(2) | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| return 2 | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| goto L | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| panic(2) | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| // even an empty dead block triggers the message, because it | |
| // becomes the final statement. | |
| func _() int { | |
| return 2 | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| goto L | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| panic(2) | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| return 2 | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| goto L | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| panic(2) | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| return 2 | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| { | |
| goto L | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| { | |
| panic(2) | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| // if-else chain with final else and all terminating is okay | |
| func _() int { | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| panic(3) | |
| } | |
| } | |
| func _() int { | |
| L: | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| goto L | |
| } | |
| } | |
| func _() int { | |
| L: | |
| if x == nil { | |
| panic(2) | |
| } else if x == 1 { | |
| return 0 | |
| } else if x != 2 { | |
| panic(3) | |
| } else { | |
| goto L | |
| } | |
| } | |
| // if-else chain missing final else is not okay, even if the | |
| // conditions cover every possible case. | |
| func _() int { | |
| if x == nil { | |
| panic(2) | |
| } else if x != nil { | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| if x == nil { | |
| panic(2) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| if x == nil { | |
| panic(2) | |
| } else if x == 1 { | |
| return 0 | |
| } else if x != 1 { | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // for { loops that never break are okay. | |
| func _() int { | |
| for {} | |
| } | |
| func _() int { | |
| for { | |
| for { | |
| break | |
| } | |
| } | |
| } | |
| func _() int { | |
| for { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } | |
| // for { loops that break are not okay. | |
| func _() int { | |
| for { break } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for { | |
| for { | |
| } | |
| break | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| for { | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // if there's a condition - even "true" - the loops are no longer syntactically terminating | |
| func _() int { | |
| for x == nil {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| for x == nil { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for x == nil { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for true {} | |
| } // ERROR "missing return" | |
| func _() int { | |
| for true { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| for true { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // select in which all cases terminate and none break are okay. | |
| func _() int { | |
| select{} | |
| } | |
| func _() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| } | |
| } | |
| func _() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| for{} | |
| } | |
| } | |
| func _() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| goto L | |
| } | |
| } | |
| func _() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| select{} | |
| } | |
| } | |
| // if any cases don't terminate, the select isn't okay anymore | |
| func _() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| goto L | |
| case c <- 1: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the select, the select isn't okay anymore, even if they're dead | |
| func _() int { | |
| select{ default: break } | |
| } // ERROR "missing return" | |
| func _() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| break | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| for{ break L } | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| break L | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| select { | |
| case <-c: | |
| panic("abc") | |
| default: | |
| select{} | |
| break | |
| } | |
| } // ERROR "missing return" | |
| // switch with default in which all cases terminate is okay | |
| func _() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| func _() int { | |
| switch x { | |
| default: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| func _() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| default: | |
| return 4 | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| func _() int { | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x { | |
| case 2: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| func _() int { | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x { | |
| default: | |
| return 4 | |
| break | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| // type switch with default in which all cases terminate is okay | |
| func _() int { | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| func _() int { | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| func _() int { | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| case float64: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x.(type) { | |
| case float64: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| func _() int { | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| break | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| func _() int { | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| case int, float64: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| // again, with func literals | |
| var _ = func() int { | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| } // ERROR "missing return" | |
| // return is okay | |
| var _ = func() int { | |
| print(1) | |
| return 2 | |
| } | |
| // goto is okay | |
| var _ = func() int { | |
| L: | |
| print(1) | |
| goto L | |
| } | |
| // panic is okay | |
| var _ = func() int { | |
| print(1) | |
| panic(2) | |
| } | |
| // but only builtin panic | |
| var _ = func() int { | |
| var panic = func(int) {} | |
| print(1) | |
| panic(2) | |
| } // ERROR "missing return" | |
| // block ending in terminating statement is okay | |
| var _ = func() int { | |
| { | |
| print(1) | |
| return 2 | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| var _ = func() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| var _ = func() int { | |
| print(1) | |
| { | |
| panic(2) | |
| } | |
| } | |
| // adding more code - even though it is dead - now requires a return | |
| var _ = func() int { | |
| print(1) | |
| return 2 | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| print(1) | |
| goto L | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| panic(2) | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| print(1) | |
| return 2 | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| { | |
| panic(2) | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| print(1) | |
| return 2 | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| { | |
| panic(2) | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| // even an empty dead block triggers the message, because it | |
| // becomes the final statement. | |
| var _ = func() int { | |
| print(1) | |
| return 2 | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| print(1) | |
| goto L | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| panic(2) | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| print(1) | |
| return 2 | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| { | |
| panic(2) | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| print(1) | |
| return 2 | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| print(1) | |
| goto L | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| { | |
| panic(2) | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| // if-else chain with final else and all terminating is okay | |
| var _ = func() int { | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| panic(3) | |
| } | |
| } | |
| var _ = func() int { | |
| L: | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| goto L | |
| } | |
| } | |
| 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 | |
| } | |
| } | |
| // 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) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| if x == nil { | |
| panic(2) | |
| } else if x == 1 { | |
| return 0 | |
| } else if x != 1 { | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // for { loops that never break are okay. | |
| var _ = func() int { | |
| print(1) | |
| for {} | |
| } | |
| var _ = func() int { | |
| for { | |
| for { | |
| break | |
| } | |
| } | |
| } | |
| var _ = func() int { | |
| for { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } | |
| // for { loops that break are not okay. | |
| var _ = func() int { | |
| print(1) | |
| for { break } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for { | |
| for { | |
| } | |
| break | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| for { | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // if there's a condition - even "true" - the loops are no longer syntactically terminating | |
| var _ = func() int { | |
| print(1) | |
| for x == nil {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for x == nil { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for x == nil { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| for true {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for true { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for true { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // select in which all cases terminate and none break are okay. | |
| var _ = func() int { | |
| print(1) | |
| select{} | |
| } | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| } | |
| } | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| for{} | |
| } | |
| } | |
| var _ = func() int { | |
| L: | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| goto L | |
| } | |
| } | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| select{} | |
| } | |
| } | |
| // if any cases don't terminate, the select isn't okay anymore | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| goto L | |
| case c <- 1: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the select, the select isn't okay anymore, even if they're dead | |
| var _ = func() int { | |
| print(1) | |
| select{ default: break } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| break | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| for{ break L } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| break L | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| select { | |
| case <-c: | |
| print(1) | |
| panic("abc") | |
| default: | |
| select{} | |
| break | |
| } | |
| } // ERROR "missing return" | |
| // switch with default in which all cases terminate is okay | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| default: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| default: | |
| return 4 | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| var _ = func() int { | |
| print(1) | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| case 2: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| var _ = func() int { | |
| print(1) | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x { | |
| default: | |
| return 4 | |
| break | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| // type switch with default in which all cases terminate is okay | |
| var _ = func() int { | |
| print(1) | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| var _ = func() int { | |
| print(1) | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| var _ = func() int { | |
| print(1) | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| case float64: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x.(type) { | |
| case float64: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| var _ = func() int { | |
| print(1) | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| break | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| print(1) | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| // again, but without the leading print(1). | |
| // testing that everything works when the terminating statement is first. | |
| var _ = func() int { | |
| } // ERROR "missing return" | |
| // return is okay | |
| var _ = func() int { | |
| return 2 | |
| } | |
| // goto is okay | |
| var _ = func() int { | |
| L: | |
| goto L | |
| } | |
| // panic is okay | |
| var _ = func() int { | |
| panic(2) | |
| } | |
| // but only builtin panic | |
| var _ = func() int { | |
| var panic = func(int) {} | |
| panic(2) | |
| } // ERROR "missing return" | |
| // block ending in terminating statement is okay | |
| var _ = func() int { | |
| { | |
| return 2 | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| var _ = func() int { | |
| L: | |
| { | |
| goto L | |
| } | |
| } | |
| // block ending in terminating statement is okay | |
| var _ = func() int { | |
| { | |
| panic(2) | |
| } | |
| } | |
| // adding more code - even though it is dead - now requires a return | |
| var _ = func() int { | |
| return 2 | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| goto L | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| panic(2) | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| return 2 | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| goto L | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| panic(2) | |
| print(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| return 2 | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| goto L | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| panic(2) | |
| } | |
| print(3) | |
| } // ERROR "missing return" | |
| // even an empty dead block triggers the message, because it | |
| // becomes the final statement. | |
| var _ = func() int { | |
| return 2 | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| goto L | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| panic(2) | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| return 2 | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| goto L | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| panic(2) | |
| {} | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| return 2 | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| { | |
| goto L | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| { | |
| panic(2) | |
| } | |
| {} | |
| } // ERROR "missing return" | |
| // if-else chain with final else and all terminating is okay | |
| var _ = func() int { | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| panic(3) | |
| } | |
| } | |
| var _ = func() int { | |
| L: | |
| if x == nil { | |
| panic(2) | |
| } else { | |
| goto L | |
| } | |
| } | |
| var _ = func() int { | |
| L: | |
| if x == nil { | |
| panic(2) | |
| } else if x == 1 { | |
| return 0 | |
| } else if x != 2 { | |
| panic(3) | |
| } else { | |
| goto L | |
| } | |
| } | |
| // if-else chain missing final else is not okay, even if the | |
| // conditions cover every possible case. | |
| var _ = func() int { | |
| if x == nil { | |
| panic(2) | |
| } else if x != nil { | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| if x == nil { | |
| panic(2) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| if x == nil { | |
| panic(2) | |
| } else if x == 1 { | |
| return 0 | |
| } else if x != 1 { | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // for { loops that never break are okay. | |
| var _ = func() int { | |
| for {} | |
| } | |
| var _ = func() int { | |
| for { | |
| for { | |
| break | |
| } | |
| } | |
| } | |
| var _ = func() int { | |
| for { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } | |
| // for { loops that break are not okay. | |
| var _ = func() int { | |
| for { break } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for { | |
| for { | |
| } | |
| break | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| for { | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // if there's a condition - even "true" - the loops are no longer syntactically terminating | |
| var _ = func() int { | |
| for x == nil {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for x == nil { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for x == nil { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for true {} | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for true { | |
| for { | |
| break | |
| } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| for true { | |
| L: | |
| for { | |
| break L | |
| } | |
| } | |
| } // ERROR "missing return" | |
| // select in which all cases terminate and none break are okay. | |
| var _ = func() int { | |
| select{} | |
| } | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| } | |
| } | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| for{} | |
| } | |
| } | |
| var _ = func() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| goto L | |
| } | |
| } | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| select{} | |
| } | |
| } | |
| // if any cases don't terminate, the select isn't okay anymore | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| goto L | |
| case c <- 1: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| default: | |
| print(2) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the select, the select isn't okay anymore, even if they're dead | |
| var _ = func() int { | |
| select{ default: break } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| break | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| for{ break L } | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| select { | |
| case <-c: | |
| print(2) | |
| panic("abc") | |
| case c <- 1: | |
| print(2) | |
| break L | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| select { | |
| case <-c: | |
| panic("abc") | |
| default: | |
| select{} | |
| break | |
| } | |
| } // ERROR "missing return" | |
| // switch with default in which all cases terminate is okay | |
| var _ = func() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| var _ = func() int { | |
| switch x { | |
| default: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| var _ = func() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| default: | |
| return 4 | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| var _ = func() int { | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x { | |
| case 2: | |
| return 4 | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| fallthrough | |
| case 2: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| var _ = func() int { | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x { | |
| default: | |
| return 4 | |
| break | |
| case 1: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| switch x { | |
| case 1: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| // type switch with default in which all cases terminate is okay | |
| var _ = func() int { | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| default: | |
| return 4 | |
| } | |
| } | |
| var _ = func() int { | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| // if no default or some case doesn't terminate, switch is no longer okay | |
| var _ = func() int { | |
| switch { | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| case float64: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x.(type) { | |
| case float64: | |
| return 4 | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| // if any breaks refer to the switch, switch is no longer okay | |
| var _ = func() int { | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| panic(3) | |
| break L | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| break | |
| case int: | |
| print(2) | |
| panic(3) | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| L: | |
| switch x.(type) { | |
| case int: | |
| print(2) | |
| for { | |
| break L | |
| } | |
| default: | |
| return 4 | |
| } | |
| } // ERROR "missing return" | |
| var _ = func() int { | |
| switch x.(type) { | |
| default: | |
| return 4 | |
| case int, float64: | |
| print(2) | |
| panic(3) | |
| } | |
| } | |
| /**/ |