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>
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
-// compile
+// errorcheck
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
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
}
-*/