cloudfoundry-community/bosh-cloudstack-cpi

View on GitHub
go_agent/src/code.google.com/p/go.tools/go/types/testdata/gotos.src

Summary

Maintainability
Test Coverage
// Copyright 2011 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.

// This file is a modified copy of $GOROOT/test/goto.go.

package gotos

var (
    i, n int
    x    []int
    c    chan int
    m    map[int]int
    s    string
)

// goto after declaration okay
func _() {
    x := 1
    goto L
L:
    _ = x
}

// goto before declaration okay
func _() {
    goto L
L:
    x := 1
    _ = x
}

// goto across declaration not okay
func _() {
    goto L /* ERROR "goto L jumps over variable declaration at line 36" */
    x := 1
    _ = x
L:
}

// goto across declaration in inner scope okay
func _() {
    goto L
    {
        x := 1
        _ = x
    }
L:
}

// goto across declaration after inner scope not okay
func _() {
    goto L /* ERROR "goto L jumps over variable declaration at line 58" */
    {
        x := 1
        _ = x
    }
    x := 1
    _ = x
L:
}

// goto across declaration in reverse okay
func _() {
L:
    x := 1
    _ = x
    goto L
}

func _() {
L: L1:
    x := 1
    _ = x
    goto L
    goto L1
}

// error shows first offending variable
func _() {
    goto L /* ERROR "goto L jumps over variable declaration at line 84" */
    x := 1
    _ = x
    y := 1
    _ = y
L:
}

// goto not okay even if code path is dead
func _() {
    goto L /* ERROR "goto L jumps over variable declaration" */
    x := 1
    _ = x
    y := 1
    _ = y
    return
L:
}

// goto into outer block okay
func _() {
    {
        goto L
    }
L:
}

func _() {
    {
        goto L
        goto L1
    }
L: L1:
}

// goto backward into outer block okay
func _() {
L:
    {
        goto L
    }
}

func _() {
L: L1:
    {
        goto L
        goto L1
    }
}

// goto into inner block not okay
func _() {
    goto L /* ERROR "goto L jumps into block" */
    {
    L:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    goto L1 /* ERROR "goto L1 jumps into block" */
    {
    L: L1:
    }
}

// goto backward into inner block still not okay
func _() {
    {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    {
    L: L1:
    }
    goto L /* ERROR "goto L jumps into block" */
    goto L1 /* ERROR "goto L1 jumps into block" */
}

// error shows first (outermost) offending block
func _() {
    goto L /* ERROR "goto L jumps into block" */
    {
        {
            {
            L:
            }
        }
    }
}

// error prefers block diagnostic over declaration diagnostic
func _() {
    goto L /* ERROR "goto L jumps into block" */
    x := 1
    _ = x
    {
    L:
    }
}

// many kinds of blocks, all invalid to jump into or among,
// but valid to jump out of

// if

func _() {
L:
    if true {
        goto L
    }
}

func _() {
L:
    if true {
        goto L
    } else {
    }
}

func _() {
L:
    if false {
    } else {
        goto L
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    if true {
    L:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    if true {
    L:
    } else {
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    if true {
    } else {
    L:
    }
}

func _() {
    if false {
    L:
    } else {
        goto L /* ERROR "goto L jumps into block" */
    }
}

func _() {
    if true {
        goto L /* ERROR "goto L jumps into block" */
    } else {
    L:
    }
}

func _() {
    if true {
        goto L /* ERROR "goto L jumps into block" */
    } else if false {
    L:
    }
}

func _() {
    if true {
        goto L /* ERROR "goto L jumps into block" */
    } else if false {
    L:
    } else {
    }
}

func _() {
    if true {
        goto L /* ERROR "goto L jumps into block" */
    } else if false {
    } else {
    L:
    }
}

func _() {
    if true {
        goto L /* ERROR "goto L jumps into block" */
    } else {
        L:
    }
}

func _() {
    if true {
        L:
    } else {
        goto L /* ERROR "goto L jumps into block" */
    }
}

// for

func _() {
    for {
        goto L
    }
L:
}

func _() {
    for {
        goto L
    L:
    }
}

func _() {
    for {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    for {
        goto L
    L1:
    }
L:
    goto L1 /* ERROR "goto L1 jumps into block" */
}

func _() {
    for i < n {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    for i = 0; i < n; i++ {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    for i = range x {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    for i = range c {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    for i = range m {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

func _() {
    for i = range s {
    L:
    }
    goto L /* ERROR "goto L jumps into block" */
}

// switch

func _() {
L:
    switch i {
    case 0:
        goto L
    }
}

func _() {
L:
    switch i {
    case 0:

    default:
        goto L
    }
}

func _() {
    switch i {
    case 0:

    default:
    L:
        goto L
    }
}

func _() {
    switch i {
    case 0:

    default:
        goto L
    L:
    }
}

func _() {
    switch i {
    case 0:
        goto L
    L:
        ;
    default:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    switch i {
    case 0:
    L:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    switch i {
    case 0:
    L:
        ;
    default:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    switch i {
    case 0:
    default:
    L:
    }
}

func _() {
    switch i {
    default:
        goto L /* ERROR "goto L jumps into block" */
    case 0:
    L:
    }
}

func _() {
    switch i {
    case 0:
    L:
        ;
    default:
        goto L /* ERROR "goto L jumps into block" */
    }
}

// select
// different from switch.  the statement has no implicit block around it.

func _() {
L:
    select {
    case <-c:
        goto L
    }
}

func _() {
L:
    select {
    case c <- 1:

    default:
        goto L
    }
}

func _() {
    select {
    case <-c:

    default:
    L:
        goto L
    }
}

func _() {
    select {
    case c <- 1:

    default:
        goto L
    L:
    }
}

func _() {
    select {
    case <-c:
        goto L
    L:
        ;
    default:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    select {
    case c <- 1:
    L:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    select {
    case c <- 1:
    L:
        ;
    default:
    }
}

func _() {
    goto L /* ERROR "goto L jumps into block" */
    select {
    case <-c:
    default:
    L:
    }
}

func _() {
    select {
    default:
        goto L /* ERROR "goto L jumps into block" */
    case <-c:
    L:
    }
}

func _() {
    select {
    case <-c:
    L:
        ;
    default:
        goto L /* ERROR "goto L jumps into block" */
    }
}