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()