blob: 39b51429bd1314c8c8f31fea62d3191537ae4aa8 [file]
This test checks definition operations in branch statements break, goto and continue.
We suppress staticheck since it also gives a diagnostic
about the break being ineffective.
-- settings.json --
{
"staticcheck": false
}
-- go.mod --
module mod.com
go 1.18
-- a/a.go --
package a
import "log"
func BreakLoop() {
for i := 0; i < 10; i++ {
if i > 6 {
break //@def("break", rbrace1)
}
} //@loc(rbrace1, `}`)
}
func BreakNestedLoop() {
for i := 0; i < 10; i++ {
for j := 0; j < 5; j++ {
if j > 1 {
break //@def("break", rbrace2)
}
} //@loc(rbrace2, `}`)
}
}
func BreakNestedLoopWithLabel() {
Outer:
for i := 0; i < 10; i++ {
for j := 0; j < 5; j++ {
if j > 1 {
break Outer//@def("break", outerparen)
}
}
} //@loc(outerparen, `}`)
}
func BreakSwitch(i int) {
switch i {
case 1:
break //@def("break", rbrace4)
case 2:
log.Printf("2")
case 3:
log.Printf("3")
} //@loc(rbrace4, `}`)
}
func BreakSwitchLabel(i int) {
loop:
for {
switch i {
case 1:
break loop //@def("break", loopparen)
case 2:
log.Printf("2")
case 3:
continue loop
}
} //@loc(loopparen, `}`)
}
func BreakSelect(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
break //@def("break", rbrace5)
case <-quit:
log.Println("quit")
return
} //@loc(rbrace5, `}`)
}
}
func BreakWithContinue() {
for j := 0; j < 5; j++ {
if (j < 4) {
continue
}
break //@def("break", rbrace6)
} //@loc(rbrace6, `}`)
}
func GotoNestedLoop() {
Outer: //@loc(outer, "Outer")
for i := 0; i < 10; i++ {
for j := 0; j < 5; j++ {
if (j > 1) {
goto Outer//@def("goto", outer)
}
}
}
}
func ContinueLoop() {
for j := 0; j < 5; j++ { //@loc(for3, `for`)
if (j < 4) {
continue //@def("continue", for3)
}
break
}
}
func ContinueDoubleLoop() {
for i := 0; i < 10; i++ { //@loc(for4, `for`)
for j := 0; j < 5; j++ {
if (j > 1) {
break
}
}
if (i > 7) {
continue//@def("continue", for4)
}
}
}
func BreakInBlockStmt() {
for {
if 0 < 10 {
{
break //@def("break", rbrace9)
}
}
} //@loc(rbrace9, `}`)
}
func BreakInLabeledStmt() {
outer:
for {
goto inner
inner:
break outer //@def("break", for5)
} //@loc(for5, `}`)
}
func BreakToLabel(n int) {
outer1:
switch n {
case 1:
print("1")
for i := 0; i < 10; i++ {
if i > 3 {
break outer1 //@def("break", outer1)
}
}
} //@loc(outer1, "}")
}
func ContinueToLabel(n int) {
outer1:
for { //@loc(outer2, "for")
switch n {
case 1:
print("1")
for i := 0; i < 10; i++ {
if i > 3 {
continue outer1 //@def("continue", outer2)
}
}
}
}
}