Skip to content

Commit

Permalink
cmd/gc: don't recurse infinitely when a recursive type references its…
Browse files Browse the repository at this point in the history
…elf more than once

Fixes golang#9432

Change-Id: I08c92481afa7c7fac890aa780efc1cb2fabad528
Reviewed-on: https://go-review.googlesource.com/2115
Reviewed-by: Josh Bleecher Snyder <[email protected]>
Reviewed-by: Russ Cox <[email protected]>
  • Loading branch information
minux committed Jan 12, 2015
1 parent 301ad79 commit fcff3ba
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/cmd/gc/align.c
Original file line number Diff line number Diff line change
Expand Up @@ -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++;

Expand Down
15 changes: 15 additions & 0 deletions test/fixedbugs/issue9432.go
Original file line number Diff line number Diff line change
@@ -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"

0 comments on commit fcff3ba

Please sign in to comment.