@@ -259,17 +259,28 @@ type driverResponse struct {
259
259
// provided for convenient display of all errors.
260
260
func Load (cfg * Config , patterns ... string ) ([]* Package , error ) {
261
261
ld := newLoader (cfg )
262
- response , err := defaultDriver (& ld .Config , patterns ... )
262
+ response , external , err := defaultDriver (& ld .Config , patterns ... )
263
263
if err != nil {
264
264
return nil , err
265
265
}
266
266
267
- // If type size information is needed but unavailable.
268
- // reject the whole Load since the error is the same for every package.
269
267
ld .sizes = types .SizesFor (response .Compiler , response .Arch )
270
268
if ld .sizes == nil && ld .Config .Mode & (NeedTypes | NeedTypesSizes | NeedTypesInfo ) != 0 {
271
- return nil , fmt .Errorf ("can't determine type sizes for compiler %q on GOARCH %q" ,
272
- response .Compiler , response .Arch )
269
+ // Type size information is needed but unavailable.
270
+ if external {
271
+ // An external driver may fail to populate the Compiler/GOARCH fields,
272
+ // especially since they are relatively new (see #63700).
273
+ // Provide a sensible fallback in this case.
274
+ ld .sizes = types .SizesFor ("gc" , runtime .GOARCH )
275
+ if ld .sizes == nil { // gccgo-only arch
276
+ ld .sizes = types .SizesFor ("gc" , "amd64" )
277
+ }
278
+ } else {
279
+ // Go list should never fail to deliver accurate size information.
280
+ // Reject the whole Load since the error is the same for every package.
281
+ return nil , fmt .Errorf ("can't determine type sizes for compiler %q on GOARCH %q" ,
282
+ response .Compiler , response .Arch )
283
+ }
273
284
}
274
285
275
286
return ld .refine (response )
@@ -279,18 +290,20 @@ func Load(cfg *Config, patterns ...string) ([]*Package, error) {
279
290
// It will try to request to an external driver, if one exists. If there's
280
291
// no external driver, or the driver returns a response with NotHandled set,
281
292
// defaultDriver will fall back to the go list driver.
282
- func defaultDriver ( cfg * Config , patterns ... string ) ( * driverResponse , error ) {
283
- driver := findExternalDriver (cfg )
284
- if driver = = nil {
285
- driver = goListDriver
286
- }
287
- response , err := driver ( cfg , patterns ... )
288
- if err != nil {
289
- return response , err
290
- } else if response . NotHandled {
291
- return goListDriver ( cfg , patterns ... )
293
+ // The boolean result indicates that an external driver handled the request.
294
+ func defaultDriver (cfg * Config , patterns ... string ) ( * driverResponse , bool , error ) {
295
+ if driver := findExternalDriver ( cfg ); driver ! = nil {
296
+ response , err := driver ( cfg , patterns ... )
297
+ if err != nil {
298
+ return nil , false , err
299
+ } else if ! response . NotHandled {
300
+ return response , true , nil
301
+ }
302
+ // (fall through )
292
303
}
293
- return response , nil
304
+
305
+ response , err := goListDriver (cfg , patterns ... )
306
+ return response , false , err
294
307
}
295
308
296
309
// A Package describes a loaded Go package.
0 commit comments