mirror of
https://github.com/golang/go
synced 2024-11-14 17:40:28 -07:00
7e2487cf65
If the expression type is a single compile-time known type, use that type instead of the dynamic one, so the later passes of the compiler could skip un-necessary runtime calls. Thanks Youlin Feng for writing the original test case. Change-Id: I3f65ab90f041474a9731338a82136c1d394c1773 Reviewed-on: https://go-review.googlesource.com/c/go/+/616975 Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
48 lines
712 B
Go
48 lines
712 B
Go
// asmcheck
|
|
|
|
// Copyright 2024 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.
|
|
|
|
package codegen
|
|
|
|
type Ix interface {
|
|
X()
|
|
}
|
|
|
|
type Iy interface {
|
|
Y()
|
|
}
|
|
|
|
type Iz interface {
|
|
Z()
|
|
}
|
|
|
|
func swXYZ(a Ix) {
|
|
switch t := a.(type) {
|
|
case Iy: // amd64:-".*typeAssert"
|
|
t.Y()
|
|
case Iz: // amd64:-".*typeAssert"
|
|
t.Z()
|
|
}
|
|
}
|
|
|
|
type Ig[T any] interface {
|
|
G() T
|
|
}
|
|
|
|
func swGYZ[T any](a Ig[T]) {
|
|
switch t := a.(type) {
|
|
case Iy: // amd64:-".*typeAssert"
|
|
t.Y()
|
|
case Iz: // amd64:-".*typeAssert"
|
|
t.Z()
|
|
case interface{ G() T }: // amd64:-".*typeAssert",".*assertE2I"
|
|
t.G()
|
|
}
|
|
}
|
|
|
|
func swCaller() {
|
|
swGYZ[int]((Ig[int])(nil))
|
|
}
|