// 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")
	}
}
