blob: 0539debb1f25249788954bf0704db109ae1d635b [file] [log] [blame]
Brent Austinba3052e2015-04-21 16:08:23 -07001// 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
9package main
10
11import (
12 "os"
13 "unsafe"
14)
15
16import _ "fmt"
17
18var call string
19
20type T struct {
21 _, _, _ int
22}
23
24func (T) _() {
25}
26
27func (T) _() {
28}
29
30type U struct {
31 _ struct{ a, b, c int }
32}
33
34const (
35 c0 = iota
36 _
37 _
38 _
39 c4
40)
41
42var ints = []string{
43 "1",
44 "2",
45 "3",
46}
47
48func f() (int, int) {
49 call += "f"
50 return 1, 2
51}
52
53func g() (float64, float64) {
54 call += "g"
55 return 3, 4
56}
57
58func h(_ int, _ float64) {
59}
60
61func i() int {
62 call += "i"
63 return 23
64}
65
66var _ = i()
67
68func 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
136type I interface {
137 M(_ int, y int)
138}
139
140type TI struct{}
141
142func (_ TI) M(x int, y int) {
143 if x != y {
144 println("invalid M call:", x, y)
145 panic("bad M")
146 }
147}
148
149var fp = func(_ int, y int) {}
150
151func init() {
152 fp = fp1
153}
154
155func fp1(x, y int) {
156 if x != y {
157 println("invalid fp1 call:", x, y)
158 panic("bad fp1")
159 }
160}
161
162func 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
174var _ int = 1
175var _ = 2
176var _, _ = 3, 4
177
178const _ = 3
179const _, _ = 4, 5
180
181type _ int
182
183func _() {
184 panic("oops")
185}
186
187func ff() {
188 var _ int = 1
189}