mirror of https://github.com/golang/go.git
cmd/compile: avoid compiler crash for recursive interface type
This change is a simple work-around to avoid a compiler crash and provide a reasonable error message. A future change should fix the root cause for this problem. Fixes #23823. Change-Id: Ifc80d9f4d35e063c378e54d5cd8d1cf4c0d2ec6a Reviewed-on: https://go-review.googlesource.com/c/go/+/175518 Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
49ad7bc67c
commit
dc0388c565
|
|
@ -172,7 +172,16 @@ func dowidth(t *types.Type) {
|
|||
if t.Width == -2 {
|
||||
if !t.Broke() {
|
||||
t.SetBroke(true)
|
||||
yyerrorl(asNode(t.Nod).Pos, "invalid recursive type %v", t)
|
||||
// t.Nod should not be nil here, but in some cases is appears to be
|
||||
// (see issue #23823). For now (temporary work-around) at a minimum
|
||||
// don't crash and provide a meaningful error message.
|
||||
// TODO(gri) determine the correct fix during a regular devel cycle
|
||||
// (see issue #31872).
|
||||
if t.Nod == nil {
|
||||
yyerror("invalid recursive type %v", t)
|
||||
} else {
|
||||
yyerrorl(asNode(t.Nod).Pos, "invalid recursive type %v", t)
|
||||
}
|
||||
}
|
||||
|
||||
t.Width = 0
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// compile
|
||||
// errorcheck
|
||||
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
|
|
@ -6,14 +6,10 @@
|
|||
|
||||
package p
|
||||
|
||||
// The compiler cannot handle this. Disabled for now.
|
||||
// See issue #25838.
|
||||
/*
|
||||
type I1 = interface {
|
||||
I2
|
||||
}
|
||||
|
||||
type I2 interface {
|
||||
type I2 interface { // ERROR "invalid recursive type"
|
||||
I1
|
||||
}
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue