From 689947d5652e51980fbfc7b350871fe2baa06a74 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 1 Nov 2016 14:13:34 -0700 Subject: [PATCH] cmd/cgo: only record typedef name for pointer to struct In a function argument, we handle a typedef for a pointer specially, using the pointer type rather than the typedef, to permit the Go calls to match the laxer type conversions permitted in C. We record the typedef so that we use that type in the C code, in case it has a special attribute. However, using the typedef is wrong when using a pointer to a basic type, because the C code may sometimes use the typedef and sometimes not, and using the typedef in all cases will cause incorrect type errors on the Go side. Fortunately we only really need to use the typedef when pointing to a struct/union/class, and in such a case confusion is unlikely. Fixes #17723. Change-Id: Id2eaeb156faeaf2e8eb9cf0b8f95b44caf8cfbd2 Reviewed-on: https://go-review.googlesource.com/32536 Run-TryBot: Ian Lance Taylor Reviewed-by: David Crawshaw --- misc/cgo/test/api.go | 6 ++++++ src/cmd/cgo/gcc.go | 9 ++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/misc/cgo/test/api.go b/misc/cgo/test/api.go index b4ae3dda4b..d2b09cbeff 100644 --- a/misc/cgo/test/api.go +++ b/misc/cgo/test/api.go @@ -7,6 +7,11 @@ package cgotest // #include +// +// // Test for issue 17723. +// typedef char *cstring_pointer; +// static void cstring_pointer_fun(cstring_pointer dummy) { } +// // const char *api_hello = "hello!"; import "C" import "unsafe" @@ -21,4 +26,5 @@ func testAPI() { var b []byte b = C.GoBytes(unsafe.Pointer(C.api_hello), C.int(6)) _, _ = s, b + C.cstring_pointer_fun(nil) } diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 450120f83c..de87df0798 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1937,9 +1937,12 @@ func (c *typeConv) FuncArg(dtype dwarf.Type, pos token.Pos) *Type { return nil } - // Remember the C spelling, in case the struct - // has __attribute__((unavailable)) on it. See issue 2888. - t.Typedef = dt.Name + // For a struct/union/class, remember the C spelling, + // in case it has __attribute__((unavailable)). + // See issue 2888. + if isStructUnionClass(t.Go) { + t.Typedef = dt.Name + } } } return t -- 2.48.1