mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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 <iant@golang.org> Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
3be166dc70
commit
689947d565
2 changed files with 12 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue