// Copyright 2022 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.

package a

import (
	"bytes"
	"fmt"
	"net/http"
)

type parent interface {
	n(f bool)
}

type yuh struct {
	a int
}

func (y *yuh) n(f bool) {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}

func a(i1 int, _ int, i3 int) int { // want "unused parameter: i2"
	i3 += i1
	_ = func(_ int) int { // want "unused parameter: z"
		_ = 1
		return 1
	}
	return i3
}

func b(_ bytes.Buffer) { // want "unused parameter: c"
	_ = 1
}

func z(h http.ResponseWriter, _ *http.Request) { // no report: func z is address-taken
	fmt.Println("Before")
}

func l(_ http.Handler) http.Handler { // want "unused parameter: h"
	return http.HandlerFunc(z)
}

func mult(a, _ int) int { // want "unused parameter: b"
	a += 1
	return a
}

func y(a int) {
	panic("yo")
}

var _ = func(x int) {} // empty body: no diagnostic

var _ = func(_ int) { println() } // want "unused parameter: x"

var (
	calledGlobal       = func(_ int) { println() } // want "unused parameter: x"
	addressTakenGlobal = func(x int) { println() } // no report: function is address-taken
)

func _() {
	calledGlobal(1)
	println(addressTakenGlobal)
}

func Exported(unused int) {} // no finding: an exported function may be address-taken

type T int

func (T) m(_ bool) { println() } // want "unused parameter: f"
func (T) n(f bool) { println() } // no finding: n may match the interface method parent.n

func _() {
	var fib func(x, y int) int
	fib = func(x, _ int) int { // want "unused parameter: y"
		if x < 2 {
			return x
		}
		return fib(x-1, 123) + fib(x-2, 456)
	}
	fib(10, 42)
}
