diff options
author | Ian Lance Taylor <iant@golang.org> | 2019-03-06 17:31:04 -0800 |
---|---|---|
committer | Andrew Bonventre <andybons@golang.org> | 2019-03-13 21:25:42 +0000 |
commit | 35ddc140c4f64f30a96bc008185a73dd670f6123 (patch) | |
tree | 25bec7069e22cf2a80edbd4e91e53724d619d887 | |
parent | 746edd459d26f07f69fcb6bddfafaaae7c5a2911 (diff) | |
download | go-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.go | 6 | ||||
-rw-r--r-- | src/cmd/cgo/main.go | 1 |
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. |