mirror of
https://github.com/golang/go
synced 2024-09-06 00:19:45 +00:00
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;
|
||||
}
|
||||
|
||||
// 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++;
|
||||
|
||||
|
|
15
test/fixedbugs/issue9432.go
Normal file
15
test/fixedbugs/issue9432.go
Normal 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"
|
Loading…
Reference in a new issue