// run

// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test reorderings; derived from fixedbugs/bug294.go.

package main

var log string

type TT int

func (t TT) a(s string) TT {
	log += "a(" + s + ")"
	return t
}

func (TT) b(s string) string {
	log += "b(" + s + ")"
	return s
}

type F func(s string) F

func a(s string) F {
	log += "a(" + s + ")"
	return F(a)
}

func b(s string) string {
	log += "b(" + s + ")"
	return s
}

type I interface {
	a(s string) I
	b(s string) string
}

type T1 int

func (t T1) a(s string) I {
	log += "a(" + s + ")"
	return t
}

func (T1) b(s string) string {
	log += "b(" + s + ")"
	return s
}

// f(g(), h()) where g is not inlinable but h is will have the same problem.
// As will x := g() + h() (same conditions).
// And g() <- h().
func f(x, y string) {
	log += "f(" + x + ", " + y + ")"
}

//go:noinline
func ff(x, y string) {
	log += "ff(" + x + ", " + y + ")"
}

func h(x string) string {
	log += "h(" + x + ")"
	return x
}

//go:noinline
func g(x string) string {
	log += "g(" + x + ")"
	return x
}

func main() {
	err := 0
	var t TT
	if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
		println("expecting a(1)a(2)a(3) , got ", log)
		err++
	}
	log = ""

	if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
		println("expecting a(1)b(2)a(2), got ", log)
		err++
	}
	log = ""
	if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
		println("expecting a(3)b(4)a(4)b(5)a(5), got ", log)
		err++
	}
	log = ""
	var i I = T1(0)
	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)" {
		println("expecting a(6)ba(7)ba(8)ba(9), got", log)
		err++
	}
	log = ""

	if s := t.a("1").b("3"); log != "a(1)b(3)" || s != "3" {
		println("expecting a(1)b(3) and 3, got ", log, " and ", s)
		err++
	}
	log = ""

	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" {
		println("expecting a(1)b(2)a(2)b(3)a(4)b(5) and 35, got ", log, " and ", s)
		err++
	}
	log = ""

	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" {
		println("expecting a(4)b(5)a(1)b(2)a(2)b(3) and 35, got ", log, " and ", s)
		err++
	}
	log = ""

	if ff(g("1"), g("2")); log != "g(1)g(2)ff(1, 2)" {
		println("expecting g(1)g(2)ff..., got ", log)
		err++
	}
	log = ""

	if ff(g("1"), h("2")); log != "g(1)h(2)ff(1, 2)" {
		println("expecting g(1)h(2)ff..., got ", log)
		err++
	}
	log = ""

	if ff(h("1"), g("2")); log != "h(1)g(2)ff(1, 2)" {
		println("expecting h(1)g(2)ff..., got ", log)
		err++
	}
	log = ""

	if ff(h("1"), h("2")); log != "h(1)h(2)ff(1, 2)" {
		println("expecting h(1)h(2)ff..., got ", log)
		err++
	}
	log = ""

	if s := g("1") + g("2"); log != "g(1)g(2)" || s != "12" {
		println("expecting g1g2 and 12, got ", log, " and ", s)
		err++
	}
	log = ""

	if s := g("1") + h("2"); log != "g(1)h(2)" || s != "12" {
		println("expecting g1h2 and 12, got ", log, " and ", s)
		err++
	}
	log = ""

	if s := h("1") + g("2"); log != "h(1)g(2)" || s != "12" {
		println("expecting h1g2 and 12, got ", log, " and ", s)
		err++
	}
	log = ""

	if s := h("1") + h("2"); log != "h(1)h(2)" || s != "12" {
		println("expecting h1h2 and 12, got ", log, " and ", s)
		err++
	}
	log = ""

	x := 0
	switch x {
	case 0:
		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
			println("in switch, expecting a(1)a(2)a(3) , got ", log)
			err++
		}
		log = ""

		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
			println("in switch, expecting a(1)b(2)a(2), got ", log)
			err++
		}
		log = ""
		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
			println("in switch, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
			err++
		}
		log = ""
		var i I = T1(0)
		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)" {
			println("in switch, expecting a(6)ba(7)ba(8)ba(9), got", log)
			err++
		}
		log = ""
	}

	c := make(chan int, 1)
	c <- 1
	select {
	case c <- 0:
	case c <- 1:
	case <-c:
		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
			println("in select1, expecting a(1)a(2)a(3) , got ", log)
			err++
		}
		log = ""

		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
			println("in select1, expecting a(1)b(2)a(2), got ", log)
			err++
		}
		log = ""
		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
			println("in select1, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
			err++
		}
		log = ""
		var i I = T1(0)
		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)" {
			println("in select1, expecting a(6)ba(7)ba(8)ba(9), got", log)
			err++
		}
		log = ""
	}

	c <- 1
	select {
	case <-c:
		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
			println("in select2, expecting a(1)a(2)a(3) , got ", log)
			err++
		}
		log = ""

		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
			println("in select2, expecting a(1)b(2)a(2), got ", log)
			err++
		}
		log = ""
		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
			println("in select2, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
			err++
		}
		log = ""
		var i I = T1(0)
		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)" {
			println("in select2, expecting a(6)ba(7)ba(8)ba(9), got", log)
			err++
		}
		log = ""
	}

	c <- 1
	select {
	default:
	case c <- 1:
	case <-c:
		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
			println("in select3, expecting a(1)a(2)a(3) , got ", log)
			err++
		}
		log = ""

		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
			println("in select3, expecting a(1)b(2)a(2), got ", log)
			err++
		}
		log = ""
		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
			println("in select3, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
			err++
		}
		log = ""
		var i I = T1(0)
		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)" {
			println("in select3, expecting a(6)ba(7)ba(8)ba(9), got", log)
			err++
		}
		log = ""
	}

	c <- 1
	select {
	default:
	case <-c:
		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
			println("in select4, expecting a(1)a(2)a(3) , got ", log)
			err++
		}
		log = ""

		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
			println("in select4, expecting a(1)b(2)a(2), got ", log)
			err++
		}
		log = ""
		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
			println("in select4, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
			err++
		}
		log = ""
		var i I = T1(0)
		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)" {
			println("in select4, expecting a(6)ba(7)ba(8)ba(9), got", log)
			err++
		}
		log = ""
	}

	select {
	case <-c:
	case <-c:
	default:
		if a("1")("2")("3"); log != "a(1)a(2)a(3)" {
			println("in select5, expecting a(1)a(2)a(3) , got ", log)
			err++
		}
		log = ""

		if t.a("1").a(t.b("2")); log != "a(1)b(2)a(2)" {
			println("in select5, expecting a(1)b(2)a(2), got ", log)
			err++
		}
		log = ""
		if a("3")(b("4"))(b("5")); log != "a(3)b(4)a(4)b(5)a(5)" {
			println("in select5, expecting a(3)b(4)a(4)b(5)a(5), got ", log)
			err++
		}
		log = ""
		var i I = T1(0)
		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)" {
			println("in select5, expecting a(6)ba(7)ba(8)ba(9), got", log)
			err++
		}
		log = ""
	}

	if err > 0 {
		panic("fail")
	}
}
