go/test/devirt.go
Cherry Zhang 1b15c7f102 cmd/compile: debug rewrite
If -d=ssa/PASS/debug=N is specified (N >= 2) for a rewrite pass
(e.g. lower), when a Value (or Block) is rewritten, print the
Value (or Block) before and after.

For #31915.
Updates #19013.

Change-Id: I80eadd44302ae736bc7daed0ef68529ab7a16776
Reviewed-on: https://go-review.googlesource.com/c/go/+/176718
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
2020-04-13 21:56:15 +00:00

40 lines
599 B
Go

// errorcheck -0 -d=ssa/opt/debug=1
package main
// Trivial interface call devirtualization test.
type real struct {
value int
}
func (r *real) Value() int { return r.value }
type Valuer interface {
Value() int
}
type indirectiface struct {
a, b, c int
}
func (i indirectiface) Value() int {
return i.a + i.b + i.c
}
func main() {
var r Valuer
rptr := &real{value: 3}
r = rptr
if r.Value() != 3 { // ERROR "de-virtualizing call$"
panic("not 3")
}
// Can't do types that aren't "direct" interfaces (yet).
r = indirectiface{3, 4, 5}
if r.Value() != 12 {
panic("not 12")
}
}