]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.12] cmd/cgo: use explicit type for arg with bad pointer typedef
authorIan Lance Taylor <iant@golang.org>
Thu, 7 Mar 2019 01:31:04 +0000 (17:31 -0800)
committerAndrew Bonventre <andybons@golang.org>
Wed, 13 Mar 2019 21:25:42 +0000 (21:25 +0000)
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>

src/cmd/cgo/gcc.go
src/cmd/cgo/main.go

index 11a5472786d761b4f4089f711793cf33eca02bfe..915ad66111b8987dad2201ff279dff8a6e716db5 100644 (file)
@@ -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
                }
 
index 11aeee4aab74f661d8f3a62197c6ff5faef64ba4..5a7bb3f87bc73f7b5b0675a4fc6851313d182e9f 100644 (file)
@@ -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.