#1549·yaegi

Yaegi does not check embedded type methods when casting to interface

Author: kareloriginCreated May 4, 2023Updated Apr 2, 2026
Labelsbugarea/core

The following program sample.go triggers an unexpected result

go
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

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

Got

bash
$ 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