inline
package main

func a() {
  b()
}

func c() {
  b()
}

// execgen:inline
func b() {
  foo = bar
}
----
----
package main

func a() {
	{
		foo = bar
	}
}

func c() {
	{
		foo = bar
	}
}

// execgen:inline
const _ = "inlined_b"
----
----

inline
package main

func a() {
  b(x, b, y)
}

// execgen:inline
func b(a int, b int, c int) {
  foo = bar
}
----
----
package main

func a() {
	{
		var (
			a int = x
			c int = y
		)
		foo = bar
	}
}

// execgen:inline
const _ = "inlined_b"
----
----

inline
package main

func a() {
  ret1, ret2 := b(x, b, y)
}

func c() {
  ret3, ret4 := b(x, b, y)
}

func d() {
  b(x, b, y)
}

// execgen:inline
func b(a int, b int, c int) (int, int) {
  foo = bar
  return b, c
}
----
----
package main

func a() {
	var (
		ret1 int
		ret2 int
	)
	{
		var (
			__retval_0 int
			__retval_1 int
		)
		{
			var (
				a int = x
				c int = y
			)
			foo = bar
			{
				__retval_0 = b
				__retval_1 = c
			}
		}
		ret1, ret2 = __retval_0, __retval_1
	}
}

func c() {
	var (
		ret3 int
		ret4 int
	)
	{
		var (
			__retval_0 int
			__retval_1 int
		)
		{
			var (
				a int = x
				c int = y
			)
			foo = bar
			{
				__retval_0 = b
				__retval_1 = c
			}
		}
		ret3, ret4 = __retval_0, __retval_1
	}
}

func d() {
	{
		var (
			a int = x
			c int = y
		)
		foo = bar
	}
}

// execgen:inline
const _ = "inlined_b"
----
----

# Test early returns.
inline
package main

func a() {
  b()
  x = b()
}

// execgen:inline
func b() int {
  foo = bar
  if foo {
      return 2
  }
  foo = false
  return 3
}
----
----
package main

func a() {
	{
		foo = bar
		if foo {
			goto b_return_0
		}
		foo = false
	b_return_0:
		;
	}
	{
		var __retval_0 int
		{
			foo = bar
			if foo {
				{
					__retval_0 = 2
				}
				goto b_return_1
			}
			foo = false
			{
				__retval_0 = 3
			}
		b_return_1:
			;
		}
		x = __retval_0
	}
}

// execgen:inline
const _ = "inlined_b"
----
----

# Test chains of inlined functions.
inline
package main

func a() {
  b()
}

// execgen:inline
func b() {
  c()
}

// execgen:inline
func c() {
  foo = bar
}
----
----
package main

func a() {
	{
		{
			foo = bar
		}
	}
}

// execgen:inline
const _ = "inlined_b"

// execgen:inline
const _ = "inlined_c"
----
----

# Test that comments at call-site are preserved.
inline
package main

func a() {
	// This comment should not be removed.
  b()
  // This one too.
}

// execgen:inline
func b() {
  foo = bar
}
----
----
package main

func a() {
	// This comment should not be removed.
	{
		foo = bar
	}
	// This one too.
}

// execgen:inline
const _ = "inlined_b"
----
----
