Home | History | Annotate | Download | only in test
      1 // run
      2 
      3 // Copyright 2009 The Go Authors. All rights reserved.
      4 // Use of this source code is governed by a BSD-style
      5 // license that can be found in the LICENSE file.
      6 
      7 // Test behavior of the blank identifier (_).
      8 
      9 package main
     10 
     11 import (
     12 	"os"
     13 	"unsafe"
     14 )
     15 
     16 import _ "fmt"
     17 
     18 var call string
     19 
     20 type T struct {
     21 	_, _, _ int
     22 }
     23 
     24 func (T) _() {
     25 }
     26 
     27 func (T) _() {
     28 }
     29 
     30 type U struct {
     31 	_ struct{ a, b, c int }
     32 }
     33 
     34 const (
     35 	c0 = iota
     36 	_
     37 	_
     38 	_
     39 	c4
     40 )
     41 
     42 var ints = []string{
     43 	"1",
     44 	"2",
     45 	"3",
     46 }
     47 
     48 func f() (int, int) {
     49 	call += "f"
     50 	return 1, 2
     51 }
     52 
     53 func g() (float64, float64) {
     54 	call += "g"
     55 	return 3, 4
     56 }
     57 
     58 func h(_ int, _ float64) {
     59 }
     60 
     61 func i() int {
     62 	call += "i"
     63 	return 23
     64 }
     65 
     66 var _ = i()
     67 
     68 func main() {
     69 	if call != "i" {
     70 		panic("init did not run")
     71 	}
     72 	call = ""
     73 	_, _ = f()
     74 	a, _ := f()
     75 	if a != 1 {
     76 		panic(a)
     77 	}
     78 	b, _ := g()
     79 	if b != 3 {
     80 		panic(b)
     81 	}
     82 	_, a = f()
     83 	if a != 2 {
     84 		panic(a)
     85 	}
     86 	_, b = g()
     87 	if b != 4 {
     88 		panic(b)
     89 	}
     90 	_ = i()
     91 	if call != "ffgfgi" {
     92 		panic(call)
     93 	}
     94 	if c4 != 4 {
     95 		panic(c4)
     96 	}
     97 
     98 	out := ""
     99 	for _, s := range ints {
    100 		out += s
    101 	}
    102 	if out != "123" {
    103 		panic(out)
    104 	}
    105 
    106 	sum := 0
    107 	for s := range ints {
    108 		sum += s
    109 	}
    110 	if sum != 3 {
    111 		panic(sum)
    112 	}
    113 
    114 	// go.tools/ssa/interp cannot support unsafe.Pointer.
    115 	if os.Getenv("GOSSAINTERP") == "" {
    116 		type T1 struct{ x, y, z int }
    117 		t1 := *(*T)(unsafe.Pointer(&T1{1, 2, 3}))
    118 		t2 := *(*T)(unsafe.Pointer(&T1{4, 5, 6}))
    119 		if t1 != t2 {
    120 			panic("T{} != T{}")
    121 		}
    122 
    123 		var u1, u2 interface{}
    124 		u1 = *(*U)(unsafe.Pointer(&T1{1, 2, 3}))
    125 		u2 = *(*U)(unsafe.Pointer(&T1{4, 5, 6}))
    126 		if u1 != u2 {
    127 			panic("U{} != U{}")
    128 		}
    129 	}
    130 
    131 	h(a, b)
    132 
    133 	m()
    134 }
    135 
    136 type I interface {
    137 	M(_ int, y int)
    138 }
    139 
    140 type TI struct{}
    141 
    142 func (_ TI) M(x int, y int) {
    143 	if x != y {
    144 		println("invalid M call:", x, y)
    145 		panic("bad M")
    146 	}
    147 }
    148 
    149 var fp = func(_ int, y int) {}
    150 
    151 func init() {
    152 	fp = fp1
    153 }
    154 
    155 func fp1(x, y int) {
    156 	if x != y {
    157 		println("invalid fp1 call:", x, y)
    158 		panic("bad fp1")
    159 	}
    160 }
    161 
    162 func m() {
    163 	var i I
    164 
    165 	i = TI{}
    166 	i.M(1, 1)
    167 	i.M(2, 2)
    168 
    169 	fp(1, 1)
    170 	fp(2, 2)
    171 }
    172 
    173 // useless but legal
    174 var _ int = 1
    175 var _ = 2
    176 var _, _ = 3, 4
    177 
    178 const _ = 3
    179 const _, _ = 4, 5
    180 
    181 type _ int
    182 
    183 func _() {
    184 	panic("oops")
    185 }
    186 
    187 func ff() {
    188 	var _ int = 1
    189 }
    190