@@ -216,93 +216,87 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
216216                | Node :: Expr ( & Expr  {  kind :  ExprKind :: Path ( _) ,  .. } ) 
217217                | Node :: TraitRef ( ..)  => { 
218218                    let  path = match  parent_node { 
219-                         Node :: Ty ( & Ty  { 
220-                             kind :  TyKind :: Path ( QPath :: Resolved ( _,  ref  path) ) ,  ..
221-                         } ) 
219+                         Node :: Ty ( & Ty  {  kind :  TyKind :: Path ( QPath :: Resolved ( _,  path) ) ,  .. } ) 
222220                        | Node :: Expr ( & Expr  { 
223-                             kind :  ExprKind :: Path ( QPath :: Resolved ( _,  ref  path) ) , 
221+                             kind : 
222+                                 ExprKind :: Path ( QPath :: Resolved ( _,  path) ) 
223+                                 | ExprKind :: Struct ( & QPath :: Resolved ( _,  path) ,  ..) , 
224224                            ..
225-                         } )  => Some ( & * * path) , 
226-                         Node :: Expr ( & Expr  {  kind :  ExprKind :: Struct ( ref  path,  ..) ,  .. } )  => { 
227-                             if  let  QPath :: Resolved ( _,  ref  path)  = * * path { 
228-                                 Some ( & * * path) 
229-                             }  else  { 
230-                                 None 
231-                             } 
225+                         } ) 
226+                         | Node :: TraitRef ( & TraitRef  {  path,  .. } )  => & * path, 
227+                         _ => { 
228+                             tcx. sess . delay_span_bug ( 
229+                                 DUMMY_SP , 
230+                                 & format ! ( "unexpected const parent path {:?}" ,  parent_node) , 
231+                             ) ; 
232+                             return  tcx. types . err ; 
232233                        } 
233-                         Node :: TraitRef ( & TraitRef  {  ref  path,  .. } )  => Some ( & * * path) , 
234-                         _ => None , 
235234                    } ; 
236235
237-                     if  let  Some ( path)  = path { 
238-                         // We've encountered an `AnonConst` in some path, so we need to 
239-                         // figure out which generic parameter it corresponds to and return 
240-                         // the relevant type. 
241- 
242-                         let  ( arg_index,  segment)  = path
243-                             . segments 
244-                             . iter ( ) 
245-                             . filter_map ( |seg| seg. args . as_ref ( ) . map ( |args| ( args. args ,  seg) ) ) 
246-                             . find_map ( |( args,  seg) | { 
247-                                 args. iter ( ) 
248-                                     . filter ( |arg| arg. is_const ( ) ) 
249-                                     . enumerate ( ) 
250-                                     . filter ( |( _,  arg) | arg. id ( )  == hir_id) 
251-                                     . map ( |( index,  _) | ( index,  seg) ) 
252-                                     . next ( ) 
253-                             } ) 
254-                             . unwrap_or_else ( || { 
255-                                 bug ! ( "no arg matching AnonConst in path" ) ; 
256-                             } ) ; 
257- 
258-                         // Try to use the segment resolution if it is valid, otherwise we 
259-                         // default to the path resolution. 
260-                         let  res = segment. res . filter ( |& r| r != Res :: Err ) . unwrap_or ( path. res ) ; 
261-                         let  generics = match  res { 
262-                             Res :: Def ( DefKind :: Ctor ( ..) ,  def_id)  => { 
263-                                 tcx. generics_of ( tcx. parent ( def_id) . unwrap ( ) ) 
264-                             } 
265-                             Res :: Def ( _,  def_id)  => tcx. generics_of ( def_id) , 
266-                             res => { 
267-                                 tcx. sess . delay_span_bug ( 
268-                                     DUMMY_SP , 
269-                                     & format ! ( 
270-                                         "unexpected anon const res {:?} in path: {:?}" , 
271-                                         res,  path, 
272-                                     ) , 
273-                                 ) ; 
274-                                 return  tcx. types . err ; 
236+                     // We've encountered an `AnonConst` in some path, so we need to 
237+                     // figure out which generic parameter it corresponds to and return 
238+                     // the relevant type. 
239+ 
240+                     let  ( arg_index,  segment)  = path
241+                         . segments 
242+                         . iter ( ) 
243+                         . filter_map ( |seg| seg. args . as_ref ( ) . map ( |args| ( args. args ,  seg) ) ) 
244+                         . find_map ( |( args,  seg) | { 
245+                             args. iter ( ) 
246+                                 . filter ( |arg| arg. is_const ( ) ) 
247+                                 . enumerate ( ) 
248+                                 . filter ( |( _,  arg) | arg. id ( )  == hir_id) 
249+                                 . map ( |( index,  _) | ( index,  seg) ) 
250+                                 . next ( ) 
251+                         } ) 
252+                         . unwrap_or_else ( || { 
253+                             bug ! ( "no arg matching AnonConst in path" ) ; 
254+                         } ) ; 
255+ 
256+                     // Try to use the segment resolution if it is valid, otherwise we 
257+                     // default to the path resolution. 
258+                     let  res = segment. res . filter ( |& r| r != Res :: Err ) . unwrap_or ( path. res ) ; 
259+                     let  generics = match  res { 
260+                         Res :: Def ( DefKind :: Ctor ( ..) ,  def_id)  => { 
261+                             tcx. generics_of ( tcx. parent ( def_id) . unwrap ( ) ) 
262+                         } 
263+                         Res :: Def ( _,  def_id)  => tcx. generics_of ( def_id) , 
264+                         res => { 
265+                             tcx. sess . delay_span_bug ( 
266+                                 DUMMY_SP , 
267+                                 & format ! ( 
268+                                     "unexpected anon const res {:?} in path: {:?}" , 
269+                                     res,  path, 
270+                                 ) , 
271+                             ) ; 
272+                             return  tcx. types . err ; 
273+                         } 
274+                     } ; 
275+ 
276+                     let  ty = generics
277+                         . params 
278+                         . iter ( ) 
279+                         . filter ( |param| { 
280+                             if  let  ty:: GenericParamDefKind :: Const  = param. kind  { 
281+                                 true 
282+                             }  else  { 
283+                                 false 
275284                            } 
276-                         } ; 
285+                         } ) 
286+                         . nth ( arg_index) 
287+                         . map ( |param| tcx. type_of ( param. def_id ) ) ; 
277288
278-                         generics
279-                             . params 
280-                             . iter ( ) 
281-                             . filter ( |param| { 
282-                                 if  let  ty:: GenericParamDefKind :: Const  = param. kind  { 
283-                                     true 
284-                                 }  else  { 
285-                                     false 
286-                                 } 
287-                             } ) 
288-                             . nth ( arg_index) 
289-                             . map ( |param| tcx. type_of ( param. def_id ) ) 
290-                             // This is no generic parameter associated with the arg. This is 
291-                             // probably from an extra arg where one is not needed. 
292-                             . unwrap_or_else ( || { 
293-                                 tcx. sess . delay_span_bug ( 
294-                                     DUMMY_SP , 
295-                                     & format ! ( 
296-                                         "missing generic parameter for `AnonConst`, parent: {:?}, res: {:?}" , 
297-                                         parent_node,  res
298-                                     ) , 
299-                                 ) ; 
300-                                 tcx. types . err 
301-                             } ) 
289+                     if  let  Some ( ty)  = ty { 
290+                         ty
302291                    }  else  { 
292+                         // This is no generic parameter associated with the arg. This is 
293+                         // probably from an extra arg where one is not needed. 
303294                        tcx. sess . delay_span_bug ( 
304295                            DUMMY_SP , 
305-                             & format ! ( "unexpected const parent path {:?}" ,  parent_node, ) , 
296+                             & format ! ( 
297+                                 "missing generic parameter for `AnonConst`, parent: {:?}, res: {:?}" , 
298+                                 parent_node,  res
299+                             ) , 
306300                        ) ; 
307301                        tcx. types . err 
308302                    } 
0 commit comments