]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: allow embedding Type.Vargen into Sym.Name
authorMatthew Dempsky <mdempsky@google.com>
Fri, 11 Jun 2021 10:47:07 +0000 (03:47 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Fri, 11 Jun 2021 14:47:33 +0000 (14:47 +0000)
Unified IR currently works by hoisting local type definitions to
package scope, which requires giving them a unique name. Its current
solution is to directly embed the ·N suffix in Sym.Name, rather than
set Type.Vargen. This CL extends types/fmt.go to support trimming this
suffix again when appropriate.

Longer term, I want to revisit this hack, but this seemed like the
least invasive solution while also handling generics and local types.

Change-Id: If99fcdcc1e19e37d5887de3b021c256a3fe46b98
Reviewed-on: https://go-review.googlesource.com/c/go/+/327052
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
src/cmd/compile/internal/types/fmt.go

index cecd1b3cc1c0b07dda9360df70d6ef8d82d9472f..b4d1f6c8bbd900e3dc0e2c7a8cee751a7292851b 100644 (file)
@@ -324,7 +324,21 @@ func tconv2(b *bytes.Buffer, t *Type, verb rune, mode fmtMode, visited map[*Type
                        verb = 'v'
                }
 
-               sconv2(b, t.Sym(), verb, mode)
+               // In unified IR, function-scope defined types will have a ·N
+               // suffix embedded directly in their Name. Trim this off for
+               // non-fmtTypeID modes.
+               sym := t.Sym()
+               if mode != fmtTypeID {
+                       i := len(sym.Name)
+                       for i > 0 && sym.Name[i-1] >= '0' && sym.Name[i-1] <= '9' {
+                               i--
+                       }
+                       const dot = "·"
+                       if i >= len(dot) && sym.Name[i-len(dot):i] == dot {
+                               sym = &Sym{Pkg: sym.Pkg, Name: sym.Name[:i-len(dot)]}
+                       }
+               }
+               sconv2(b, sym, verb, mode)
 
                // TODO(mdempsky): Investigate including Vargen in fmtTypeIDName
                // output too. It seems like it should, but that mode is currently