mirror of https://github.com/golang/go.git
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:
parent
301ad790a2
commit
fcff3ba740
|
|
@ -137,6 +137,11 @@ dowidth(Type *t)
|
||||||
return;
|
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
|
// defer checkwidth calls until after we're done
|
||||||
defercalc++;
|
defercalc++;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
Loading…
Reference in New Issue