mirror of
https://github.com/golang/go
synced 2024-11-08 13:56:21 -07:00
d6294e00f0
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> |
||
---|---|---|
.. | ||
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 | ||
20.go | ||
21.go |