Home | History | Annotate | Download | only in test
      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 reorderings; derived from fixedbugs/bug294.go.
      8 
      9 package main
     10 
     11 var log string
     12 
     13 type TT int
     14 
     15 func (t TT) a(s string) TT {
     16 	log += "a(" + s + ")"
     17 	return t
     18 }
     19 
     20 func (TT) b(s string) string {
     21 	log += "b(" + s + ")"
     22 	return s
     23 }
     24 
     25 type F func(s string) F
     26 
     27 func a(s string) F {
     28 	log += "a(" + s + ")"
     29 	return F(a)
     30 }
     31 
     32 func b(s string) string {
     33 	log += "b(" + s + ")"
     34 	return s
     35 }
     36 
     37 type I interface {
     38 	a(s string) I
     39 	b(s string) string
     40 }
     41 
     42 type T1 int
     43 
     44 func (t T1) a(s string) I {
     45 	log += "a(" + s + ")"
     46 	return t
     47 }
     48 
     49 func (T1) b(s string) string {
     50 	log += "b(" + s + ")"
     51 	return s
     52 }
     53 
     54 // f(g(), h()) where g is not inlinable but h is will have the same problem.
     55 // As will x := g() + h() (same conditions).
     56 // And g() <- h().
     57 func f(x, y string) {
     58 	log += "f(" + x + ", " + y + ")"
     59 }
     60 
     61 func ff(x, y string) {
     62 	for false {
     63 	} // prevent inl
     64 	log += "ff(" + x + ", " + y + ")"
     65 }
     66 
     67 func h(x string) string {
     68 	log += "h(" + x + ")"
     69 	return x
     70 }
     71 
     72 func g(x string) string {
     73 	for false {
     74 	} // prevent inl
     75 	log += "g(" + x + ")"
     76 	return x
     77 }
     78 
     79 func main() {
     80 	err := 0
     81 	var t TT
     82 	if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
     83 		println("expecting a(1)a(2)a(3) , got ", log)
     84 		err++
     85 	}
     86 	log = ""
     87 
     88 	if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
     89 		println("expecting a(1)b(2)a(2), got ", log)
     90 		err++
     91 	}
     92 	log = ""
     93 	if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
     94 		println("expecting a(3)b(4)a(4)b(5)a(5), got ", log)
     95 		err++
     96 	}
     97 	log = ""
     98 	var i I = T1(0)
     99 	if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    100 		println("expecting a(6)ba(7)ba(8)ba(9), got", log)
    101 		err++
    102 	}
    103 	log = ""
    104 
    105 	if s := t.a("1").b("3"); log != "a(1)b(3)" || s != "3" {
    106 		println("expecting a(1)b(3) and 3, got ", log, " and ", s)
    107 		err++
    108 	}
    109 	log = ""
    110 
    111 	if s := t.a("1").a(t.b("2")).b("3") + t.a("4").b("5"); log != "a(1)b(2)a(2)b(3)a(4)b(5)" || s != "35" {
    112 		println("expecting a(1)b(2)a(2)b(3)a(4)b(5) and 35, got ", log, " and ", s)
    113 		err++
    114 	}
    115 	log = ""
    116 
    117 	if s := t.a("4").b("5") + t.a("1").a(t.b("2")).b("3"); log != "a(4)b(5)a(1)b(2)a(2)b(3)" || s != "53" {
    118 		println("expecting a(4)b(5)a(1)b(2)a(2)b(3) and 35, got ", log, " and ", s)
    119 		err++
    120 	}
    121 	log = ""
    122 
    123 	if ff(g("1"), g("2")); log != "g(1)g(2)ff(1, 2)" {
    124 		println("expecting g(1)g(2)ff..., got ", log)
    125 		err++
    126 	}
    127 	log = ""
    128 
    129 	if ff(g("1"), h("2")); log != "g(1)h(2)ff(1, 2)" {
    130 		println("expecting g(1)h(2)ff..., got ", log)
    131 		err++
    132 	}
    133 	log = ""
    134 
    135 	if ff(h("1"), g("2")); log != "h(1)g(2)ff(1, 2)" {
    136 		println("expecting h(1)g(2)ff..., got ", log)
    137 		err++
    138 	}
    139 	log = ""
    140 
    141 	if ff(h("1"), h("2")); log != "h(1)h(2)ff(1, 2)" {
    142 		println("expecting h(1)h(2)ff..., got ", log)
    143 		err++
    144 	}
    145 	log = ""
    146 
    147 	if s := g("1") + g("2"); log != "g(1)g(2)" || s != "12" {
    148 		println("expecting g1g2 and 12, got ", log, " and ", s)
    149 		err++
    150 	}
    151 	log = ""
    152 
    153 	if s := g("1") + h("2"); log != "g(1)h(2)" || s != "12" {
    154 		println("expecting g1h2 and 12, got ", log, " and ", s)
    155 		err++
    156 	}
    157 	log = ""
    158 
    159 	if s := h("1") + g("2"); log != "h(1)g(2)" || s != "12" {
    160 		println("expecting h1g2 and 12, got ", log, " and ", s)
    161 		err++
    162 	}
    163 	log = ""
    164 
    165 	if s := h("1") + h("2"); log != "h(1)h(2)" || s != "12" {
    166 		println("expecting h1h2 and 12, got ", log, " and ", s)
    167 		err++
    168 	}
    169 	log = ""
    170 	
    171 	x := 0
    172 	switch x {
    173 	case 0:
    174 		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
    175 			println("in switch, expecting a(1)a(2)a(3) , got ", log)
    176 			err++
    177 		}
    178 		log = ""
    179 	
    180 		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
    181 			println("in switch, expecting a(1)b(2)a(2), got ", log)
    182 			err++
    183 		}
    184 		log = ""
    185 		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
    186 			println("in switch, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
    187 			err++
    188 		}
    189 		log = ""
    190 		var i I = T1(0)
    191 		if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    192 			println("in switch, expecting a(6)ba(7)ba(8)ba(9), got", log)
    193 			err++
    194 		}
    195 		log = ""
    196 	}
    197 	
    198 	c := make(chan int, 1)
    199 	c <- 1
    200 	select {
    201 	case c <- 0:
    202 	case c <- 1:
    203 	case <-c:
    204 		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
    205 			println("in select1, expecting a(1)a(2)a(3) , got ", log)
    206 			err++
    207 		}
    208 		log = ""
    209 	
    210 		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
    211 			println("in select1, expecting a(1)b(2)a(2), got ", log)
    212 			err++
    213 		}
    214 		log = ""
    215 		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
    216 			println("in select1, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
    217 			err++
    218 		}
    219 		log = ""
    220 		var i I = T1(0)
    221 		if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    222 			println("in select1, expecting a(6)ba(7)ba(8)ba(9), got", log)
    223 			err++
    224 		}
    225 		log = ""
    226 	}
    227 
    228 	c <- 1
    229 	select {
    230 	case <-c:
    231 		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
    232 			println("in select2, expecting a(1)a(2)a(3) , got ", log)
    233 			err++
    234 		}
    235 		log = ""
    236 	
    237 		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
    238 			println("in select2, expecting a(1)b(2)a(2), got ", log)
    239 			err++
    240 		}
    241 		log = ""
    242 		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
    243 			println("in select2, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
    244 			err++
    245 		}
    246 		log = ""
    247 		var i I = T1(0)
    248 		if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    249 			println("in select2, expecting a(6)ba(7)ba(8)ba(9), got", log)
    250 			err++
    251 		}
    252 		log = ""
    253 	}
    254 
    255 	c <- 1
    256 	select {
    257 	default:
    258 	case c<-1:
    259 	case <-c:
    260 		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
    261 			println("in select3, expecting a(1)a(2)a(3) , got ", log)
    262 			err++
    263 		}
    264 		log = ""
    265 	
    266 		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
    267 			println("in select3, expecting a(1)b(2)a(2), got ", log)
    268 			err++
    269 		}
    270 		log = ""
    271 		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
    272 			println("in select3, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
    273 			err++
    274 		}
    275 		log = ""
    276 		var i I = T1(0)
    277 		if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    278 			println("in select3, expecting a(6)ba(7)ba(8)ba(9), got", log)
    279 			err++
    280 		}
    281 		log = ""
    282 	}
    283 
    284 	c <- 1
    285 	select {
    286 	default:
    287 	case <-c:
    288 		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
    289 			println("in select4, expecting a(1)a(2)a(3) , got ", log)
    290 			err++
    291 		}
    292 		log = ""
    293 	
    294 		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
    295 			println("in select4, expecting a(1)b(2)a(2), got ", log)
    296 			err++
    297 		}
    298 		log = ""
    299 		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
    300 			println("in select4, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
    301 			err++
    302 		}
    303 		log = ""
    304 		var i I = T1(0)
    305 		if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    306 			println("in select4, expecting a(6)ba(7)ba(8)ba(9), got", log)
    307 			err++
    308 		}
    309 		log = ""
    310 	}
    311 
    312 	select {
    313 	case <-c:
    314 	case <-c:
    315 	default:
    316 		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
    317 			println("in select5, expecting a(1)a(2)a(3) , got ", log)
    318 			err++
    319 		}
    320 		log = ""
    321 	
    322 		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
    323 			println("in select5, expecting a(1)b(2)a(2), got ", log)
    324 			err++
    325 		}
    326 		log = ""
    327 		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
    328 			println("in select5, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
    329 			err++
    330 		}
    331 		log = ""
    332 		var i I = T1(0)
    333 		if i.a("6").a(i.b("7")).a(i.b("8")).a(i.b("9")); log != "a(6)b(7)a(7)b(8)a(8)b(9)a(9)" {
    334 			println("in select5, expecting a(6)ba(7)ba(8)ba(9), got", log)
    335 			err++
    336 		}
    337 		log = ""
    338 	}
    339 
    340 	if err > 0 {
    341 		panic("fail")
    342 	}
    343 }
    344