diff options
Diffstat (limited to 'test/devirt.go')
-rw-r--r-- | test/devirt.go | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/test/devirt.go b/test/devirt.go new file mode 100644 index 0000000..e0149d8 --- /dev/null +++ b/test/devirt.go @@ -0,0 +1,39 @@ +// 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") + } +} |