@@ -257,6 +257,20 @@ func loadPackageEx(dedup Deduper, ld *loader, lpkg *loaderPackage) {
257257 return // not a source package, don't get syntax trees
258258 }
259259
260+ // go list has already captured cmd/compile's authoritative diagnostics in
261+ // this block. For example, an unexpected else stops gc before recovery AST
262+ // errors are reported, so do not append the local parser/type follow-ons.
263+ hasCompilerSyntaxError := false
264+ for _ , err := range lpkg .Errors {
265+ if err .Kind != packages .ListError || ! strings .HasPrefix (err .Msg , "# " ) {
266+ continue
267+ }
268+ if _ , diagnostics , ok := strings .Cut (err .Msg , "\n " ); ok && strings .Contains (diagnostics , ": syntax error: " ) {
269+ hasCompilerSyntaxError = true
270+ break
271+ }
272+ }
273+
260274 appendError := func (err error ) {
261275 // Convert various error types into the one true Error.
262276 var errs []packages.Error
@@ -275,6 +289,9 @@ func loadPackageEx(dedup Deduper, ld *loader, lpkg *loaderPackage) {
275289
276290 case scanner.ErrorList :
277291 // from parser
292+ if hasCompilerSyntaxError {
293+ return
294+ }
278295 for _ , err := range err {
279296 errs = append (errs , packages.Error {
280297 Pos : err .Pos .String (),
@@ -285,6 +302,9 @@ func loadPackageEx(dedup Deduper, ld *loader, lpkg *loaderPackage) {
285302
286303 case types.Error :
287304 // from type checker
305+ if hasCompilerSyntaxError {
306+ return
307+ }
288308 lpkg .TypeErrors = append (lpkg .TypeErrors , err )
289309 errs = append (errs , packages.Error {
290310 Pos : err .Fset .Position (err .Pos ).String (),
0 commit comments