go goto 源码

  • 2022-07-15
  • 浏览 (767)

golang goto 代码

文件路径:/test/goto.go

// errorcheck

// 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.

// Verify goto semantics.
// Does not compile.
//
// Each test is in a separate function just so that if the
// compiler stops processing after one error, we don't
// lose other ones.

package main

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 declaration of x at LINE+1|goto jumps over declaration"
	x := 1 // GCCGO_ERROR "defined here"
	_ = 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 declaration of x at LINE+5|goto jumps over declaration"
	{
		x := 1
		_ = x
	}
	x := 1 // GCCGO_ERROR "defined here"
	_ = x
L:
}

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

// error shows first offending variable
func _() {
	goto L // ERROR "goto L jumps over declaration of y at LINE+3|goto jumps over declaration"
	x := 1 // GCCGO_ERROR "defined here"
	_ = x
	y := 1
	_ = y
L:
}

// goto not okay even if code path is dead
func _() {
	goto L // ERROR "goto L jumps over declaration of y at LINE+3|goto jumps over declaration"
	x := 1 // GCCGO_ERROR "defined here"
	_ = x
	y := 1
	_ = y
	return
L:
}

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

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

// goto into inner block not okay
func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	{      // GCCGO_ERROR "block starts here"
	L:
	}
}

// goto backward into inner block still not okay
func _() {
	{ // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

// error shows first (outermost) offending block
func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+3|goto jumps into block"
	{
		{
			{ // GCCGO_ERROR "block starts here"
			L:
			}
		}
	}
}

// error prefers block diagnostic over declaration diagnostic
func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+3|goto jumps into block"
	x := 1
	_ = x
	{ // GCCGO_ERROR "block starts here"
	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 starting at LINE+1|goto jumps into block"
	if true { // GCCGO_ERROR "block starts here"
	L:
	}
}

func _() {
	goto L    // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	if true { // GCCGO_ERROR "block starts here"
	L:
	} else {
	}
}

func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+2|goto jumps into block"
	if true {
	} else { // GCCGO_ERROR "block starts here"
	L:
	}
}

func _() {
	if false { // GCCGO_ERROR "block starts here"
	L:
	} else {
		goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
	}
}

func _() {
	if true {
		goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	} else { // GCCGO_ERROR "block starts here"
	L:
	}
}

func _() {
	if true {
		goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	} else if false { // GCCGO_ERROR "block starts here"
	L:
	}
}

func _() {
	if true {
		goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	} else if false { // GCCGO_ERROR "block starts here"
	L:
	} else {
	}
}

func _() {
	// This one is tricky.  There is an implicit scope
	// starting at the second if statement, and it contains
	// the final else, so the outermost offending scope
	// really is LINE+1 (like in the previous test),
	// even though it looks like it might be LINE+3 instead.
	if true {
		goto L // ERROR "goto L jumps into block starting at LINE+2|goto jumps into block"
	} else if false {
	} else { // GCCGO_ERROR "block starts here"
	L:
	}
}

/* Want to enable these tests but gofmt mangles them.  Issue 1972.

func _() {
	// This one is okay, because the else is in the
	// implicit whole-if block and has no inner block
	// (no { }) around it.
	if true {
		goto L
	} else
		L:
}

func _() {
	// Still not okay.
	if true {	//// GCCGO_ERROR "block starts here"
	L:
	} else
		goto L //// ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

*/

// for

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

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

func _() {
	for { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

func _() {
	for { // GCCGO_ERROR "block starts here"
		goto L
	L1:
	}
L:
	goto L1 // ERROR "goto L1 jumps into block starting at LINE-5|goto jumps into block"
}

func _() {
	for i < n { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

func _() {
	for i = 0; i < n; i++ { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

func _() {
	for i = range x { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

func _() {
	for i = range c { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

func _() {
	for i = range m { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto jumps into block"
}

func _() {
	for i = range s { // GCCGO_ERROR "block starts here"
	L:
	}
	goto L // ERROR "goto L jumps into block starting at LINE-3|goto 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 starting at LINE+2|goto jumps into block"
	switch i {
	case 0:
	L: // GCCGO_ERROR "block starts here"
	}
}

func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+2|goto jumps into block"
	switch i {
	case 0:
	L: // GCCGO_ERROR "block starts here"
		;
	default:
	}
}

func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+3|goto jumps into block"
	switch i {
	case 0:
	default:
	L: // GCCGO_ERROR "block starts here"
	}
}

func _() {
	switch i {
	default:
		goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	case 0:
	L: // GCCGO_ERROR "block starts here"
	}
}

func _() {
	switch i {
	case 0:
	L: // GCCGO_ERROR "block starts here"
		;
	default:
		goto L // ERROR "goto L jumps into block starting at LINE-4|goto 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 starting at LINE+2|goto jumps into block"
	select {
	case c <- 1:
	L: // GCCGO_ERROR "block starts here"
	}
}

func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+2|goto jumps into block"
	select {
	case c <- 1:
	L: // GCCGO_ERROR "block starts here"
		;
	default:
	}
}

func _() {
	goto L // ERROR "goto L jumps into block starting at LINE+3|goto jumps into block"
	select {
	case <-c:
	default:
	L: // GCCGO_ERROR "block starts here"
	}
}

func _() {
	select {
	default:
		goto L // ERROR "goto L jumps into block starting at LINE+1|goto jumps into block"
	case <-c:
	L: // GCCGO_ERROR "block starts here"
	}
}

func _() {
	select {
	case <-c:
	L: // GCCGO_ERROR "block starts here"
		;
	default:
		goto L // ERROR "goto L jumps into block starting at LINE-4|goto jumps into block"
	}
}

相关信息

go 源码目录

相关文章

go 235 源码

go 64bit 源码

go alg 源码

go alias 源码

go alias1 源码

go alias2 源码

go alias3 源码

go align 源码

go append 源码

go append1 源码

0  赞