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 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) }
|
||||
|
|
|
|||
|
|
@ -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])
|
||||
}
|
||||
|
|
|
|||
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}
|
||||
}
|
||||
|
||||
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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue