mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
![Alberto Donizetti](/assets/img/avatar_default.png)
When processing a fallthrough, the casebody function in swt.go checks that the last statement has indeed Op == OXFALL (not-processed fallthrough) before setting it to OFALL (processed fallthrough). Unfortunately, sometimes the fallthrough statement won't be in the last node. For example, in case 0: return func() int {return 1}() fallthrough the compiler generates autotmp_0 = (func literal)(); return autotmp_0; fallthrough; <node VARKILL> with an OVARKILL node in the last position. casebody will find that last.Op != OXFALL, won't mark the fallthrough as processed, and the fallthrough line will cause a "fallthrough statement out of place" error. To fix this, we change casebody so that it searches for the fallthrough statement backwards in the statements list, without assuming that it'll be in the last position. Fixes #13262 Change-Id: I366c6caa7fd7442d365bd7a08cc66a552212d9b2 Reviewed-on: https://go-review.googlesource.com/22921 Run-TryBot: Quentin Smith <quentin@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Quentin Smith <quentin@golang.org>
22 lines
386 B
Go
22 lines
386 B
Go
// compile
|
|
|
|
// 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.
|
|
|
|
// Issue 13262: cmd/compile: bogus "fallthrough
|
|
// statement out of place" error
|
|
|
|
package p
|
|
|
|
func f() int {
|
|
var a int
|
|
switch a {
|
|
case 0:
|
|
return func() int { return 1 }()
|
|
fallthrough
|
|
default:
|
|
}
|
|
return 0
|
|
}
|