diff options
author | kawakami <kawakami.ozone@gmail.com> | 2019-06-23 05:30:24 +0900 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2019-06-24 19:18:34 +0000 |
commit | 38fc0afca6139ba2e28061712f68cbe426d238e7 (patch) | |
tree | 05ba1c6ade739f95922e2dbc7eaab6d97ecb5b5a | |
parent | 4ae3835aa28d21fd9045223640b7617ca1b83dfe (diff) | |
download | go-38fc0afca6139ba2e28061712f68cbe426d238e7.tar.gz go-38fc0afca6139ba2e28061712f68cbe426d238e7.zip |
cmd/cgo: fix inappropriate array copy
Ensure that during rewriting of expressions that take the address of
an array, that we properly recognize *ast.IndexExpr as an operation
to create a pointer variable and thus assign the proper addressOf
and deference operators as "&" and "*" respectively.
This fixes a regression from CL 142884.
Fixed #32579
Change-Id: I3cb78becff4f8035d66fc5536e5b52857eacaa3d
Reviewed-on: https://go-review.googlesource.com/c/go/+/183458
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
-rw-r--r-- | misc/cgo/test/cgo_test.go | 1 | ||||
-rw-r--r-- | misc/cgo/test/test.go | 12 | ||||
-rw-r--r-- | src/cmd/cgo/gcc.go | 2 |
3 files changed, 15 insertions, 0 deletions
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go index 2d6d269608..c66df2cd46 100644 --- a/misc/cgo/test/cgo_test.go +++ b/misc/cgo/test/cgo_test.go @@ -57,6 +57,7 @@ func Test26066(t *testing.T) { test26066(t) } func Test27660(t *testing.T) { test27660(t) } func Test28896(t *testing.T) { test28896(t) } func Test30065(t *testing.T) { test30065(t) } +func Test32579(t *testing.T) { test32579(t) } func TestAlign(t *testing.T) { testAlign(t) } func TestAtol(t *testing.T) { testAtol(t) } func TestBlocking(t *testing.T) { testBlocking(t) } diff --git a/misc/cgo/test/test.go b/misc/cgo/test/test.go index cc940da211..f7670ccf56 100644 --- a/misc/cgo/test/test.go +++ b/misc/cgo/test/test.go @@ -852,6 +852,8 @@ static void issue29781F(char **p, int n) {} // issue 31093 static uint16_t issue31093F(uint16_t v) { return v; } +// issue 32579 +typedef struct S32579 { int data[1]; } S32579; */ import "C" @@ -2083,3 +2085,13 @@ func test30065(t *testing.T) { func Issue31093() { C.issue31093F(C.ushort(0)) } + +// issue 32579 + +func test32579(t *testing.T) { + var s [1]C.struct_S32579 + C.memset(unsafe.Pointer(&s[0].data[0]), 1, 1) + if s[0].data[0] != 1 { + t.Errorf("&s[0].data[0] failed: got %d, want %d", s[0].data[0], 1) + } +} diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index 9428ffd3bf..d4e8186cab 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -1256,6 +1256,8 @@ func (p *Package) isVariable(x ast.Expr) bool { return true case *ast.SelectorExpr: return p.isVariable(x.X) + case *ast.IndexExpr: + return true } return false } |