Commit 082f4648 authored by Robert Griesemer's avatar Robert Griesemer

go/types: trailing semis are ok after valid fallthrough

Fixes #15376.

Change-Id: I9ece80f26b83be129671c961120c157da2ac0079
Reviewed-on: https://go-review.googlesource.com/22270Reviewed-by: 's avatarAlan Donovan <adonovan@google.com>
parent a4dd6ea1
...@@ -83,9 +83,19 @@ func (check *Checker) simpleStmt(s ast.Stmt) { ...@@ -83,9 +83,19 @@ func (check *Checker) simpleStmt(s ast.Stmt) {
} }
} }
func trimTrailingEmptyStmts(list []ast.Stmt) []ast.Stmt {
for i := len(list); i > 0; i-- {
if _, ok := list[i-1].(*ast.EmptyStmt); !ok {
return list[:i]
}
}
return nil
}
func (check *Checker) stmtList(ctxt stmtContext, list []ast.Stmt) { func (check *Checker) stmtList(ctxt stmtContext, list []ast.Stmt) {
ok := ctxt&fallthroughOk != 0 ok := ctxt&fallthroughOk != 0
inner := ctxt &^ fallthroughOk inner := ctxt &^ fallthroughOk
list = trimTrailingEmptyStmts(list) // trailing empty statements are "invisible" to fallthrough analysis
for i, s := range list { for i, s := range list {
inner := inner inner := inner
if ok && i+1 == len(list) { if ok && i+1 == len(list) {
......
...@@ -531,16 +531,18 @@ func switches1() { ...@@ -531,16 +531,18 @@ func switches1() {
case 1: case 1:
fallthrough fallthrough
case 2: case 2:
default: fallthrough; ; ; // trailing empty statements are ok
fallthrough
case 3: case 3:
default:
fallthrough; ;
case 4:
fallthrough /* ERROR "fallthrough statement out of place" */ fallthrough /* ERROR "fallthrough statement out of place" */
} }
var y interface{} var y interface{}
switch y.(type) { switch y.(type) {
case int: case int:
fallthrough /* ERROR "fallthrough statement out of place" */ fallthrough /* ERROR "fallthrough statement out of place" */ ; ; ;
default: default:
} }
...@@ -554,7 +556,7 @@ func switches1() { ...@@ -554,7 +556,7 @@ func switches1() {
switch x { switch x {
case 0: case 0:
goto L1 goto L1
L1: fallthrough L1: fallthrough; ;
case 1: case 1:
goto L2 goto L2
goto L3 goto L3
...@@ -576,9 +578,16 @@ func switches1() { ...@@ -576,9 +578,16 @@ func switches1() {
switch x { switch x {
case 0: case 0:
fallthrough; ;
case 1:
{ {
fallthrough /* ERROR "fallthrough statement out of place" */ fallthrough /* ERROR "fallthrough statement out of place" */
} }
case 2:
fallthrough
case 3:
fallthrough /* ERROR "fallthrough statement out of place" */
{ /* empty block is not an empty statement */ }; ;
default: default:
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment