go/loader: name unnamed packages so errors make sense

Add tests for:
- this naming
- missing file in created package

Change-Id: I07c66b66e845c52d4685509c362b34f1f0c92648
Reviewed-on: https://go-review.googlesource.com/6310
Reviewed-by: Robert Griesemer <gri@golang.org>
diff --git a/go/loader/loader.go b/go/loader/loader.go
index 74ac6ee..16ccd24 100644
--- a/go/loader/loader.go
+++ b/go/loader/loader.go
@@ -729,8 +729,12 @@
 		files = append(files, cp.Files...)
 
 		path := cp.Path
-		if path == "" && len(files) > 0 {
-			path = files[0].Name.Name
+		if path == "" {
+			if len(files) > 0 {
+				path = files[0].Name.Name
+			} else {
+				path = "(unnamed)"
+			}
 		}
 		createPkg(path, files, errs)
 	}
diff --git a/go/loader/loader_test.go b/go/loader/loader_test.go
index 4e9f7d3..aa8c15b 100644
--- a/go/loader/loader_test.go
+++ b/go/loader/loader_test.go
@@ -5,6 +5,7 @@
 package loader_test
 
 import (
+	"fmt"
 	"go/build"
 	"reflect"
 	"sort"
@@ -139,6 +140,49 @@
 	}
 }
 
+func TestCreateUnnamedPackage(t *testing.T) {
+	var conf loader.Config
+	conf.CreateFromFilenames("")
+	prog, err := conf.Load()
+	if err != nil {
+		t.Fatalf("Load failed: %v", err)
+	}
+	if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want {
+		t.Errorf("InitialPackages = %s, want %s", got, want)
+	}
+}
+
+func TestLoad_MissingFileInCreatedPackage(t *testing.T) {
+	var conf loader.Config
+	conf.CreateFromFilenames("", "missing.go")
+
+	const wantErr = "couldn't load packages due to errors: (unnamed)"
+
+	prog, err := conf.Load()
+	if prog != nil {
+		t.Errorf("Load unexpectedly returned a Program")
+	}
+	if err == nil {
+		t.Fatalf("Load succeeded unexpectedly, want %q", wantErr)
+	}
+	if err.Error() != wantErr {
+		t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr)
+	}
+}
+
+func TestLoad_MissingFileInCreatedPackage_AllowErrors(t *testing.T) {
+	conf := loader.Config{AllowErrors: true}
+	conf.CreateFromFilenames("", "missing.go")
+
+	prog, err := conf.Load()
+	if err != nil {
+		t.Errorf("Load failed: %v", err)
+	}
+	if got, want := fmt.Sprint(prog.InitialPackages()), "[(unnamed)]"; got != want {
+		t.Fatalf("InitialPackages = %s, want %s", got, want)
+	}
+}
+
 func TestLoad_ParseError(t *testing.T) {
 	var conf loader.Config
 	conf.CreateFromFilenames("badpkg", "testdata/badpkgdecl.go")
@@ -146,14 +190,15 @@
 	const wantErr = "couldn't load packages due to errors: badpkg"
 
 	prog, err := conf.Load()
-	if err == nil {
-		t.Errorf("Load succeeded unexpectedly, want %q", wantErr)
-	} else if err.Error() != wantErr {
-		t.Errorf("Load failed with wrong error %q, want %q", err, wantErr)
-	}
 	if prog != nil {
 		t.Errorf("Load unexpectedly returned a Program")
 	}
+	if err == nil {
+		t.Fatalf("Load succeeded unexpectedly, want %q", wantErr)
+	}
+	if err.Error() != wantErr {
+		t.Fatalf("Load failed with wrong error %q, want %q", err, wantErr)
+	}
 }
 
 func TestLoad_ParseError_AllowErrors(t *testing.T) {