aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkawakami <kawakami.ozone@gmail.com>2019-06-23 05:30:24 +0900
committerIan Lance Taylor <iant@golang.org>2019-06-24 19:18:34 +0000
commit38fc0afca6139ba2e28061712f68cbe426d238e7 (patch)
tree05ba1c6ade739f95922e2dbc7eaab6d97ecb5b5a
parent4ae3835aa28d21fd9045223640b7617ca1b83dfe (diff)
downloadgo-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.go1
-rw-r--r--misc/cgo/test/test.go12
-rw-r--r--src/cmd/cgo/gcc.go2
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
}