mirror of
				https://github.com/golang/go.git
				synced 2025-11-03 18:20:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			189 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// run
 | 
						|
 | 
						|
// Copyright 2009 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.
 | 
						|
 | 
						|
// Test behavior of the blank identifier (_).
 | 
						|
 | 
						|
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"os"
 | 
						|
	"unsafe"
 | 
						|
)
 | 
						|
 | 
						|
import _ "fmt"
 | 
						|
 | 
						|
var call string
 | 
						|
 | 
						|
type T struct {
 | 
						|
	_, _, _ int
 | 
						|
}
 | 
						|
 | 
						|
func (T) _() {
 | 
						|
}
 | 
						|
 | 
						|
func (T) _() {
 | 
						|
}
 | 
						|
 | 
						|
type U struct {
 | 
						|
	_ struct{ a, b, c int }
 | 
						|
}
 | 
						|
 | 
						|
const (
 | 
						|
	c0 = iota
 | 
						|
	_
 | 
						|
	_
 | 
						|
	_
 | 
						|
	c4
 | 
						|
)
 | 
						|
 | 
						|
var ints = []string{
 | 
						|
	"1",
 | 
						|
	"2",
 | 
						|
	"3",
 | 
						|
}
 | 
						|
 | 
						|
func f() (int, int) {
 | 
						|
	call += "f"
 | 
						|
	return 1, 2
 | 
						|
}
 | 
						|
 | 
						|
func g() (float64, float64) {
 | 
						|
	call += "g"
 | 
						|
	return 3, 4
 | 
						|
}
 | 
						|
 | 
						|
func h(_ int, _ float64) {
 | 
						|
}
 | 
						|
 | 
						|
func i() int {
 | 
						|
	call += "i"
 | 
						|
	return 23
 | 
						|
}
 | 
						|
 | 
						|
var _ = i()
 | 
						|
 | 
						|
func main() {
 | 
						|
	if call != "i" {
 | 
						|
		panic("init did not run")
 | 
						|
	}
 | 
						|
	call = ""
 | 
						|
	_, _ = f()
 | 
						|
	a, _ := f()
 | 
						|
	if a != 1 {
 | 
						|
		panic(a)
 | 
						|
	}
 | 
						|
	b, _ := g()
 | 
						|
	if b != 3 {
 | 
						|
		panic(b)
 | 
						|
	}
 | 
						|
	_, a = f()
 | 
						|
	if a != 2 {
 | 
						|
		panic(a)
 | 
						|
	}
 | 
						|
	_, b = g()
 | 
						|
	if b != 4 {
 | 
						|
		panic(b)
 | 
						|
	}
 | 
						|
	_ = i()
 | 
						|
	if call != "ffgfgi" {
 | 
						|
		panic(call)
 | 
						|
	}
 | 
						|
	if c4 != 4 {
 | 
						|
		panic(c4)
 | 
						|
	}
 | 
						|
 | 
						|
	out := ""
 | 
						|
	for _, s := range ints {
 | 
						|
		out += s
 | 
						|
	}
 | 
						|
	if out != "123" {
 | 
						|
		panic(out)
 | 
						|
	}
 | 
						|
 | 
						|
	sum := 0
 | 
						|
	for s := range ints {
 | 
						|
		sum += s
 | 
						|
	}
 | 
						|
	if sum != 3 {
 | 
						|
		panic(sum)
 | 
						|
	}
 | 
						|
 | 
						|
	// go.tools/ssa/interp cannot support unsafe.Pointer.
 | 
						|
	if os.Getenv("GOSSAINTERP") == "" {
 | 
						|
		type T1 struct{ x, y, z int }
 | 
						|
		t1 := *(*T)(unsafe.Pointer(&T1{1, 2, 3}))
 | 
						|
		t2 := *(*T)(unsafe.Pointer(&T1{4, 5, 6}))
 | 
						|
		if t1 != t2 {
 | 
						|
			panic("T{} != T{}")
 | 
						|
		}
 | 
						|
 | 
						|
		var u1, u2 interface{}
 | 
						|
		u1 = *(*U)(unsafe.Pointer(&T1{1, 2, 3}))
 | 
						|
		u2 = *(*U)(unsafe.Pointer(&T1{4, 5, 6}))
 | 
						|
		if u1 != u2 {
 | 
						|
			panic("U{} != U{}")
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	h(a, b)
 | 
						|
 | 
						|
	m()
 | 
						|
}
 | 
						|
 | 
						|
type I interface {
 | 
						|
	M(_ int, y int)
 | 
						|
}
 | 
						|
 | 
						|
type TI struct{}
 | 
						|
 | 
						|
func (_ TI) M(x int, y int) {
 | 
						|
	if x != y {
 | 
						|
		println("invalid M call:", x, y)
 | 
						|
		panic("bad M")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
var fp = func(_ int, y int) {}
 | 
						|
 | 
						|
func init() {
 | 
						|
	fp = fp1
 | 
						|
}
 | 
						|
 | 
						|
func fp1(x, y int) {
 | 
						|
	if x != y {
 | 
						|
		println("invalid fp1 call:", x, y)
 | 
						|
		panic("bad fp1")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func m() {
 | 
						|
	var i I
 | 
						|
 | 
						|
	i = TI{}
 | 
						|
	i.M(1, 1)
 | 
						|
	i.M(2, 2)
 | 
						|
 | 
						|
	fp(1, 1)
 | 
						|
	fp(2, 2)
 | 
						|
}
 | 
						|
 | 
						|
// useless but legal
 | 
						|
var _ int = 1
 | 
						|
var _ = 2
 | 
						|
var _, _ = 3, 4
 | 
						|
 | 
						|
const _ = 3
 | 
						|
const _, _ = 4, 5
 | 
						|
 | 
						|
type _ int
 | 
						|
 | 
						|
func _() {
 | 
						|
	panic("oops")
 | 
						|
}
 | 
						|
 | 
						|
func ff() {
 | 
						|
	var _ int = 1
 | 
						|
}
 |