diff --git a/src/go/types/gotype.go b/src/go/types/gotype.go index 196fc9bbd6..2efb4c0ac9 100644 --- a/src/go/types/gotype.go +++ b/src/go/types/gotype.go @@ -209,14 +209,30 @@ func parseFiles(dir string, filenames []string) ([]*ast.File, error) { } wg.Wait() - // if there are errors, return the first one for deterministic results + // If there are errors, return the first one for deterministic results. + var first error for _, err := range errors { if err != nil { - return nil, err + first = err + // If we have an error, some files may be nil. + // Remove them. (The go/parser always returns + // a possibly partial AST even in the presence + // of errors, except if the file doesn't exist + // in the first place, in which case it cannot + // matter.) + i := 0 + for _, f := range files { + if f != nil { + files[i] = f + i++ + } + } + files = files[:i] + break } } - return files, nil + return files, first } func parseDir(dir string) ([]*ast.File, error) { @@ -318,7 +334,7 @@ func main() { files, err := getPkgFiles(flag.Args()) if err != nil { report(err) - os.Exit(2) + // ok to continue (files may be empty, but not nil) } checkPkgFiles(files)