diff options
author | Ian Lance Taylor <iant@golang.org> | 2014-06-02 12:55:43 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2014-06-02 12:55:43 -0700 |
commit | a697cd6c3b8bc2b4ee10c89176108f085a059560 (patch) | |
tree | 9b54e81219af2618963d739fff2e3f2d77ba4a9a /src/cmd/cgo | |
parent | 40a6a08802a1b4c7beeaa56a3e460c0328b2cb21 (diff) | |
download | go-a697cd6c3b8bc2b4ee10c89176108f085a059560.tar.gz |
cmd/cgo: use same Go type for typedef to anonymous struct
If we see a typedef to an anonymous struct more than once,
presumably in two different Go files that import "C", use the
same Go type name.
Fixes issue 8133.
LGTM=rsc
R=rsc
CC=golang-codereviews
https://codereview.appspot.com/102080043
Diffstat (limited to 'src/cmd/cgo')
-rw-r--r-- | src/cmd/cgo/gcc.go | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index e403f6f51..0160b4b90 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1269,7 +1269,8 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { sub := c.Type(dt.Type, pos) t.Size = sub.Size t.Align = sub.Align - if _, ok := typedef[name.Name]; !ok { + oldType := typedef[name.Name] + if oldType == nil { tt := *t tt.Go = sub.Go typedef[name.Name] = &tt @@ -1281,6 +1282,15 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type { // In -godefs and -cdefs mode, do this for all typedefs. if isStructUnionClass(sub.Go) || *godefs || *cdefs { t.Go = sub.Go + + // If we've seen this typedef before, and it + // was an anonymous struct/union/class before + // too, use the old definition. + // TODO: it would be safer to only do this if + // we verify that the types are the same. + if oldType != nil && isStructUnionClass(oldType.Go) { + t.Go = oldType.Go + } } case *dwarf.UcharType: |