1 [!cgo] skip
2
3 # Verify that the new go list -export format includes types produced by
4 # cgo preprocessing (see go.dev/issue/79427).
5
6 env GOEXPERIMENT=golistexportnewformat
7 go list -export -json p.go
8 cp stdout out.json
9 go run q.go out.json
10 stdout '_Ctype_int'
11
12 -- p.go --
13 package p
14
15 import "C"
16
17 var V = C.int(42)
18
19 -- q.go --
20 package main
21
22 import (
23 "encoding/json"
24 "fmt"
25 "go/importer"
26 "go/token"
27 "io"
28 "log"
29 "os"
30 )
31
32 func main() {
33 data, err := os.ReadFile(os.Args[1])
34 if err != nil {
35 log.Fatal(err)
36 }
37 // This is a minimal output of go list -export -json.
38 type output struct {
39 ImportPath string
40 Export string
41 }
42 var out output
43 if err := json.Unmarshal(data, &out); err != nil {
44 log.Fatal(err)
45 }
46 fset := token.NewFileSet()
47 imp := importer.ForCompiler(fset, "gc", func(path string) (io.ReadCloser, error) {
48 if path != out.ImportPath {
49 log.Fatalf("unexpected import: %q", path)
50 }
51 return os.Open(out.Export)
52 })
53 pkg, err := imp.Import(out.ImportPath)
54 if err != nil {
55 log.Fatal(err)
56 }
57 fmt.Println(pkg.Scope().Lookup("V").Type())
58 }
59
View as plain text