mirror of
https://github.com/golang/go
synced 2024-11-22 16:34:47 -07:00
61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
|
// run
|
||
|
|
||
|
// Copyright 2023 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.
|
||
|
|
||
|
// Some derived-type expressions require the compiler to synthesize
|
||
|
// function literals to plumb sub-dictionaries appropriately.
|
||
|
// However, when these expressions are inlined, we were constructing
|
||
|
// the function literal bodies with the inline-adjusted positions
|
||
|
// instead of the original (inline-free) positions, which could lead
|
||
|
// to infinite loops when unwinding the stack.
|
||
|
|
||
|
package main
|
||
|
|
||
|
import "runtime"
|
||
|
|
||
|
func assert[_ any]() {
|
||
|
panic(0)
|
||
|
}
|
||
|
|
||
|
func Assert[To any]() func() {
|
||
|
return assert[To]
|
||
|
}
|
||
|
|
||
|
type asserter[_ any] struct{}
|
||
|
|
||
|
func (asserter[_]) assert() {
|
||
|
panic(0)
|
||
|
}
|
||
|
|
||
|
func AssertMV[To any]() func() {
|
||
|
return asserter[To]{}.assert
|
||
|
}
|
||
|
|
||
|
func AssertME[To any]() func(asserter[To]) {
|
||
|
return asserter[To].assert
|
||
|
}
|
||
|
|
||
|
var me = AssertME[string]()
|
||
|
|
||
|
var tests = []func(){
|
||
|
Assert[int](),
|
||
|
AssertMV[int](),
|
||
|
func() { me(asserter[string]{}) },
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
for _, test := range tests {
|
||
|
func() {
|
||
|
defer func() {
|
||
|
recover()
|
||
|
|
||
|
// Check that we can unwind the stack without infinite looping.
|
||
|
runtime.Caller(1000)
|
||
|
}()
|
||
|
test()
|
||
|
}()
|
||
|
}
|
||
|
}
|