@@ -112,9 +112,9 @@ pub struct ItemCtxt<'tcx> {
112112///////////////////////////////////////////////////////////////////////////
113113
114114#[ derive( Default ) ]
115- crate struct PlaceholderHirTyCollector ( crate Vec < Span > ) ;
115+ crate struct HirPlaceholderCollector ( crate Vec < Span > ) ;
116116
117- impl < ' v > Visitor < ' v > for PlaceholderHirTyCollector {
117+ impl < ' v > Visitor < ' v > for HirPlaceholderCollector {
118118 fn visit_ty ( & mut self , t : & ' v hir:: Ty < ' v > ) {
119119 if let hir:: TyKind :: Infer = t. kind {
120120 self . 0 . push ( t. span ) ;
@@ -131,6 +131,12 @@ impl<'v> Visitor<'v> for PlaceholderHirTyCollector {
131131 _ => { }
132132 }
133133 }
134+ fn visit_array_length ( & mut self , length : & ' v hir:: ArrayLen ) {
135+ if let & hir:: ArrayLen :: Infer ( _, span) = length {
136+ self . 0 . push ( span) ;
137+ }
138+ intravisit:: walk_array_len ( self , length)
139+ }
134140}
135141
136142struct CollectItemTypesVisitor < ' tcx > {
@@ -175,7 +181,7 @@ crate fn placeholder_type_error<'tcx>(
175181 sugg. push ( ( span, format ! ( ", {}" , type_name) ) ) ;
176182 }
177183
178- let mut err = bad_placeholder ( tcx, "type" , placeholder_types, kind) ;
184+ let mut err = bad_placeholder ( tcx, placeholder_types, kind) ;
179185
180186 // Suggest, but only if it is not a function in const or static
181187 if suggest {
@@ -233,7 +239,7 @@ fn reject_placeholder_type_signatures_in_item<'tcx>(
233239 _ => return ,
234240 } ;
235241
236- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
242+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
237243 visitor. visit_item ( item) ;
238244
239245 placeholder_type_error (
@@ -311,7 +317,6 @@ impl<'tcx> Visitor<'tcx> for CollectItemTypesVisitor<'tcx> {
311317
312318fn bad_placeholder < ' tcx > (
313319 tcx : TyCtxt < ' tcx > ,
314- placeholder_kind : & ' static str ,
315320 mut spans : Vec < Span > ,
316321 kind : & ' static str ,
317322) -> rustc_errors:: DiagnosticBuilder < ' tcx > {
@@ -322,8 +327,7 @@ fn bad_placeholder<'tcx>(
322327 tcx. sess,
323328 spans. clone( ) ,
324329 E0121 ,
325- "the {} placeholder `_` is not allowed within types on item signatures for {}" ,
326- placeholder_kind,
330+ "the placeholder `_` is not allowed within types on item signatures for {}" ,
327331 kind
328332 ) ;
329333 for span in spans {
@@ -737,7 +741,7 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::ItemId) {
737741 match item. kind {
738742 hir:: ForeignItemKind :: Fn ( ..) => tcx. ensure ( ) . fn_sig ( item. def_id ) ,
739743 hir:: ForeignItemKind :: Static ( ..) => {
740- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
744+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
741745 visitor. visit_foreign_item ( item) ;
742746 placeholder_type_error (
743747 tcx,
@@ -820,7 +824,7 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::ItemId) {
820824 hir:: ItemKind :: Const ( ty, ..) | hir:: ItemKind :: Static ( ty, ..) => {
821825 // (#75889): Account for `const C: dyn Fn() -> _ = "";`
822826 if let hir:: TyKind :: TraitObject ( ..) = ty. kind {
823- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
827+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
824828 visitor. visit_item ( it) ;
825829 placeholder_type_error (
826830 tcx,
@@ -856,7 +860,7 @@ fn convert_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::TraitItemId) {
856860 hir:: TraitItemKind :: Const ( ..) => {
857861 tcx. ensure ( ) . type_of ( trait_item_id. def_id ) ;
858862 // Account for `const C: _;`.
859- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
863+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
860864 visitor. visit_trait_item ( trait_item) ;
861865 placeholder_type_error ( tcx, None , & [ ] , visitor. 0 , false , None , "constant" ) ;
862866 }
@@ -865,7 +869,7 @@ fn convert_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::TraitItemId) {
865869 tcx. ensure ( ) . item_bounds ( trait_item_id. def_id ) ;
866870 tcx. ensure ( ) . type_of ( trait_item_id. def_id ) ;
867871 // Account for `type T = _;`.
868- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
872+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
869873 visitor. visit_trait_item ( trait_item) ;
870874 placeholder_type_error ( tcx, None , & [ ] , visitor. 0 , false , None , "associated type" ) ;
871875 }
@@ -874,7 +878,7 @@ fn convert_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::TraitItemId) {
874878 tcx. ensure ( ) . item_bounds ( trait_item_id. def_id ) ;
875879 // #74612: Visit and try to find bad placeholders
876880 // even if there is no concrete type.
877- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
881+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
878882 visitor. visit_trait_item ( trait_item) ;
879883
880884 placeholder_type_error ( tcx, None , & [ ] , visitor. 0 , false , None , "associated type" ) ;
@@ -896,7 +900,7 @@ fn convert_impl_item(tcx: TyCtxt<'_>, impl_item_id: hir::ImplItemId) {
896900 }
897901 hir:: ImplItemKind :: TyAlias ( _) => {
898902 // Account for `type T = _;`
899- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
903+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
900904 visitor. visit_impl_item ( impl_item) ;
901905
902906 placeholder_type_error ( tcx, None , & [ ] , visitor. 0 , false , None , "associated type" ) ;
@@ -1816,10 +1820,14 @@ fn are_suggestable_generic_args(generic_args: &[hir::GenericArg<'_>]) -> bool {
18161820/// Whether `ty` is a type with `_` placeholders that can be inferred. Used in diagnostics only to
18171821/// use inference to provide suggestions for the appropriate type if possible.
18181822fn is_suggestable_infer_ty ( ty : & hir:: Ty < ' _ > ) -> bool {
1823+ debug ! ( ?ty) ;
18191824 use hir:: TyKind :: * ;
18201825 match & ty. kind {
18211826 Infer => true ,
1822- Slice ( ty) | Array ( ty, _) => is_suggestable_infer_ty ( ty) ,
1827+ Slice ( ty) => is_suggestable_infer_ty ( ty) ,
1828+ Array ( ty, length) => {
1829+ is_suggestable_infer_ty ( ty) || matches ! ( length, hir:: ArrayLen :: Infer ( _, _) )
1830+ }
18231831 Tup ( tys) => tys. iter ( ) . any ( is_suggestable_infer_ty) ,
18241832 Ptr ( mut_ty) | Rptr ( _, mut_ty) => is_suggestable_infer_ty ( mut_ty. ty ) ,
18251833 OpaqueDef ( _, generic_args) => are_suggestable_generic_args ( generic_args) ,
@@ -1871,9 +1879,9 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> {
18711879 } ) ;
18721880 let fn_sig = ty:: Binder :: dummy ( fn_sig) ;
18731881
1874- let mut visitor = PlaceholderHirTyCollector :: default ( ) ;
1882+ let mut visitor = HirPlaceholderCollector :: default ( ) ;
18751883 visitor. visit_ty ( ty) ;
1876- let mut diag = bad_placeholder ( tcx, "type" , visitor. 0 , "return type" ) ;
1884+ let mut diag = bad_placeholder ( tcx, visitor. 0 , "return type" ) ;
18771885 let ret_ty = fn_sig. skip_binder ( ) . output ( ) ;
18781886 if !ret_ty. references_error ( ) {
18791887 if !ret_ty. is_closure ( ) {
0 commit comments