package main

import (
	"fmt"
)

type MyStruct[T any] struct {
	value T
}

func (m *MyStruct[T]) Method() {
	fmt.Println("In generic method")
	genericFunc[T](m.value)
}

func genericFunc[T any](v T) {
	fmt.Println("In generic function")
	normalFunc()
}

func normalFunc() {
	fmt.Println("In normal function")
	panic("panic occurs here")
}

func main() {
	m := &MyStruct[string]{value: "hello"}
	m.Method()
}

//Expected:
// In generic method
// In generic function
// In normal function
// panic: panic occurs here

// [0x00C6D310 github.com/goplus/llgo/internal/runtime.Rethrow+0x2f, SP = 0x60]
// [0x00C6CF44 github.com/goplus/llgo/internal/runtime.Panic+0x2d, SP = 0x50]
// [0x00C69420 main.normalFunc+0xf, SP = 0xa8]
// [0x00C69564 main.genericFunc[string]+0x18, SP = 0x74]
// [0x00C694A8 main.(*MyStruct[string]).Method+0x1f, SP = 0x84]
// [0x00C6936C main+0x4, SP = 0x40]
