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