blob: 0539debb1f25249788954bf0704db109ae1d635b [file] [log] [blame]
Russ Cox0b477ef2012-02-16 23:48:57 -05001// run
Russ Cox5438be42009-09-08 23:16:19 -07002
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
Rob Pikefc0dc042012-02-19 13:19:43 +11007// Test behavior of the blank identifier (_).
8
Russ Cox5438be42009-09-08 23:16:19 -07009package main
10
Alan Donovanaa5aaab2013-02-21 12:48:38 -050011import (
12 "os"
13 "unsafe"
14)
Rémy Oudompheng2ad57b42013-01-18 18:26:43 +010015
Russ Coxaa6e81dd2009-09-09 16:59:41 -070016import _ "fmt"
17
Russ Cox5438be42009-09-08 23:16:19 -070018var call string
19
20type T struct {
Rob Pike4f61fc92010-09-04 10:36:13 +100021 _, _, _ int
Russ Cox5438be42009-09-08 23:16:19 -070022}
23
Russ Coxaa6e81dd2009-09-09 16:59:41 -070024func (T) _() {
25}
26
27func (T) _() {
28}
29
Rémy Oudompheng428ea682013-07-02 09:08:43 +020030type U struct {
31 _ struct{ a, b, c int }
32}
33
Russ Cox5438be42009-09-08 23:16:19 -070034const (
Rob Pike4f61fc92010-09-04 10:36:13 +100035 c0 = iota
36 _
37 _
38 _
39 c4
Russ Cox5438be42009-09-08 23:16:19 -070040)
41
Russ Coxf2b5a072011-01-19 23:09:00 -050042var ints = []string{
Russ Cox5438be42009-09-08 23:16:19 -070043 "1",
44 "2",
Robert Griesemer542099d2009-12-09 19:27:08 -080045 "3",
Russ Cox5438be42009-09-08 23:16:19 -070046}
47
48func f() (int, int) {
Rob Pike4f61fc92010-09-04 10:36:13 +100049 call += "f"
Russ Coxf2b5a072011-01-19 23:09:00 -050050 return 1, 2
Russ Cox5438be42009-09-08 23:16:19 -070051}
52
Russ Coxf2b5a072011-01-19 23:09:00 -050053func g() (float64, float64) {
Rob Pike4f61fc92010-09-04 10:36:13 +100054 call += "g"
Russ Coxf2b5a072011-01-19 23:09:00 -050055 return 3, 4
Russ Cox5438be42009-09-08 23:16:19 -070056}
57
Russ Coxf2b5a072011-01-19 23:09:00 -050058func h(_ int, _ float64) {
Russ Cox5438be42009-09-08 23:16:19 -070059}
60
61func i() int {
Rob Pike4f61fc92010-09-04 10:36:13 +100062 call += "i"
63 return 23
Russ Cox5438be42009-09-08 23:16:19 -070064}
65
Rob Pike4f61fc92010-09-04 10:36:13 +100066var _ = i()
Russ Cox4c3a85d2009-10-19 19:27:40 -070067
Russ Coxaa6e81dd2009-09-09 16:59:41 -070068func main() {
Russ Coxf2b5a072011-01-19 23:09:00 -050069 if call != "i" {
70 panic("init did not run")
71 }
Rob Pike4f61fc92010-09-04 10:36:13 +100072 call = ""
73 _, _ = f()
74 a, _ := f()
Russ Coxf2b5a072011-01-19 23:09:00 -050075 if a != 1 {
76 panic(a)
77 }
Rob Pike4f61fc92010-09-04 10:36:13 +100078 b, _ := g()
Russ Coxf2b5a072011-01-19 23:09:00 -050079 if b != 3 {
80 panic(b)
81 }
Rob Pike4f61fc92010-09-04 10:36:13 +100082 _, a = f()
Russ Coxf2b5a072011-01-19 23:09:00 -050083 if a != 2 {
84 panic(a)
85 }
Rob Pike4f61fc92010-09-04 10:36:13 +100086 _, b = g()
Russ Coxf2b5a072011-01-19 23:09:00 -050087 if b != 4 {
88 panic(b)
89 }
Rob Pike4f61fc92010-09-04 10:36:13 +100090 _ = i()
Russ Coxf2b5a072011-01-19 23:09:00 -050091 if call != "ffgfgi" {
92 panic(call)
93 }
94 if c4 != 4 {
95 panic(c4)
96 }
Russ Cox5438be42009-09-08 23:16:19 -070097
Rob Pike4f61fc92010-09-04 10:36:13 +100098 out := ""
Russ Cox5438be42009-09-08 23:16:19 -070099 for _, s := range ints {
Rob Pike4f61fc92010-09-04 10:36:13 +1000100 out += s
Russ Cox5438be42009-09-08 23:16:19 -0700101 }
Russ Coxf2b5a072011-01-19 23:09:00 -0500102 if out != "123" {
103 panic(out)
104 }
Russ Cox5438be42009-09-08 23:16:19 -0700105
Rob Pike4f61fc92010-09-04 10:36:13 +1000106 sum := 0
Ryan Hitchman062406b2010-12-08 21:36:56 -0800107 for s := range ints {
Rob Pike4f61fc92010-09-04 10:36:13 +1000108 sum += s
Russ Cox5438be42009-09-08 23:16:19 -0700109 }
Russ Coxf2b5a072011-01-19 23:09:00 -0500110 if sum != 3 {
111 panic(sum)
112 }
Russ Cox5438be42009-09-08 23:16:19 -0700113
Alan Donovanbab2a542013-10-08 14:36:20 -0400114 // go.tools/ssa/interp cannot support unsafe.Pointer.
Alan Donovanaa5aaab2013-02-21 12:48:38 -0500115 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 }
Rémy Oudompheng428ea682013-07-02 09:08:43 +0200122
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 }
Rémy Oudompheng2ad57b42013-01-18 18:26:43 +0100129 }
130
Russ Coxf2b5a072011-01-19 23:09:00 -0500131 h(a, b)
Rémy Oudompheng2ad57b42013-01-18 18:26:43 +0100132
Russ Cox8e515482011-11-28 16:40:39 -0500133 m()
134}
135
136type I interface {
137 M(_ int, y int)
138}
139
140type TI struct{}
141
Ian Lance Taylor373f1a92012-03-30 08:42:21 -0700142func (_ TI) M(x int, y int) {
Russ Cox8e515482011-11-28 16:40:39 -0500143 if x != y {
144 println("invalid M call:", x, y)
145 panic("bad M")
146 }
147}
148
Russ Cox8c0b6992011-12-09 11:59:21 -0500149var 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
Russ Cox8e515482011-11-28 16:40:39 -0500162func m() {
163 var i I
Rémy Oudompheng2ad57b42013-01-18 18:26:43 +0100164
Russ Cox8e515482011-11-28 16:40:39 -0500165 i = TI{}
166 i.M(1, 1)
167 i.M(2, 2)
Rémy Oudompheng2ad57b42013-01-18 18:26:43 +0100168
Russ Cox8c0b6992011-12-09 11:59:21 -0500169 fp(1, 1)
170 fp(2, 2)
Russ Cox5438be42009-09-08 23:16:19 -0700171}
172
173// useless but legal
Rob Pike4f61fc92010-09-04 10:36:13 +1000174var _ int = 1
175var _ = 2
176var _, _ = 3, 4
Russ Coxf2b5a072011-01-19 23:09:00 -0500177
Rob Pike4f61fc92010-09-04 10:36:13 +1000178const _ = 3
179const _, _ = 4, 5
Russ Coxf2b5a072011-01-19 23:09:00 -0500180
Rob Pike4f61fc92010-09-04 10:36:13 +1000181type _ int
Russ Coxf2b5a072011-01-19 23:09:00 -0500182
Russ Cox5438be42009-09-08 23:16:19 -0700183func _() {
184 panic("oops")
185}
186
187func ff() {
Rob Pike4f61fc92010-09-04 10:36:13 +1000188 var _ int = 1
Russ Cox5438be42009-09-08 23:16:19 -0700189}