From 38fc0afca6139ba2e28061712f68cbe426d238e7 Mon Sep 17 00:00:00 2001 From: kawakami Date: Sun, 23 Jun 2019 05:30:24 +0900 Subject: [PATCH] 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 TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- misc/cgo/test/cgo_test.go | 1 + misc/cgo/test/test.go | 12 ++++++++++++ src/cmd/cgo/gcc.go | 2 ++ 3 files changed, 15 insertions(+) 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 } -- 2.50.0