@@ -54,13 +54,17 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
54
54
}
55
55
( ty:: Param ( expected) , ty:: Param ( found) ) => {
56
56
let generics = tcx. generics_of ( body_owner_def_id) ;
57
- let e_span = tcx. def_span ( generics. type_param ( expected, tcx) . def_id ) ;
58
- if !sp. contains ( e_span) {
59
- diag. span_label ( e_span, "expected type parameter" ) ;
57
+ if let Some ( param) = generics. opt_type_param ( expected, tcx) {
58
+ let e_span = tcx. def_span ( param. def_id ) ;
59
+ if !sp. contains ( e_span) {
60
+ diag. span_label ( e_span, "expected type parameter" ) ;
61
+ }
60
62
}
61
- let f_span = tcx. def_span ( generics. type_param ( found, tcx) . def_id ) ;
62
- if !sp. contains ( f_span) {
63
- diag. span_label ( f_span, "found type parameter" ) ;
63
+ if let Some ( param) = generics. opt_type_param ( found, tcx) {
64
+ let f_span = tcx. def_span ( param. def_id ) ;
65
+ if !sp. contains ( f_span) {
66
+ diag. span_label ( f_span, "found type parameter" ) ;
67
+ }
64
68
}
65
69
diag. note (
66
70
"a type parameter was expected, but a different one was found; \
@@ -83,23 +87,29 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
83
87
| ( ty:: Alias ( ty:: Projection , proj) , ty:: Param ( p) )
84
88
if !tcx. is_impl_trait_in_trait ( proj. def_id ) =>
85
89
{
86
- let p_def_id = tcx. generics_of ( body_owner_def_id) . type_param ( p, tcx) . def_id ;
87
- let p_span = tcx. def_span ( p_def_id) ;
88
- let expected = match ( values. expected . kind ( ) , values. found . kind ( ) ) {
89
- ( ty:: Param ( _) , _) => "expected " ,
90
- ( _, ty:: Param ( _) ) => "found " ,
91
- _ => "" ,
92
- } ;
93
- if !sp. contains ( p_span) {
94
- diag. span_label ( p_span, format ! ( "{expected}this type parameter" ) ) ;
95
- }
96
- let hir = tcx. hir ( ) ;
90
+ let parent = tcx. generics_of ( body_owner_def_id)
91
+ . opt_type_param ( p, tcx)
92
+ . and_then ( |param| {
93
+ let p_def_id = param. def_id ;
94
+ let p_span = tcx. def_span ( p_def_id) ;
95
+ let expected = match ( values. expected . kind ( ) , values. found . kind ( ) ) {
96
+ ( ty:: Param ( _) , _) => "expected " ,
97
+ ( _, ty:: Param ( _) ) => "found " ,
98
+ _ => "" ,
99
+ } ;
100
+ if !sp. contains ( p_span) {
101
+ diag. span_label (
102
+ p_span,
103
+ format ! ( "{expected}this type parameter" ) ,
104
+ ) ;
105
+ }
106
+ p_def_id. as_local ( ) . and_then ( |id| {
107
+ let local_id = tcx. hir ( ) . local_def_id_to_hir_id ( id) ;
108
+ let generics = tcx. hir ( ) . find_parent ( local_id) ?. generics ( ) ?;
109
+ Some ( ( id, generics) )
110
+ } )
111
+ } ) ;
97
112
let mut note = true ;
98
- let parent = p_def_id. as_local ( ) . and_then ( |id| {
99
- let local_id = hir. local_def_id_to_hir_id ( id) ;
100
- let generics = tcx. hir ( ) . find_parent ( local_id) ?. generics ( ) ?;
101
- Some ( ( id, generics) )
102
- } ) ;
103
113
if let Some ( ( local_id, generics) ) = parent {
104
114
// Synthesize the associated type restriction `Add<Output = Expected>`.
105
115
// FIXME: extract this logic for use in other diagnostics.
@@ -172,14 +182,16 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
172
182
( ty:: Param ( p) , ty:: Dynamic ( ..) | ty:: Alias ( ty:: Opaque , ..) )
173
183
| ( ty:: Dynamic ( ..) | ty:: Alias ( ty:: Opaque , ..) , ty:: Param ( p) ) => {
174
184
let generics = tcx. generics_of ( body_owner_def_id) ;
175
- let p_span = tcx. def_span ( generics. type_param ( p, tcx) . def_id ) ;
176
- let expected = match ( values. expected . kind ( ) , values. found . kind ( ) ) {
177
- ( ty:: Param ( _) , _) => "expected " ,
178
- ( _, ty:: Param ( _) ) => "found " ,
179
- _ => "" ,
180
- } ;
181
- if !sp. contains ( p_span) {
182
- diag. span_label ( p_span, format ! ( "{expected}this type parameter" ) ) ;
185
+ if let Some ( param) = generics. opt_type_param ( p, tcx) {
186
+ let p_span = tcx. def_span ( param. def_id ) ;
187
+ let expected = match ( values. expected . kind ( ) , values. found . kind ( ) ) {
188
+ ( ty:: Param ( _) , _) => "expected " ,
189
+ ( _, ty:: Param ( _) ) => "found " ,
190
+ _ => "" ,
191
+ } ;
192
+ if !sp. contains ( p_span) {
193
+ diag. span_label ( p_span, format ! ( "{expected}this type parameter" ) ) ;
194
+ }
183
195
}
184
196
diag. help ( "type parameters must be constrained to match other types" ) ;
185
197
if tcx. sess . teach ( & diag. get_code ( ) . unwrap ( ) ) {
@@ -217,9 +229,11 @@ impl<T> Trait<T> for X {
217
229
}
218
230
( ty:: Param ( p) , ty:: Closure ( ..) | ty:: Coroutine ( ..) ) => {
219
231
let generics = tcx. generics_of ( body_owner_def_id) ;
220
- let p_span = tcx. def_span ( generics. type_param ( p, tcx) . def_id ) ;
221
- if !sp. contains ( p_span) {
222
- diag. span_label ( p_span, "expected this type parameter" ) ;
232
+ if let Some ( param) = generics. opt_type_param ( p, tcx) {
233
+ let p_span = tcx. def_span ( param. def_id ) ;
234
+ if !sp. contains ( p_span) {
235
+ diag. span_label ( p_span, "expected this type parameter" ) ;
236
+ }
223
237
}
224
238
diag. help ( format ! (
225
239
"every closure has a distinct type and so could not always match the \
@@ -228,14 +242,16 @@ impl<T> Trait<T> for X {
228
242
}
229
243
( ty:: Param ( p) , _) | ( _, ty:: Param ( p) ) => {
230
244
let generics = tcx. generics_of ( body_owner_def_id) ;
231
- let p_span = tcx. def_span ( generics. type_param ( p, tcx) . def_id ) ;
232
- let expected = match ( values. expected . kind ( ) , values. found . kind ( ) ) {
233
- ( ty:: Param ( _) , _) => "expected " ,
234
- ( _, ty:: Param ( _) ) => "found " ,
235
- _ => "" ,
236
- } ;
237
- if !sp. contains ( p_span) {
238
- diag. span_label ( p_span, format ! ( "{expected}this type parameter" ) ) ;
245
+ if let Some ( param) = generics. opt_type_param ( p, tcx) {
246
+ let p_span = tcx. def_span ( param. def_id ) ;
247
+ let expected = match ( values. expected . kind ( ) , values. found . kind ( ) ) {
248
+ ( ty:: Param ( _) , _) => "expected " ,
249
+ ( _, ty:: Param ( _) ) => "found " ,
250
+ _ => "" ,
251
+ } ;
252
+ if !sp. contains ( p_span) {
253
+ diag. span_label ( p_span, format ! ( "{expected}this type parameter" ) ) ;
254
+ }
239
255
}
240
256
}
241
257
( ty:: Alias ( ty:: Projection | ty:: Inherent , proj_ty) , _)
@@ -368,8 +384,10 @@ impl<T> Trait<T> for X {
368
384
return false ;
369
385
} ;
370
386
let generics = tcx. generics_of ( body_owner_def_id) ;
371
- let def_id = generics. type_param ( param_ty, tcx) . def_id ;
372
- let Some ( def_id) = def_id. as_local ( ) else {
387
+ let Some ( param) = generics. opt_type_param ( param_ty, tcx) else {
388
+ return false ;
389
+ } ;
390
+ let Some ( def_id) = param. def_id . as_local ( ) else {
373
391
return false ;
374
392
} ;
375
393
0 commit comments