Skip to content

Commit a295d59

Browse files
committed
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 golang#39877. Change-Id: Ief264b3847c8ef8df1478a6333647ff2cf09b63d Reviewed-on: https://go-review.googlesource.com/c/go/+/240180 Run-TryBot: Matthew Dempsky <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 3c474d4 commit a295d59

File tree

2 files changed

+9
-0
lines changed

2 files changed

+9
-0
lines changed

misc/cgo/test/test.go

+4
Original file line numberDiff line numberDiff line change
@@ -2200,3 +2200,7 @@ func test32579(t *testing.T) {
22002200
// issue 38649
22012201

22022202
var issue38649 C.netbsd_gid = 42
2203+
2204+
// issue 39877
2205+
2206+
var issue39877 *C.void = nil

src/cmd/cgo/out.go

+5
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ func (p *Package) writeDefs() {
9898

9999
typedefNames := make([]string, 0, len(typedef))
100100
for name := range typedef {
101+
if name == "_Ctype_void" {
102+
// We provide an appropriate declaration for
103+
// _Ctype_void below (#39877).
104+
continue
105+
}
101106
typedefNames = append(typedefNames, name)
102107
}
103108
sort.Strings(typedefNames)

0 commit comments

Comments
 (0)