modernc.org/gc@v1.0.1-0.20240304020402-f0dba7c97c2b/testdata/errchk/test/devirt.go (about)

     1  // errorcheck -0 -d=ssa/opt/debug=3
     2  
     3  package main
     4  
     5  // Trivial interface call devirtualization test.
     6  
     7  type real struct {
     8  	value int
     9  }
    10  
    11  func (r *real) Value() int { return r.value }
    12  
    13  type Valuer interface {
    14  	Value() int
    15  }
    16  
    17  type indirectiface struct {
    18  	a, b, c int
    19  }
    20  
    21  func (i indirectiface) Value() int {
    22  	return i.a + i.b + i.c
    23  }
    24  
    25  func main() {
    26  	var r Valuer
    27  	rptr := &real{value: 3}
    28  	r = rptr
    29  
    30  	if r.Value() != 3 { // ERROR "de-virtualizing call$"
    31  		panic("not 3")
    32  	}
    33  
    34  	// Can't do types that aren't "direct" interfaces (yet).
    35  	r = indirectiface{3, 4, 5}
    36  	if r.Value() != 12 {
    37  		panic("not 12")
    38  	}
    39  }