]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: fix inappropriate array copy
authorkawakami <kawakami.ozone@gmail.com>
Sat, 22 Jun 2019 20:30:24 +0000 (05:30 +0900)
committerIan Lance Taylor <iant@golang.org>
Mon, 24 Jun 2019 19:18:34 +0000 (19:18 +0000)
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>
misc/cgo/test/cgo_test.go
misc/cgo/test/test.go
src/cmd/cgo/gcc.go

index 2d6d269608fc32dc066a2018378bbac2ab080fc6..c66df2cd46120772828cb709d801a80959d8387d 100644 (file)
@@ -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) }
index cc940da2114b0f098c85646aa72110a3adb6c0f0..f7670ccf5615d4a20ead65dbe5c96a057d4f3898 100644 (file)
@@ -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)
+       }
+}
index 9428ffd3bf910f83cef691a6f6292a6931d60fbd..d4e8186cab6adbda40a24cbf116abd01be39820c 100644 (file)
@@ -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
 }