aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-03-06 17:31:04 -0800
committerAndrew Bonventre <andybons@golang.org>2019-03-13 21:25:42 +0000
commit35ddc140c4f64f30a96bc008185a73dd670f6123 (patch)
tree25bec7069e22cf2a80edbd4e91e53724d619d887
parent746edd459d26f07f69fcb6bddfafaaae7c5a2911 (diff)
downloadgo-35ddc140c4f64f30a96bc008185a73dd670f6123.tar.gz
go-35ddc140c4f64f30a96bc008185a73dd670f6123.zip
[release-branch.go1.12] cmd/cgo: use explicit type for arg with bad pointer typedef
Fixes #30816 Updates #30646 Change-Id: I5b7e986b0588e87b9781cce01445e3c55c06b6fc Reviewed-on: https://go-review.googlesource.com/c/go/+/165897 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> (cherry picked from commit a6436a5655f56bb904871fece7db43a3ad3bf415) Reviewed-on: https://go-review.googlesource.com/c/go/+/167497 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
-rw-r--r--src/cmd/cgo/gcc.go6
-rw-r--r--src/cmd/cgo/main.go1
2 files changed, 6 insertions, 1 deletions
diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go
index 11a5472786..915ad66111 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -901,7 +901,7 @@ func (p *Package) rewriteCall(f *File, call *Call) (string, bool) {
// constants to the parameter type, to avoid a type mismatch.
ptype := p.rewriteUnsafe(param.Go)
- if !p.needsPointerCheck(f, param.Go, args[i]) {
+ if !p.needsPointerCheck(f, param.Go, args[i]) || param.BadPointer {
if ptype != param.Go {
needsUnsafe = true
}
@@ -2465,13 +2465,16 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type {
// Treat this typedef as a uintptr.
s := *sub
s.Go = c.uintptr
+ s.BadPointer = true
sub = &s
// Make sure we update any previously computed type.
if oldType := typedef[name.Name]; oldType != nil {
oldType.Go = sub.Go
+ oldType.BadPointer = true
}
}
t.Go = name
+ t.BadPointer = sub.BadPointer
if unionWithPointer[sub.Go] {
unionWithPointer[t.Go] = true
}
@@ -2481,6 +2484,7 @@ func (c *typeConv) Type(dtype dwarf.Type, pos token.Pos) *Type {
if oldType == nil {
tt := *t
tt.Go = sub.Go
+ tt.BadPointer = sub.BadPointer
typedef[name.Name] = &tt
}
diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go
index 11aeee4aab..5a7bb3f87b 100644
--- a/src/cmd/cgo/main.go
+++ b/src/cmd/cgo/main.go
@@ -151,6 +151,7 @@ type Type struct {
Go ast.Expr
EnumValues map[string]int64
Typedef string
+ BadPointer bool
}
// A FuncType collects information about a function type in both the C and Go worlds.