traefik / yaegi

Yaegi is Another Elegant Go Interpreter
https://pkg.go.dev/github.com/traefik/yaegi
Apache License 2.0
7.02k stars 349 forks source link

Yaegi does not check embedded type methods when casting to interface #1549

Open karelorigin opened 1 year ago

karelorigin commented 1 year ago

The following program sample.go triggers an unexpected result

package main

import "fmt"

type Interface interface {
    Say()
}

type sayer struct {
    Interface
}

func (s sayer) Say() {
    fmt.Println("Hello there!")
}

type derived struct {
    sayer
}

func Cast(v interface{}) (Interface, error) {
    i, ok := v.(Interface)
    if !ok {
        return nil, fmt.Errorf("type %T does not implement Interface", v)
    }

    return i, nil
}

func run() error {
    i, err := Cast(derived{})
    if err != nil {
        return err
    }

    i.Say()

    return nil
}

func main() {
    if err := run(); err != nil {
        fmt.Println("A fatal error occured:", err)
    }
}

Expected result

$ go run cast-issue.go
// Hello there!

Got

$ yaegi ./cast-issue.go
// A fatal error occured: type struct { Xsayer struct { Interface interp.valueInterface } } does not implement Interface

Yaegi Version

68a430f

Additional Notes

No response