1
0
mirror of https://github.com/golang/go synced 2024-11-08 13:56:21 -07:00
go/test/typeparam/mdempsky
Matthew Dempsky d6294e00f0 cmd/compile: fix devirtualization bug with unified IR
As a consistency check in devirtualization, when we determine `i` (of
interface type `I`) always has dynamic type `T`, we insert a type
assertion `i.(T)`. This emits an itab check for `go:itab.T,I`, but
it's always true (and so SSA optimizes it away).

However, if `I` is instead the generic interface type `I[T]`, then
`go:itab.T,I[int]` and `go:itab.T,I[go.shape.int]` are equivalent but
distinct itabs. And notably, we'll have originally created the
interface value using the former; but the (non-dynamic) TypeAssertExpr
created by devirtualization would ultimately emit a comparison against
the latter. This comparison would then evaluate false, leading to a
spurious type assertion panic at runtime.

The comparison is just meant as an extra safety check, so it should be
safe to just disable. But for now, it's simpler/safer to just punt on
devirtualization in this case. (The non-unified frontend doesn't
devirtualize this either.)

Change-Id: I6a8809bcfebc9571f32e289fa4bc6a8b0d21ca46
Reviewed-on: https://go-review.googlesource.com/c/go/+/424774
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Keith Randall <khr@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
2022-08-18 17:26:32 +00:00
..
1.dir
3.dir
4.dir
7.dir
8.dir
10.dir
12.dir
1.go
2.go
3.go
4.go
5.go
6.go
7.go
8.go
9.go
10.go
11.go
12.go
13.go
14.go
15.go
16.go
17.go
18.go
18.out
19.go test: add test case for type parameter method indexing 2022-08-08 17:39:25 +00:00
20.go test: test method expressions promoted to derived types 2022-08-09 16:42:12 +00:00
21.go cmd/compile: fix devirtualization bug with unified IR 2022-08-18 17:26:32 +00:00