Commit 13772edb authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: simplify exporting universal 'error' type

There shouldn't be any problems setting error's "Orig" (underlying)
type to a separate anonymous interface, as this is already how
go/types defines it.

Change-Id: I44e9c4048ffe362ce329e8306632e38b5ccfecff
Reviewed-on: https://go-review.googlesource.com/61790
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
Reviewed-by: default avatarAlan Donovan <adonovan@google.com>
parent 261a8d9a
...@@ -601,8 +601,6 @@ func isInlineable(n *Node) bool { ...@@ -601,8 +601,6 @@ func isInlineable(n *Node) bool {
return false return false
} }
var errorInterface *types.Type // lazily initialized
func (p *exporter) typ(t *types.Type) { func (p *exporter) typ(t *types.Type) {
if t == nil { if t == nil {
Fatalf("exporter: nil type") Fatalf("exporter: nil type")
...@@ -654,19 +652,7 @@ func (p *exporter) typ(t *types.Type) { ...@@ -654,19 +652,7 @@ func (p *exporter) typ(t *types.Type) {
p.qualifiedName(tsym) p.qualifiedName(tsym)
// write underlying type // write underlying type
orig := t.Orig p.typ(t.Orig)
if orig == types.Errortype {
// The error type is the only predeclared type which has
// a composite underlying type. When we encode that type,
// make sure to encode the underlying interface rather than
// the named type again. See also the comment in universe.go
// regarding the errortype and issue #15920.
if errorInterface == nil {
errorInterface = makeErrorInterface()
}
orig = errorInterface
}
p.typ(orig)
// interfaces don't have associated methods // interfaces don't have associated methods
if t.Orig.IsInterface() { if t.Orig.IsInterface() {
......
...@@ -385,10 +385,7 @@ func lexinit1() { ...@@ -385,10 +385,7 @@ func lexinit1() {
s := builtinpkg.Lookup("error") s := builtinpkg.Lookup("error")
types.Errortype = makeErrorInterface() types.Errortype = makeErrorInterface()
types.Errortype.Sym = s types.Errortype.Sym = s
// TODO: If we can prove that it's safe to set errortype.Orig here types.Errortype.Orig = makeErrorInterface()
// than we don't need the special errortype/errorInterface case in
// bexport.go. See also issue #15920.
// errortype.Orig = makeErrorInterface()
s.Def = asTypesNode(typenod(types.Errortype)) s.Def = asTypesNode(typenod(types.Errortype))
// We create separate byte and rune types for better error messages // We create separate byte and rune types for better error messages
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment