mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/cgo: also rewrite C.var in selector expressions
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>
This commit is contained in:
parent
a6cb053026
commit
16993f2485
4 changed files with 45 additions and 1 deletions
|
|
@ -63,5 +63,6 @@ func Test8811(t *testing.T) { test8811(t) }
|
||||||
func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) }
|
func TestReturnAfterGrow(t *testing.T) { testReturnAfterGrow(t) }
|
||||||
func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
|
func TestReturnAfterGrowFromGo(t *testing.T) { testReturnAfterGrowFromGo(t) }
|
||||||
func Test9026(t *testing.T) { test9026(t) }
|
func Test9026(t *testing.T) { test9026(t) }
|
||||||
|
func Test9557(t *testing.T) { test9557(t) }
|
||||||
|
|
||||||
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
|
func BenchmarkCgoCall(b *testing.B) { benchCgoCall(b) }
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ import "testing"
|
||||||
|
|
||||||
var v7234 = [...]string{"runtime/cgo"}
|
var v7234 = [...]string{"runtime/cgo"}
|
||||||
|
|
||||||
func TestIssue7234(t *testing.T) {
|
func Test7234(t *testing.T) {
|
||||||
if v7234[0] != "runtime/cgo" {
|
if v7234[0] != "runtime/cgo" {
|
||||||
t.Errorf("bad string constant %q", v7234[0])
|
t.Errorf("bad string constant %q", v7234[0])
|
||||||
}
|
}
|
||||||
|
|
|
||||||
36
misc/cgo/test/issue9557.go
Normal file
36
misc/cgo/test/issue9557.go
Normal file
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -659,6 +659,13 @@ func (p *Package) rewriteRef(f *File) {
|
||||||
expr = &ast.StarExpr{Star: (*r.Expr).Pos(), X: expr}
|
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":
|
case "type":
|
||||||
if r.Name.Kind != "type" {
|
if r.Name.Kind != "type" {
|
||||||
error_(r.Pos(), "expression C.%s used as type", fixGo(r.Name.Go))
|
error_(r.Pos(), "expression C.%s used as type", fixGo(r.Name.Go))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue