mirror of
https://github.com/golang/go
synced 2024-11-19 03:14:42 -07:00
a265c2c448
CL 181857 broke the translation of certain C types using cmd/cgo -godefs because it stores each typedef, array and qualified type with their parent type name in the translation cache. Fix this by only considering the parent type for typedefs of anonymous structs which is the only case where types might become ambiguous. Updates #31891 Fixes #37479 Fixes #37621 Change-Id: I301a749ec89585789cb0d213593bb8b7341beb88 Reviewed-on: https://go-review.googlesource.com/c/go/+/226341 Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
86 lines
2.1 KiB
Go
86 lines
2.1 KiB
Go
// Copyright 2019 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.
|
|
|
|
package testgodefs
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// We are testing cgo -godefs, which translates Go files that use
|
|
// import "C" into Go files with Go definitions of types defined in the
|
|
// import "C" block. Add more tests here.
|
|
var filePrefixes = []string{
|
|
"anonunion",
|
|
"issue8478",
|
|
"fieldtypedef",
|
|
"issue37479",
|
|
"issue37621",
|
|
}
|
|
|
|
func TestGoDefs(t *testing.T) {
|
|
testdata, err := filepath.Abs("testdata")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
gopath, err := ioutil.TempDir("", "testgodefs-gopath")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(gopath)
|
|
|
|
dir := filepath.Join(gopath, "src", "testgodefs")
|
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
for _, fp := range filePrefixes {
|
|
cmd := exec.Command("go", "tool", "cgo",
|
|
"-godefs",
|
|
"-srcdir", testdata,
|
|
"-objdir", dir,
|
|
fp+".go")
|
|
cmd.Stderr = new(bytes.Buffer)
|
|
|
|
out, err := cmd.Output()
|
|
if err != nil {
|
|
t.Fatalf("%s: %v\n%s", strings.Join(cmd.Args, " "), err, cmd.Stderr)
|
|
}
|
|
|
|
if err := ioutil.WriteFile(filepath.Join(dir, fp+"_defs.go"), out, 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
main, err := ioutil.ReadFile(filepath.Join("testdata", "main.go"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := ioutil.WriteFile(filepath.Join(dir, "main.go"), main, 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if err := ioutil.WriteFile(filepath.Join(dir, "go.mod"), []byte("module testgodefs\ngo 1.14\n"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Use 'go run' to build and run the resulting binary in a single step,
|
|
// instead of invoking 'go build' and the resulting binary separately, so that
|
|
// this test can pass on mobile builders, which do not copy artifacts back
|
|
// from remote invocations.
|
|
cmd := exec.Command("go", "run", ".")
|
|
cmd.Env = append(os.Environ(), "GOPATH="+gopath)
|
|
cmd.Dir = dir
|
|
if out, err := cmd.CombinedOutput(); err != nil {
|
|
t.Fatalf("%s [%s]: %v\n%s", strings.Join(cmd.Args, " "), dir, err, out)
|
|
}
|
|
}
|