github.com/sean-/go@v0.0.0-20151219100004-97f854cd7bb6/test/reorder2.go (about)

     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  }