]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/cgo: also rewrite C.var in selector expressions
authorShenghou Ma <minux@golang.org>
Mon, 12 Jan 2015 05:12:59 +0000 (00:12 -0500)
committerMinux Ma <minux@golang.org>
Mon, 12 Jan 2015 21:48:57 +0000 (21:48 +0000)
While we're here, rename TestIssue7234 to Test7234 for consistency
with other tests.

Fixes #9557.

Change-Id: I22b0a212b31e7b4f199f6a70deb73374beb80f84
Reviewed-on: https://go-review.googlesource.com/2654
Reviewed-by: Ian Lance Taylor <iant@golang.org>
misc/cgo/test/cgo_test.go
misc/cgo/test/issue7234_test.go
misc/cgo/test/issue9557.go [new file with mode: 0644]
src/cmd/cgo/gcc.go

index fbdfac87acb8ef69be9e4fe295c4ba7373a6550f..76576d7a134194115a956f63bca69deda0c6f797 100644 (file)
@@ -63,5 +63,6 @@ func Test8811(t *testing.T)                  { test8811(t) }
 func TestReturnAfterGrow(t *testing.T)       { testReturnAfterGrow(t) }
 func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
 func Test9026(t *testing.T)                  { test9026(t) }
+func Test9557(t *testing.T)                  { test9557(t) }
 
 func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
index 713dade4c885d705d61011b22cfdcbd497f561ca..604dfad4ba660fcc355d29bf5f58be9182755b44 100644 (file)
@@ -14,7 +14,7 @@ import "testing"
 
 var v7234 = [...]string{"runtime/cgo"}
 
-func TestIssue7234(t *testing.T) {
+func Test7234(t *testing.T) {
        if v7234[0] != "runtime/cgo" {
                t.Errorf("bad string constant %q", v7234[0])
        }
diff --git a/misc/cgo/test/issue9557.go b/misc/cgo/test/issue9557.go
new file mode 100644 (file)
index 0000000..b29bacd
--- /dev/null
@@ -0,0 +1,36 @@
+// Copyright 2015 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// cgo rewrote C.var to *_Cvar_var, but left
+// C.var.field as _Cvar.var.field.  It now rewrites
+// the latter as (*_Cvar_var).field.
+// See https://golang.org/issue/9557.
+
+package cgotest
+
+// struct issue9557_t {
+//   int a;
+// } test9557bar = { 42 };
+//
+// struct issue9557_t *issue9557foo = &test9557bar;
+import "C"
+import "testing"
+
+func test9557(t *testing.T) {
+       // implicitly dereference a Go variable
+       foo := C.issue9557foo
+       if v := foo.a; v != 42 {
+               t.Fatalf("foo.a expected 42, but got %d", v)
+       }
+
+       // explicitly dereference a C variable
+       if v := (*C.issue9557foo).a; v != 42 {
+               t.Fatalf("(*C.issue9557foo).a expected 42, but is %d", v)
+       }
+
+       // implicitly dereference a C variable
+       if v := C.issue9557foo.a; v != 42 {
+               t.Fatalf("C.issue9557foo.a expected 42, but is %d", v)
+       }
+}
index 864fda02582e61529d400af6640c34fd907d9f5f..e217ddcf0b75f695cf660b415d2b35ad56948ec9 100644 (file)
@@ -659,6 +659,13 @@ func (p *Package) rewriteRef(f *File) {
                                expr = &ast.StarExpr{Star: (*r.Expr).Pos(), X: expr}
                        }
 
+               case "selector":
+                       if r.Name.Kind == "var" {
+                               expr = &ast.StarExpr{Star: (*r.Expr).Pos(), X: expr}
+                       } else {
+                               error_(r.Pos(), "only C variables allowed in selector expression", fixGo(r.Name.Go))
+                       }
+
                case "type":
                        if r.Name.Kind != "type" {
                                error_(r.Pos(), "expression C.%s used as type", fixGo(r.Name.Go))