compiler: add large aggregate IR tests

Add compiler coverage for large aggregate parameters and results,
including function values, interfaces, maps, channels, selects, deferred
calls, goroutines, phis, and multiple results.
This commit is contained in:
Jake Bailey
2026-07-14 07:07:24 -07:00
committed by Damian Gryski
parent bc35d087c2
commit 3b7c9e24f5
3 changed files with 566 additions and 0 deletions
+120
View File
@@ -0,0 +1,120 @@
package main
type largeValue [1025]byte
type largeStruct struct {
value [1025]byte
ptr *byte
}
type largeInterface interface {
makeLargeValue() largeValue
readLargeValue(largeValue) byte
}
type largeReceiver largeValue
func makeLargeValue(value byte) largeValue {
var result largeValue
result[len(result)-1] = value
return result
}
func makeZeroLargeValue() largeValue {
return largeValue{}
}
func passZeroLargeValue() byte {
return readLargeValue(largeValue{})
}
func readLargeValue(value largeValue) byte {
return value[len(value)-1]
}
func useLargeValue() byte {
return readLargeValue(makeLargeValue(42))
}
func useLargeFunctionValue(fn func(largeValue) byte) byte {
return fn(makeLargeValue(42))
}
func (receiver largeReceiver) makeLargeValue() largeValue {
return largeValue(receiver)
}
func (receiver largeReceiver) readLargeValue(value largeValue) byte {
return value[len(value)-1]
}
func useLargeInterface(value largeInterface) byte {
return value.readLargeValue(value.makeLargeValue())
}
func deferLargeValue(value largeValue) {
defer readLargeValue(value)
}
func goLargeValue(value largeValue) {
go readLargeValue(value)
}
func makeLargeResults(value byte) (largeValue, byte) {
return makeLargeValue(value), value
}
func makeTwoLargeResults(value byte) (largeValue, largeValue) {
return makeLargeValue(value), makeLargeValue(value + 1)
}
func makeMixedLargeResults(value byte) (largeValue, byte, largeValue) {
return makeLargeValue(value), value + 1, makeLargeValue(value + 2)
}
func chooseLargeValue(flag bool) largeValue {
value := makeLargeValue(1)
if flag {
value = makeLargeValue(42)
}
return value
}
func makePointerLargeValue(value *byte) largeStruct {
return largeStruct{ptr: value}
}
func assertLargeValue(value any) byte {
large, ok := value.(largeValue)
if !ok {
return 0
}
return large[len(large)-1]
}
func useLargeMap(key, value largeValue) byte {
values := map[largeValue]largeValue{key: value}
result, ok := values[key]
if !ok {
return 0
}
return result[len(result)-1]
}
func useLargeChannel(ch chan largeValue, value largeValue) byte {
ch <- value
result, ok := <-ch
if !ok {
return 0
}
return result[len(result)-1]
}
func selectLargeChannel(ch chan largeValue, value largeValue) byte {
select {
case ch <- value:
return 0
case result := <-ch:
return result[len(result)-1]
}
}