1
0
mirror of https://github.com/golang/go synced 2024-09-23 23:20:14 -06:00

cmd/compile: fix "width not calculated" ICE

Expanding interface method sets is handled during width calculation,
which can't be performed concurrently. Make sure that we eagerly
expand interfaces in the frontend when importing them, even if they're
not actually used by code, because we might need to generate a type
description of them.

Fixes #25055.

Change-Id: I6fd2756de2c7d5dbc33056f70b3028ca3aebab41
Reviewed-on: https://go-review.googlesource.com/122517
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Matthew Dempsky 2018-07-06 12:14:22 -07:00
parent be1dfb0e1a
commit 8d5fd871d7
4 changed files with 42 additions and 0 deletions

View File

@ -296,8 +296,23 @@ func (r *importReader) doDecl(n *Node) {
// declaration before recursing.
t := importtype(r.p.ipkg, pos, n.Sym)
// We also need to defer width calculations until
// after the underlying type has been assigned.
//
// TODO(mdempsky): Add nesting support directly to
// {defer,resume}checkwidth? Width calculations are
// already deferred during initial typechecking, but
// not when we're expanding inline function bodies, so
// we currently need to handle both cases here.
deferring := defercalc != 0
if !deferring {
defercheckwidth()
}
underlying := r.typ()
copytype(typenod(t), underlying)
if !deferring {
resumecheckwidth()
}
if underlying.IsInterface() {
break
@ -576,6 +591,10 @@ func (r *importReader) typ1() *types.Type {
t := types.New(TINTER)
t.SetPkg(r.currPkg)
t.SetInterface(append(embeddeds, methods...))
// Ensure we expand the interface in the frontend (#25055).
checkwidth(t)
return t
}
}

View File

@ -0,0 +1,7 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package a
var A chan *interface{}

View File

@ -0,0 +1,9 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package b
import "./a"
var _ = <-a.A

View File

@ -0,0 +1,7 @@
// compiledir -c=2
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package ignored