@@ -284,6 +284,8 @@ type importReader struct {
284
284
prevColumn int64
285
285
}
286
286
287
+ // obj reads import declaration for an object. It may not read
288
+ // the entire declaration, e.g, for recursive type.
287
289
func (r * importReader ) obj (name string ) {
288
290
tag := r .byte ()
289
291
pos := r .pos ()
@@ -309,16 +311,17 @@ func (r *importReader) obj(name string) {
309
311
r .declare (types .NewFunc (pos , r .currPkg , name , sig ))
310
312
311
313
case 'T' , 'U' :
312
- var tparams []* types.TypeParam
313
- if tag == 'U' {
314
- tparams = r .tparamList ()
315
- }
316
314
// Types can be recursive. We need to setup a stub
317
315
// declaration before recursing.
318
316
obj := types .NewTypeName (pos , r .currPkg , name , nil )
319
317
named := types .NewNamed (obj , nil , nil )
320
- named .SetTypeParams (tparams )
318
+ // Declare obj before calling r.tparamList, so the new type name is recognized
319
+ // if used in the constraint of one of its own typeparams (see #48280).
321
320
r .declare (obj )
321
+ if tag == 'U' {
322
+ tparams := r .tparamList ()
323
+ named .SetTypeParams (tparams )
324
+ }
322
325
323
326
underlying := r .p .typAt (r .uint64 (), named ).Underlying ()
324
327
named .SetUnderlying (underlying )
0 commit comments