imports []*types.Package
scope map[string]types.Object
- pkgmap, inputPkgmap map[string]*types.Package
- pkgnum int
+ pkgmap map[string]*types.Package
+ pkgnum int
}
func (in *interp) makeCompilerOptions() error {
TargetTriple: llvm.DefaultTargetTriple(),
ImportPaths: importPaths,
GenerateDebug: true,
+ Packages: in.pkgmap,
}
err = in.copts.MakeImporter()
if err != nil {
origImporter := in.copts.Importer
in.copts.Importer = func(pkgmap map[string]*types.Package, pkgpath string) (*types.Package, error) {
- if pkg, ok := in.inputPkgmap[pkgpath]; ok {
- return pkg, nil
- }
if pkg, ok := pkgmap[pkgpath]; ok && pkg.Complete() {
return pkg, nil
}
func (in *interp) init() error {
in.scope = make(map[string]types.Object)
in.pkgmap = make(map[string]*types.Package)
- in.inputPkgmap = make(map[string]*types.Package)
err := in.makeCompilerOptions()
if err != nil {
}
}()
importfunc()
- in.inputPkgmap[pkgpath] = pkg
+ in.pkgmap[pkgpath] = pkg
return
}
// DisableUnusedImportCheck disables the unused import check performed
// by go/types if set to true.
DisableUnusedImportCheck bool
+
+ // Packages is used by go/types as the imported package map if non-nil.
+ Packages map[string]*types.Package
}
type Compiler struct {
impcfg := &loader.Config{
Fset: fset,
TypeChecker: types.Config{
- Import: compiler.Importer,
- Sizes: compiler.llvmtypes,
+ Packages: compiler.Packages,
+ Import: compiler.Importer,
+ Sizes: compiler.llvmtypes,
DisableUnusedImportCheck: compiler.DisableUnusedImportCheck,
},
Build: &buildctx.Context,
-// RUN: env GOPATH=%S/Inputs llgoi < %s | FileCheck %s
+// RUN: env GOPATH=%S/Inputs llgoi < %s 2>&1 | FileCheck %s
// make sure user symbols do not conflict with imported source package
Answer := 1
strconv.FormatBool(true)
// CHECK: #0 string = true
+var v1 strconv.NumError
+var v2 strconv.NumError
+
+// v1 and v2 should have the same type identity.
+// CHECK-NOT: cannot assign
+v1 = v2
+
+// Method lookup relies on v1 having a consistent type.
+v1.Error
+
import "foo_cgo"
// CHECK: foo_cgo: cannot load cgo package