Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot run embedded + generic code #1571

Closed
zbysir opened this issue Jun 27, 2023 · 3 comments · Fixed by #1572
Closed

Cannot run embedded + generic code #1571

zbysir opened this issue Jun 27, 2023 · 3 comments · Fixed by #1572

Comments

@zbysir
Copy link
Contributor

zbysir commented Jun 27, 2023

The following program sample.go triggers an unexpected result

package main

type A struct {
	*b[string]
}

type b[T any] struct {
	data T
}

func main() {
  a := &A{
    b: &b[string]{},
  }

  _ = a
}

Expected result

// Nothing happend, it works fine.

Got

run: ./sample.go:13:3: unknown field b in struct literal

Yaegi Version

0.15.1

Additional Notes

Cannot run embedded + generic code, although they work in isolation.

@zbysir
Copy link
Contributor Author

zbysir commented Jun 27, 2023

Additional Note:

Both of the following pieces of code work fine:

type A struct {
	B *B[string]
}

type B[T any] struct {
	data T
}

a := &A{
	B: &B[string]{},
}
type A struct {
	*B
}

type B struct {
}

a := &A{
	B: &B{},
}

@zbysir
Copy link
Contributor Author

zbysir commented Jun 27, 2023

Maybe this "embedding" issue is related to #1502

@zbysir
Copy link
Contributor Author

zbysir commented Jun 27, 2023

This can be quickly fixed by modifying the fieldName method:

https://github.com/traefik/yaegi/blob/75e5f99bc5761d8e920e726f75932a31b6f06669/interp/type.go#L1227C1-L1238C2

func fieldName(n *node) string {
	switch n.kind {
	case selectorExpr:
		return fieldName(n.child[1])
	case starExpr:
		return fieldName(n.child[0])
	case identExpr:
		return n.ident
+	case indexExpr:
+		return fieldName(n.child[0])
	default:
		return ""
	}
}

But maybe this is not the most correct, because indexExpr seems to be the wrong kind.


Update: indexExpr is correct because go/ast is defined that way.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant