go dictionaryCapture-noinline 源码

  • 2022-07-15
  • 浏览 (880)

golang dictionaryCapture-noinline 代码

文件路径:/test/typeparam/dictionaryCapture-noinline.go

// run -gcflags="-l"

// Copyright 2021 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.

// Test situations where functions/methods are not
// immediately called and we need to capture the dictionary
// required for later invocation.

package main

func main() {
	functions()
	methodExpressions()
	methodValues()
	interfaceMethods()
	globals()
}

func g0[T any](x T) {
}
func g1[T any](x T) T {
	return x
}
func g2[T any](x T) (T, T) {
	return x, x
}

func functions() {
	f0 := g0[int]
	f0(7)
	f1 := g1[int]
	is7(f1(7))
	f2 := g2[int]
	is77(f2(7))
}

func is7(x int) {
	if x != 7 {
		println(x)
		panic("assertion failed")
	}
}
func is77(x, y int) {
	if x != 7 || y != 7 {
		println(x, y)
		panic("assertion failed")
	}
}

type s[T any] struct {
	a T
}

func (x s[T]) g0() {
}
func (x s[T]) g1() T {
	return x.a
}
func (x s[T]) g2() (T, T) {
	return x.a, x.a
}

func methodExpressions() {
	x := s[int]{a: 7}
	f0 := s[int].g0
	f0(x)
	f1 := s[int].g1
	is7(f1(x))
	f2 := s[int].g2
	is77(f2(x))
}

func methodValues() {
	x := s[int]{a: 7}
	f0 := x.g0
	f0()
	f1 := x.g1
	is7(f1())
	f2 := x.g2
	is77(f2())
}

var x interface {
	g0()
	g1() int
	g2() (int, int)
} = s[int]{a: 7}
var y interface{} = s[int]{a: 7}

func interfaceMethods() {
	x.g0()
	is7(x.g1())
	is77(x.g2())
	y.(interface{ g0() }).g0()
	is7(y.(interface{ g1() int }).g1())
	is77(y.(interface{ g2() (int, int) }).g2())
}

// Also check for instantiations outside functions.
var gg0 = g0[int]
var gg1 = g1[int]
var gg2 = g2[int]

var hh0 = s[int].g0
var hh1 = s[int].g1
var hh2 = s[int].g2

var xtop = s[int]{a: 7}
var ii0 = x.g0
var ii1 = x.g1
var ii2 = x.g2

func globals() {
	gg0(7)
	is7(gg1(7))
	is77(gg2(7))
	x := s[int]{a: 7}
	hh0(x)
	is7(hh1(x))
	is77(hh2(x))
	ii0()
	is7(ii1())
	is77(ii2())
}

相关信息

go 源码目录

相关文章

go absdiff 源码

go absdiff2 源码

go absdiff3 源码

go absdiffimp 源码

go absdiffimp2 源码

go adder 源码

go aliasimp 源码

go append 源码

go boundmethod 源码

go builtins 源码

0  赞