diff options
author | David Symonds <dsymonds@golang.org> | 2014-06-03 11:18:01 +1000 |
---|---|---|
committer | David Symonds <dsymonds@golang.org> | 2014-06-03 11:18:01 +1000 |
commit | e82cde2d5dda33564904f2db04d3e68960bec384 (patch) | |
tree | 0e2c5e9cf4efc7240ff8d91dda03c544334d655c | |
parent | 4aea3f6fee166fa29115fd3f29469a35d5a12bce (diff) | |
download | go-e82cde2d5dda33564904f2db04d3e68960bec384.tar.gz go-e82cde2d5dda33564904f2db04d3e68960bec384.zip |
[release-branch.go1.3] cmd/cgo: use same Go type for typedef to anonymous struct
««« CL 102080043 / 256d975c53cb
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 #8133.
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/102080043
»»»
TBR=adg
CC=golang-codereviews
https://golang.org/cl/102100043
-rw-r--r-- | misc/cgo/test/issue8331.h | 7 | ||||
-rw-r--r-- | misc/cgo/test/issue8331a.go | 15 | ||||
-rw-r--r-- | misc/cgo/test/issue8331b.go | 13 | ||||
-rw-r--r-- | src/cmd/cgo/gcc.go | 12 |
4 files changed, 46 insertions, 1 deletions
diff --git a/misc/cgo/test/issue8331.h b/misc/cgo/test/issue8331.h new file mode 100644 index 0000000000..936ae9d5c1 --- /dev/null +++ b/misc/cgo/test/issue8331.h @@ -0,0 +1,7 @@ +// 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. + +typedef struct { + int i; +} issue8331; diff --git a/misc/cgo/test/issue8331a.go b/misc/cgo/test/issue8331a.go new file mode 100644 index 0000000000..7fa55be435 --- /dev/null +++ b/misc/cgo/test/issue8331a.go @@ -0,0 +1,15 @@ +// 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. + +// Issue 8331. A typedef of an unnamed struct is the same struct when +// #include'd twice. No runtime test; just make sure it compiles. + +package cgotest + +// #include "issue8331.h" +import "C" + +func issue8331a() C.issue8331 { + return issue8331Var +} diff --git a/misc/cgo/test/issue8331b.go b/misc/cgo/test/issue8331b.go new file mode 100644 index 0000000000..d52aed63e4 --- /dev/null +++ b/misc/cgo/test/issue8331b.go @@ -0,0 +1,13 @@ +// 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. + +// Issue 8331. A typedef of an unnamed struct is the same struct when +// #include'd twice. No runtime test; just make sure it compiles. + +package cgotest + +// #include "issue8331.h" +import "C" + +var issue8331Var C.issue8331 diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index e403f6f510..0160b4b900 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: |