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