// 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() }() } }