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>
diff --git a/misc/cgo/test/cgo_test.go b/misc/cgo/test/cgo_test.go
index 2d6d269..c66df2c 100644
--- a/misc/cgo/test/cgo_test.go
+++ b/misc/cgo/test/cgo_test.go
@@ -57,6 +57,7 @@
 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 cc940da..f7670cc 100644
--- a/misc/cgo/test/test.go
+++ b/misc/cgo/test/test.go
@@ -852,6 +852,8 @@
 // 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 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 9428ffd..d4e8186 100644
--- a/src/cmd/cgo/gcc.go
+++ b/src/cmd/cgo/gcc.go
@@ -1256,6 +1256,8 @@
 		return true
 	case *ast.SelectorExpr:
 		return p.isVariable(x.X)
+	case *ast.IndexExpr:
+		return true
 	}
 	return false
 }