// compile

//go:build !wasm
// +build !wasm

// Copyright 2021 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 genChecker0

var FailCount int

//go:noinline
func NoteFailure(fidx int, pkg string, pref string, parmNo int, _ uint64) {
	FailCount += 1
	if FailCount > 10 {
		panic("bad")
	}
}

//go:noinline
func NoteFailureElem(fidx int, pkg string, pref string, parmNo int, elem int, _ uint64) {
	FailCount += 1
	if FailCount > 10 {
		panic("bad")
	}
}

type StructF0S0 struct {
	F0 int16
	F1 string
	F2 StructF0S1
}

type StructF0S1 struct {
	_ uint16
}

// 0 returns 3 params
//go:registerparams
//go:noinline
func Test0(p0 uint32, p1 StructF0S0, p2 int32) {
	// consume some stack space, so as to trigger morestack
	var pad [256]uint64
	pad[FailCount]++
	if p0 == 0 {
		return
	}
	p1f0c := int16(-3096)
	if p1.F0 != p1f0c {
		NoteFailureElem(0, "genChecker0", "parm", 1, 0, pad[0])
		return
	}
	p1f1c := "f6ꂅ8ˋ<"
	if p1.F1 != p1f1c {
		NoteFailureElem(0, "genChecker0", "parm", 1, 1, pad[0])
		return
	}
	p1f2c := StructF0S1{}
	if p1.F2 != p1f2c {
		NoteFailureElem(0, "genChecker0", "parm", 1, 2, pad[0])
		return
	}
	p2f0c := int32(496713155)
	if p2 != p2f0c {
		NoteFailureElem(0, "genChecker0", "parm", 2, 0, pad[0])
		return
	}
	// recursive call
	Test0(p0-1, p1, p2)
	return
	// 0 addr-taken params, 0 addr-taken returns
}
