From f4aa021985e9ae4a9a395f8fbe32ad08d2bfda3b Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Wed, 26 Jan 2022 13:26:45 -0800 Subject: cmd/compile: support structural typing in unified IR This CL updates unified IR to look at the structural type of a composite literal type, rather than merely the underlying type, to determine if it's a structure. This fixes a number of currently failing regress test cases. Updates #50833. Change-Id: I11c040c77ec86c23e8ffefcf1ce1aed548687dc5 Reviewed-on: https://go-review.googlesource.com/c/go/+/381074 Run-TryBot: Matthew Dempsky TryBot-Result: Gopher Robot Trust: Matthew Dempsky Reviewed-by: Robert Griesemer --- src/cmd/compile/internal/noder/writer.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/cmd/compile/internal/noder') diff --git a/src/cmd/compile/internal/noder/writer.go b/src/cmd/compile/internal/noder/writer.go index 2bb0b4d5d7..73f2df8e39 100644 --- a/src/cmd/compile/internal/noder/writer.go +++ b/src/cmd/compile/internal/noder/writer.go @@ -1218,6 +1218,7 @@ func (w *writer) expr(expr syntax.Expr) { } obj := obj.(*types2.Var) + assert(!obj.IsField()) assert(targs.Len() == 0) w.code(exprLocal) @@ -1337,10 +1338,11 @@ func (w *writer) compLit(lit *syntax.CompositeLit) { w.typ(tv.Type) typ := tv.Type + // TODO(mdempsky): Use types2.StructuralType here too? See #50833. if ptr, ok := typ.Underlying().(*types2.Pointer); ok { typ = ptr.Elem() } - str, isStruct := typ.Underlying().(*types2.Struct) + str, isStruct := types2.StructuralType(typ).(*types2.Struct) w.len(len(lit.ElemList)) for i, elem := range lit.ElemList { -- cgit v1.3-5-g9baa