1
0
mirror of https://github.com/golang/go synced 2024-11-11 19:21:37 -07:00

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 <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Trust: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Matthew Dempsky 2022-01-26 13:26:45 -08:00
parent db48840cfc
commit f4aa021985
2 changed files with 3 additions and 5 deletions

View File

@ -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 {

View File

@ -2167,7 +2167,6 @@ var unifiedFailures = setOf(
"fixedbugs/issue42284.go", // prints "T(0) does not escape", but test expects "a.I(a.T(0)) does not escape"
"fixedbugs/issue7921.go", // prints "… escapes to heap", but test expects "string(…) escapes to heap"
"typeparam/issue48538.go", // assertion failure, interprets struct key as closure variable
"typeparam/issue47631.go", // unified IR can handle local type declarations
"fixedbugs/issue42058a.go", // unified IR doesn't report channel element too large
"fixedbugs/issue42058b.go", // unified IR doesn't report channel element too large
@ -2178,10 +2177,7 @@ var unifiedFailures = setOf(
"typeparam/typeswitch2.go", // duplicate case failure due to stenciling
"typeparam/typeswitch3.go", // duplicate case failure due to stenciling
"typeparam/typeswitch4.go", // duplicate case failure due to stenciling
"typeparam/issue50417b.go", // Need to handle field access on a type param
"typeparam/issue50552.go", // gives missing method for instantiated type
"typeparam/absdiff2.go", // wrong assertion about closure variables
"typeparam/absdiffimp2.go", // wrong assertion about closure variables
)
func setOf(keys ...string) map[string]bool {