diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2020-06-26 11:26:33 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2020-06-26 19:00:25 +0000 |
| commit | a295d59d10d87ea882ddc8db6919a278b3a67d01 (patch) | |
| tree | adf7d0eee53dd770ec7f45a4629269cabbc2a951 | |
| parent | 3c474d4164990c10c48c2b881211b6af95058be9 (diff) | |
| download | go-a295d59d10d87ea882ddc8db6919a278b3a67d01.tar.xz | |
cmd/cgo: prevent redeclaration of _Ctype_void when C.void is used
CL 230037 changed cmd/cgo to emit "type _Ctype_foo = bar" aliases for
all C.foo types mentioned in the original Go source files. However,
cmd/cgo already emits an appropriate type definition for _Ctype_void.
So if a source file explicitly mentions C.void, this resulted in
_Ctype_void being declared multiple times.
This CL fixes the issue by suppressing the "type _Ctype_void =
_Ctype_void" alias before printing it. This should be safe because
_Ctype_void is the only type that's specially emitted in out.go at the
moment.
A somewhat better fix might be to fix how _Ctype_void is declared in
the cmd/cgo "frontend", but this is a less invasive fix.
Fixes #39877.
Change-Id: Ief264b3847c8ef8df1478a6333647ff2cf09b63d
Reviewed-on: https://go-review.googlesource.com/c/go/+/240180
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
| -rw-r--r-- | misc/cgo/test/test.go | 4 | ||||
| -rw-r--r-- | src/cmd/cgo/out.go | 5 |
2 files changed, 9 insertions, 0 deletions
diff --git a/misc/cgo/test/test.go b/misc/cgo/test/test.go index b5009d43ce..8c69ad91ac 100644 --- a/misc/cgo/test/test.go +++ b/misc/cgo/test/test.go @@ -2200,3 +2200,7 @@ func test32579(t *testing.T) { // issue 38649 var issue38649 C.netbsd_gid = 42 + +// issue 39877 + +var issue39877 *C.void = nil diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 6b40a255d5..6c221473e0 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -98,6 +98,11 @@ func (p *Package) writeDefs() { typedefNames := make([]string, 0, len(typedef)) for name := range typedef { + if name == "_Ctype_void" { + // We provide an appropriate declaration for + // _Ctype_void below (#39877). + continue + } typedefNames = append(typedefNames, name) } sort.Strings(typedefNames) |
