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