diff --git a/unused/testdata/src/typeparams/typeparams.go b/unused/testdata/src/typeparams/typeparams.go index 5e1eb636..310d0718 100644 --- a/unused/testdata/src/typeparams/typeparams.go +++ b/unused/testdata/src/typeparams/typeparams.go @@ -89,3 +89,17 @@ func fn11[T ~struct{ Field int }]() { // unused // don't crash because of the composite literal _ = T{Field: 42} } + +type convertGeneric1 struct { // used + field int // used +} + +type convertGeneric2 struct { // used + field int // used +} + +var _ = convertGeneric1{}.field // mark field as used + +func Fn12[T1 convertGeneric1, T2 convertGeneric2](a T1) { // used + _ = T2(a) // conversion marks T2.field as used +} diff --git a/unused/unused.go b/unused/unused.go index adec4992..3d69dbb6 100644 --- a/unused/unused.go +++ b/unused/unused.go @@ -1662,8 +1662,8 @@ func (g *graph) instructions(fn *ir.Function) { case *ir.ChangeType: // conversion type handled generically - s1, ok1 := typeutil.Dereference(instr.Type()).Underlying().(*types.Struct) - s2, ok2 := typeutil.Dereference(instr.X.Type()).Underlying().(*types.Struct) + s1, ok1 := typeutil.CoreType(typeutil.Dereference(instr.Type())).(*types.Struct) + s2, ok2 := typeutil.CoreType(typeutil.Dereference(instr.X.Type())).(*types.Struct) if ok1 && ok2 { // Converting between two structs. The fields are // relevant for the conversion, but only if the