cmd/gc: don't recurse infinitely when a recursive type references itself more than once

Fixes #9432

Change-Id: I08c92481afa7c7fac890aa780efc1cb2fabad528
Reviewed-on: https://go-review.googlesource.com/2115
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
Shenghou Ma 2014-12-23 17:14:04 -05:00 committed by Minux Ma
parent 301ad790a2
commit fcff3ba740
2 changed files with 20 additions and 0 deletions

View file

@ -137,6 +137,11 @@ dowidth(Type *t)
return;
}
// break infinite recursion if the broken recursive type
// is referenced again
if(t->broke && t->width == 0)
return;
// defer checkwidth calls until after we're done
defercalc++;

View file

@ -0,0 +1,15 @@
// errorcheck
// Copyright 2014 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.
// gc used to recurse infinitely when dowidth is applied
// to a broken recursive type again.
// See golang.org/issue/9432.
package p
type foo struct { // GCCGO_ERROR "invalid recursive type"
bar foo
blah foo
} // ERROR "invalid recursive type foo"