From 7a49e427c87609bb42725524c71c89b244c5fa87 Mon Sep 17 00:00:00 2001 From: Alan Donovan Date: Thu, 2 Mar 2017 16:31:04 -0500 Subject: [PATCH] go/loader: don't create types.Package for "unsafe" https://golang.org/cl/37694 is a backwards-incompatible change to the go/types API that causes "unsafe" to be included among the results of (*types.Package).Imports(). Client packages such as go/loader and go/ssa now need to recognize the special unsafe package and its unusual *Bultin members and not create a types.Package for it. Change-Id: I902725d3053cb887246978efdb5ec5dcdc0e4818 Reviewed-on: https://go-review.googlesource.com/37710 Run-TryBot: Robert Griesemer Reviewed-by: Robert Griesemer TryBot-Result: Gobot Gobot --- go/loader/loader.go | 11 ++++++++++- go/ssa/create.go | 7 ++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/go/loader/loader.go b/go/loader/loader.go index f03e8f94..f69a6684 100644 --- a/go/loader/loader.go +++ b/go/loader/loader.go @@ -1009,6 +1009,10 @@ func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck b time.Since(imp.start), info.Pkg.Path(), len(files)) } + if info.Pkg == types.Unsafe && len(files) > 0 { + panic(`addFiles("unsafe") not permitted`) + } + // Ignore the returned (first) error since we // already collect them all in the PackageInfo. info.checker.Files(files) @@ -1025,7 +1029,12 @@ func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck b } func (imp *importer) newPackageInfo(path, dir string) *PackageInfo { - pkg := types.NewPackage(path, "") + var pkg *types.Package + if path == "unsafe" { + pkg = types.Unsafe + } else { + pkg = types.NewPackage(path, "") + } info := &PackageInfo{ Pkg: pkg, Info: types.Info{ diff --git a/go/ssa/create.go b/go/ssa/create.go index 049396e4..69ac12b1 100644 --- a/go/ssa/create.go +++ b/go/ssa/create.go @@ -49,6 +49,11 @@ func NewProgram(fset *token.FileSet, mode BuilderMode) *Program { func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) { name := obj.Name() switch obj := obj.(type) { + case *types.Builtin: + if pkg.Pkg != types.Unsafe { + panic("unexpected builtin object: " + obj.String()) + } + case *types.TypeName: pkg.Members[name] = &Type{ object: obj, @@ -187,7 +192,7 @@ func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info * } } } else { - // GC-compiled binary package. + // GC-compiled binary package (or "unsafe") // No code. // No position information. scope := p.Pkg.Scope()