From 5e23576c2fc7ef5c281bd605dcf8ddbb7e1b14ed Mon Sep 17 00:00:00 2001 From: Rick Guo Date: Sun, 2 Aug 2026 14:51:12 +0800 Subject: [PATCH] fix: align unexported package member diagnostics --- internal/packages/load.go | 21 +++++++++++++++++++++ internal/packages/load_test.go | 16 ++++++++++++++++ test/goroot/xfail.yaml | 4 ---- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/internal/packages/load.go b/internal/packages/load.go index 3ec632f357..3492ae6d31 100644 --- a/internal/packages/load.go +++ b/internal/packages/load.go @@ -257,6 +257,7 @@ func loadPackageEx(dedup Deduper, ld *loader, lpkg *loaderPackage) { return // not a source package, don't get syntax trees } + var packageSelectors map[token.Pos]string appendError := func(err error) { // Convert various error types into the one true Error. var errs []packages.Error @@ -285,6 +286,12 @@ func loadPackageEx(dedup Deduper, ld *loader, lpkg *loaderPackage) { case types.Error: // from type checker + if selector, ok := packageSelectors[err.Pos]; ok { + name := selector[strings.LastIndexByte(selector, '.')+1:] + if strings.HasPrefix(err.Msg, "name "+name+" not exported by package ") { + err.Msg = "undefined: " + selector + } + } lpkg.TypeErrors = append(lpkg.TypeErrors, err) errs = append(errs, packages.Error{ Pos: err.Fset.Position(err.Pos).String(), @@ -366,6 +373,20 @@ func loadPackageEx(dedup Deduper, ld *loader, lpkg *loaderPackage) { if ld.Context.Err() != nil { return } + packageSelectors = make(map[token.Pos]string) + for _, file := range files { + ast.Inspect(file, func(node ast.Node) bool { + sel, ok := node.(*ast.SelectorExpr) + if !ok { + return true + } + qualifier, ok := sel.X.(*ast.Ident) + if ok { + packageSelectors[sel.Sel.Pos()] = qualifier.Name + "." + sel.Sel.Name + } + return true + }) + } lpkg.TypesInfo = &types.Info{ Types: make(map[ast.Expr]types.TypeAndValue), diff --git a/internal/packages/load_test.go b/internal/packages/load_test.go index a65dfb7955..1be549ddad 100644 --- a/internal/packages/load_test.go +++ b/internal/packages/load_test.go @@ -267,6 +267,22 @@ var x string`) assertPackageErrorAbsent(t, pkg, "no metadata for /foo") }) + t.Run("unexported package member", func(t *testing.T) { + dir := t.TempDir() + writeLoadTestFile(t, filepath.Join(dir, "go.mod"), "module example.com/private\ngo 1.24\n") + if err := os.Mkdir(filepath.Join(dir, "dep"), 0o755); err != nil { + t.Fatal(err) + } + writeLoadTestFile(t, filepath.Join(dir, "dep", "dep.go"), "package dep\nvar hidden int\n") + writeLoadTestFile(t, filepath.Join(dir, "load.go"), `package private +import alias "example.com/private/dep" +var _ = alias.hidden +`) + pkg := loadOnePackage(t, dir, "go1.24") + assertPackageError(t, pkg, "undefined: alias.hidden") + assertPackageErrorAbsent(t, pkg, "not exported by package") + }) + } func loadOnePackage(t *testing.T, dir, goVersion string) *Package { diff --git a/test/goroot/xfail.yaml b/test/goroot/xfail.yaml index cee4671e72..2e03aa2612 100644 --- a/test/goroot/xfail.yaml +++ b/test/goroot/xfail.yaml @@ -2046,10 +2046,6 @@ xfails: directive: errorcheck case: escape_map.go reason: gc-specific -m escape-analysis diagnostics are not implemented by llgo - - version: go1.26 - directive: errorcheck - case: runtime.go - reason: gc runtime private-symbol compiler diagnostics are not implemented by llgo - version: go1.26 directive: errorcheck case: fixedbugs/notinheap.go