Commit dc0388c5 authored by Robert Griesemer's avatar Robert Griesemer

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/+/175518Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
parent 49ad7bc6
...@@ -172,7 +172,16 @@ func dowidth(t *types.Type) { ...@@ -172,7 +172,16 @@ func dowidth(t *types.Type) {
if t.Width == -2 { if t.Width == -2 {
if !t.Broke() { if !t.Broke() {
t.SetBroke(true) 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 t.Width = 0
......
// compile // errorcheck
// Copyright 2018 The Go Authors. All rights reserved. // Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style // Use of this source code is governed by a BSD-style
...@@ -6,14 +6,10 @@ ...@@ -6,14 +6,10 @@
package p package p
// The compiler cannot handle this. Disabled for now.
// See issue #25838.
/*
type I1 = interface { type I1 = interface {
I2 I2
} }
type I2 interface { type I2 interface { // ERROR "invalid recursive type"
I1 I1
} }
*/
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