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