1// run
2
3// Copyright 2010 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 variadic functions and calls (dot-dot-dot).
8
9package main
10
11func sum(args ...int) int {
12	s := 0
13	for _, v := range args {
14		s += v
15	}
16	return s
17}
18
19func sumC(args ...int) int { return func() int { return sum(args...) }() }
20
21var sumD = func(args ...int) int { return sum(args...) }
22
23var sumE = func() func(...int) int { return func(args ...int) int { return sum(args...) } }()
24
25var sumF = func(args ...int) func() int { return func() int { return sum(args...) } }
26
27func sumA(args []int) int {
28	s := 0
29	for _, v := range args {
30		s += v
31	}
32	return s
33}
34
35func sumB(args []int) int { return sum(args...) }
36
37func sum2(args ...int) int { return 2 * sum(args...) }
38
39func sum3(args ...int) int { return 3 * sumA(args) }
40
41func sum4(args ...int) int { return 4 * sumB(args) }
42
43func intersum(args ...interface{}) int {
44	s := 0
45	for _, v := range args {
46		s += v.(int)
47	}
48	return s
49}
50
51type T []T
52
53func ln(args ...T) int { return len(args) }
54
55func ln2(args ...T) int { return 2 * ln(args...) }
56
57func (*T) Sum(args ...int) int { return sum(args...) }
58
59type U struct {
60	*T
61}
62
63type I interface {
64	Sum(...int) int
65}
66
67func main() {
68	if x := sum(1, 2, 3); x != 6 {
69		println("sum 6", x)
70		panic("fail")
71	}
72	if x := sum(); x != 0 {
73		println("sum 0", x)
74		panic("fail")
75	}
76	if x := sum(10); x != 10 {
77		println("sum 10", x)
78		panic("fail")
79	}
80	if x := sum(1, 8); x != 9 {
81		println("sum 9", x)
82		panic("fail")
83	}
84	if x := sumC(4, 5, 6); x != 15 {
85		println("sumC 15", x)
86		panic("fail")
87	}
88	if x := sumD(4, 5, 7); x != 16 {
89		println("sumD 16", x)
90		panic("fail")
91	}
92	if x := sumE(4, 5, 8); x != 17 {
93		println("sumE 17", x)
94		panic("fail")
95	}
96	if x := sumF(4, 5, 9)(); x != 18 {
97		println("sumF 18", x)
98		panic("fail")
99	}
100	if x := sum2(1, 2, 3); x != 2*6 {
101		println("sum 6", x)
102		panic("fail")
103	}
104	if x := sum2(); x != 2*0 {
105		println("sum 0", x)
106		panic("fail")
107	}
108	if x := sum2(10); x != 2*10 {
109		println("sum 10", x)
110		panic("fail")
111	}
112	if x := sum2(1, 8); x != 2*9 {
113		println("sum 9", x)
114		panic("fail")
115	}
116	if x := sum3(1, 2, 3); x != 3*6 {
117		println("sum 6", x)
118		panic("fail")
119	}
120	if x := sum3(); x != 3*0 {
121		println("sum 0", x)
122		panic("fail")
123	}
124	if x := sum3(10); x != 3*10 {
125		println("sum 10", x)
126		panic("fail")
127	}
128	if x := sum3(1, 8); x != 3*9 {
129		println("sum 9", x)
130		panic("fail")
131	}
132	if x := sum4(1, 2, 3); x != 4*6 {
133		println("sum 6", x)
134		panic("fail")
135	}
136	if x := sum4(); x != 4*0 {
137		println("sum 0", x)
138		panic("fail")
139	}
140	if x := sum4(10); x != 4*10 {
141		println("sum 10", x)
142		panic("fail")
143	}
144	if x := sum4(1, 8); x != 4*9 {
145		println("sum 9", x)
146		panic("fail")
147	}
148	if x := intersum(1, 2, 3); x != 6 {
149		println("intersum 6", x)
150		panic("fail")
151	}
152	if x := intersum(); x != 0 {
153		println("intersum 0", x)
154		panic("fail")
155	}
156	if x := intersum(10); x != 10 {
157		println("intersum 10", x)
158		panic("fail")
159	}
160	if x := intersum(1, 8); x != 9 {
161		println("intersum 9", x)
162		panic("fail")
163	}
164
165	if x := ln(nil, nil, nil); x != 3 {
166		println("ln 3", x)
167		panic("fail")
168	}
169	if x := ln([]T{}); x != 1 {
170		println("ln 1", x)
171		panic("fail")
172	}
173	if x := ln2(nil, nil, nil); x != 2*3 {
174		println("ln2 3", x)
175		panic("fail")
176	}
177	if x := ln2([]T{}); x != 2*1 {
178		println("ln2 1", x)
179		panic("fail")
180	}
181	if x := ((*T)(nil)).Sum(1, 3, 5, 7); x != 16 {
182		println("(*T)(nil).Sum", x)
183		panic("fail")
184	}
185	if x := (*T).Sum(nil, 1, 3, 5, 6); x != 15 {
186		println("(*T).Sum", x)
187		panic("fail")
188	}
189	if x := (&U{}).Sum(1, 3, 5, 5); x != 14 {
190		println("(&U{}).Sum", x)
191		panic("fail")
192	}
193	var u U
194	if x := u.Sum(1, 3, 5, 4); x != 13 {
195		println("u.Sum", x)
196		panic("fail")
197	}
198	if x := (&u).Sum(1, 3, 5, 3); x != 12 {
199		println("(&u).Sum", x)
200		panic("fail")
201	}
202	var i interface {
203		Sum(...int) int
204	} = &u
205	if x := i.Sum(2, 3, 5, 7); x != 17 {
206		println("i(=&u).Sum", x)
207		panic("fail")
208	}
209	i = u
210	if x := i.Sum(2, 3, 5, 6); x != 16 {
211		println("i(=u).Sum", x)
212		panic("fail")
213	}
214	var s struct {
215		I
216	}
217	s.I = &u
218	if x := s.Sum(2, 3, 5, 8); x != 18 {
219		println("s{&u}.Sum", x)
220		panic("fail")
221	}
222	if x := (*U).Sum(&U{}, 1, 3, 5, 2); x != 11 {
223		println("(*U).Sum", x)
224		panic("fail")
225	}
226	if x := U.Sum(U{}, 1, 3, 5, 1); x != 10 {
227		println("U.Sum", x)
228		panic("fail")
229	}
230}
231