Russ Cox | 0b477ef | 2012-02-16 23:48:57 -0500 | [diff] [blame] | 1 | // run |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 2 | |
Emmanuel Odeke | 53fd522 | 2016-04-10 14:32:26 -0700 | [diff] [blame] | 3 | // Copyright 2010 The Go Authors. All rights reserved. |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 4 | // Use of this source code is governed by a BSD-style |
| 5 | // license that can be found in the LICENSE file. |
| 6 | |
Rob Pike | 83976e3 | 2012-02-19 14:28:53 +1100 | [diff] [blame] | 7 | // Test variadic functions and calls (dot-dot-dot). |
| 8 | |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 9 | package main |
| 10 | |
| 11 | func sum(args ...int) int { |
| 12 | s := 0 |
| 13 | for _, v := range args { |
| 14 | s += v |
| 15 | } |
| 16 | return s |
| 17 | } |
| 18 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 19 | func sumC(args ...int) int { return func() int { return sum(args...) }() } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 20 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 21 | var sumD = func(args ...int) int { return sum(args...) } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 22 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 23 | var sumE = func() func(...int) int { return func(args ...int) int { return sum(args...) } }() |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 24 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 25 | var sumF = func(args ...int) func() int { return func() int { return sum(args...) } } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 26 | |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 27 | func sumA(args []int) int { |
| 28 | s := 0 |
| 29 | for _, v := range args { |
| 30 | s += v |
| 31 | } |
| 32 | return s |
| 33 | } |
| 34 | |
Russ Cox | 01385b4 | 2010-10-06 11:12:30 -0400 | [diff] [blame] | 35 | func sumB(args []int) int { return sum(args...) } |
| 36 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 37 | func sum2(args ...int) int { return 2 * sum(args...) } |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 38 | |
| 39 | func sum3(args ...int) int { return 3 * sumA(args) } |
| 40 | |
Russ Cox | 01385b4 | 2010-10-06 11:12:30 -0400 | [diff] [blame] | 41 | func sum4(args ...int) int { return 4 * sumB(args) } |
| 42 | |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 43 | func intersum(args ...interface{}) int { |
| 44 | s := 0 |
| 45 | for _, v := range args { |
| 46 | s += v.(int) |
| 47 | } |
| 48 | return s |
| 49 | } |
| 50 | |
| 51 | type T []T |
| 52 | |
| 53 | func ln(args ...T) int { return len(args) } |
| 54 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 55 | func ln2(args ...T) int { return 2 * ln(args...) } |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 56 | |
Russ Cox | 2ee420f | 2010-09-24 11:55:48 -0400 | [diff] [blame] | 57 | func (*T) Sum(args ...int) int { return sum(args...) } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 58 | |
| 59 | type U struct { |
| 60 | *T |
| 61 | } |
| 62 | |
Ian Lance Taylor | e54ad64 | 2012-03-07 08:24:10 -0800 | [diff] [blame] | 63 | type I interface { |
| 64 | Sum(...int) int |
| 65 | } |
| 66 | |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 67 | func main() { |
| 68 | if x := sum(1, 2, 3); x != 6 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 69 | println("sum 6", x) |
| 70 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 71 | } |
| 72 | if x := sum(); x != 0 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 73 | println("sum 0", x) |
| 74 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 75 | } |
| 76 | if x := sum(10); x != 10 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 77 | println("sum 10", x) |
| 78 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 79 | } |
| 80 | if x := sum(1, 8); x != 9 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 81 | println("sum 9", x) |
| 82 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 83 | } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 84 | if x := sumC(4, 5, 6); x != 15 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 85 | println("sumC 15", x) |
| 86 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 87 | } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 88 | if x := sumD(4, 5, 7); x != 16 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 89 | println("sumD 16", x) |
| 90 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 91 | } |
| 92 | if x := sumE(4, 5, 8); x != 17 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 93 | println("sumE 17", x) |
| 94 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 95 | } |
| 96 | if x := sumF(4, 5, 9)(); x != 18 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 97 | println("sumF 18", x) |
| 98 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 99 | } |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 100 | if x := sum2(1, 2, 3); x != 2*6 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 101 | println("sum 6", x) |
| 102 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 103 | } |
| 104 | if x := sum2(); x != 2*0 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 105 | println("sum 0", x) |
| 106 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 107 | } |
| 108 | if x := sum2(10); x != 2*10 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 109 | println("sum 10", x) |
| 110 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 111 | } |
| 112 | if x := sum2(1, 8); x != 2*9 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 113 | println("sum 9", x) |
| 114 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 115 | } |
| 116 | if x := sum3(1, 2, 3); x != 3*6 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 117 | println("sum 6", x) |
| 118 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 119 | } |
| 120 | if x := sum3(); x != 3*0 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 121 | println("sum 0", x) |
| 122 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 123 | } |
| 124 | if x := sum3(10); x != 3*10 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 125 | println("sum 10", x) |
| 126 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 127 | } |
| 128 | if x := sum3(1, 8); x != 3*9 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 129 | println("sum 9", x) |
| 130 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 131 | } |
Russ Cox | 01385b4 | 2010-10-06 11:12:30 -0400 | [diff] [blame] | 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 | } |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 148 | if x := intersum(1, 2, 3); x != 6 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 149 | println("intersum 6", x) |
| 150 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 151 | } |
| 152 | if x := intersum(); x != 0 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 153 | println("intersum 0", x) |
| 154 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 155 | } |
| 156 | if x := intersum(10); x != 10 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 157 | println("intersum 10", x) |
| 158 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 159 | } |
| 160 | if x := intersum(1, 8); x != 9 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 161 | println("intersum 9", x) |
| 162 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 163 | } |
| 164 | |
| 165 | if x := ln(nil, nil, nil); x != 3 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 166 | println("ln 3", x) |
| 167 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 168 | } |
| 169 | if x := ln([]T{}); x != 1 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 170 | println("ln 1", x) |
| 171 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 172 | } |
| 173 | if x := ln2(nil, nil, nil); x != 2*3 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 174 | println("ln2 3", x) |
| 175 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 176 | } |
| 177 | if x := ln2([]T{}); x != 2*1 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 178 | println("ln2 1", x) |
| 179 | panic("fail") |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 180 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 181 | if x := ((*T)(nil)).Sum(1, 3, 5, 7); x != 16 { |
| 182 | println("(*T)(nil).Sum", x) |
| 183 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 184 | } |
| 185 | if x := (*T).Sum(nil, 1, 3, 5, 6); x != 15 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 186 | println("(*T).Sum", x) |
| 187 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 188 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 189 | if x := (&U{}).Sum(1, 3, 5, 5); x != 14 { |
| 190 | println("(&U{}).Sum", x) |
| 191 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 192 | } |
| 193 | var u U |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 194 | if x := u.Sum(1, 3, 5, 4); x != 13 { |
| 195 | println("u.Sum", x) |
| 196 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 197 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 198 | if x := (&u).Sum(1, 3, 5, 3); x != 12 { |
| 199 | println("(&u).Sum", x) |
| 200 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 201 | } |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 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") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 208 | } |
| 209 | i = u |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 210 | if x := i.Sum(2, 3, 5, 6); x != 16 { |
| 211 | println("i(=u).Sum", x) |
| 212 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 213 | } |
Ian Lance Taylor | e54ad64 | 2012-03-07 08:24:10 -0800 | [diff] [blame] | 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 | } |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 222 | if x := (*U).Sum(&U{}, 1, 3, 5, 2); x != 11 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 223 | println("(*U).Sum", x) |
| 224 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 225 | } |
| 226 | if x := U.Sum(U{}, 1, 3, 5, 1); x != 10 { |
Rob Pike | 325cf8e | 2010-03-24 16:46:53 -0700 | [diff] [blame] | 227 | println("U.Sum", x) |
| 228 | panic("fail") |
Russ Cox | bea730d | 2010-02-01 10:49:24 -0800 | [diff] [blame] | 229 | } |
Russ Cox | 68796b0 | 2010-02-01 00:25:59 -0800 | [diff] [blame] | 230 | } |