@@ -3137,11 +3137,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
31373137 Node :: LetStmt ( hir:: LetStmt { ty : Some ( ty) , .. } ) => {
31383138 err. span_suggestion_verbose (
31393139 ty. span . shrink_to_lo ( ) ,
3140- "consider borrowing here " ,
3140+ "borrowed types have a statically known size " ,
31413141 "&" ,
31423142 Applicability :: MachineApplicable ,
31433143 ) ;
3144- err. note ( "all local variables must have a statically known size" ) ;
31453144 }
31463145 Node :: LetStmt ( hir:: LetStmt {
31473146 init : Some ( hir:: Expr { kind : hir:: ExprKind :: Index ( ..) , span, .. } ) ,
@@ -3152,11 +3151,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
31523151 // order to use have a slice instead.
31533152 err. span_suggestion_verbose (
31543153 span. shrink_to_lo ( ) ,
3155- "consider borrowing here " ,
3154+ "borrowed values have a statically known size " ,
31563155 "&" ,
31573156 Applicability :: MachineApplicable ,
31583157 ) ;
3159- err. note ( "all local variables must have a statically known size" ) ;
31603158 }
31613159 Node :: Param ( param) => {
31623160 err. span_suggestion_verbose (
@@ -3168,11 +3166,20 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
31683166 ) ;
31693167 }
31703168 _ => {
3171- err. note ( "all local variables must have a statically known size" ) ;
3169+ if !tcx. sess . opts . unstable_features . is_nightly_build ( )
3170+ && !tcx. features ( ) . unsized_locals
3171+ {
3172+ err. note ( "all bindings must have a statically known size" ) ;
3173+ }
31723174 }
31733175 }
3174- if !tcx. features ( ) . unsized_locals {
3175- err. help ( "unsized locals are gated as an unstable feature" ) ;
3176+ if tcx. sess . opts . unstable_features . is_nightly_build ( )
3177+ && !tcx. features ( ) . unsized_locals
3178+ {
3179+ err. help (
3180+ "unsized locals are gated as unstable feature \
3181+ `#[feature(unsized_locals)]`",
3182+ ) ;
31763183 }
31773184 }
31783185 ObligationCauseCode :: SizedArgumentType ( hir_id) => {
@@ -3197,64 +3204,69 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
31973204 {
31983205 ty = Some ( t) ;
31993206 }
3200- if let Some ( ty) = ty {
3201- match ty. kind {
3202- hir:: TyKind :: TraitObject ( traits, _, _) => {
3203- let ( span, kw) = match traits {
3204- [ first, ..] if first. span . lo ( ) == ty. span . lo ( ) => {
3205- // Missing `dyn` in front of trait object.
3206- ( ty. span . shrink_to_lo ( ) , "dyn " )
3207- }
3208- [ first, ..] => ( ty. span . until ( first. span ) , "" ) ,
3209- [ ] => span_bug ! ( ty. span, "trait object with no traits: {ty:?}" ) ,
3210- } ;
3211- let needs_parens = traits. len ( ) != 1 ;
3212- err. span_suggestion_verbose (
3213- span,
3214- "you can use `impl Trait` as the argument type" ,
3215- "impl " ,
3216- Applicability :: MaybeIncorrect ,
3217- ) ;
3218- let sugg = if !needs_parens {
3219- vec ! [ ( span. shrink_to_lo( ) , format!( "&{kw}" ) ) ]
3220- } else {
3221- vec ! [
3222- ( span. shrink_to_lo( ) , format!( "&({kw}" ) ) ,
3223- ( ty. span. shrink_to_hi( ) , ")" . to_string( ) ) ,
3224- ]
3225- } ;
3226- err. multipart_suggestion_verbose (
3227- borrowed_msg,
3228- sugg,
3229- Applicability :: MachineApplicable ,
3230- ) ;
3231- }
3232- hir:: TyKind :: Slice ( _ty) => {
3233- err. span_suggestion_verbose (
3234- ty. span . shrink_to_lo ( ) ,
3235- "function arguments must have a statically known size, borrowed \
3236- slices always have a known size",
3237- "&" ,
3238- Applicability :: MachineApplicable ,
3239- ) ;
3240- }
3241- hir:: TyKind :: Path ( _) => {
3242- err. span_suggestion_verbose (
3243- ty. span . shrink_to_lo ( ) ,
3244- borrowed_msg,
3245- "&" ,
3246- Applicability :: MachineApplicable ,
3247- ) ;
3207+ match ty. map ( |ty| ( ty. kind , ty. span ) ) {
3208+ Some ( ( hir:: TyKind :: TraitObject ( traits, _, _) , sp) ) => {
3209+ let ( span, kw) = match traits {
3210+ [ first, ..] if first. span . lo ( ) == sp. lo ( ) => {
3211+ // Missing `dyn` in front of trait object.
3212+ ( sp. shrink_to_lo ( ) , "dyn " )
3213+ }
3214+ [ first, ..] => ( sp. until ( first. span ) , "" ) ,
3215+ [ ] => span_bug ! ( sp, "trait object with no traits: {ty:?}" ) ,
3216+ } ;
3217+ let needs_parens = traits. len ( ) != 1 ;
3218+ err. span_suggestion_verbose (
3219+ span,
3220+ "you can use `impl Trait` as the argument type" ,
3221+ "impl " ,
3222+ Applicability :: MaybeIncorrect ,
3223+ ) ;
3224+ let sugg = if !needs_parens {
3225+ vec ! [ ( span. shrink_to_lo( ) , format!( "&{kw}" ) ) ]
3226+ } else {
3227+ vec ! [
3228+ ( span. shrink_to_lo( ) , format!( "&({kw}" ) ) ,
3229+ ( sp. shrink_to_hi( ) , ")" . to_string( ) ) ,
3230+ ]
3231+ } ;
3232+ err. multipart_suggestion_verbose (
3233+ borrowed_msg,
3234+ sugg,
3235+ Applicability :: MachineApplicable ,
3236+ ) ;
3237+ }
3238+ Some ( ( hir:: TyKind :: Slice ( _ty) , span) ) => {
3239+ err. span_suggestion_verbose (
3240+ span. shrink_to_lo ( ) ,
3241+ "function arguments must have a statically known size, borrowed \
3242+ slices always have a known size",
3243+ "&" ,
3244+ Applicability :: MachineApplicable ,
3245+ ) ;
3246+ }
3247+ Some ( ( hir:: TyKind :: Path ( _) , span) ) => {
3248+ err. span_suggestion_verbose (
3249+ span. shrink_to_lo ( ) ,
3250+ borrowed_msg,
3251+ "&" ,
3252+ Applicability :: MachineApplicable ,
3253+ ) ;
3254+ }
3255+ _ => {
3256+ if !tcx. sess . opts . unstable_features . is_nightly_build ( )
3257+ && !tcx. features ( ) . unsized_fn_params
3258+ {
3259+ err. note ( "all bindings must have a statically known size" ) ;
32483260 }
3249- _ => { }
32503261 }
3251- } else {
3252- err. note ( "all function arguments must have a statically known size" ) ;
32533262 }
32543263 if tcx. sess . opts . unstable_features . is_nightly_build ( )
32553264 && !tcx. features ( ) . unsized_fn_params
32563265 {
3257- err. help ( "unsized fn params are gated as an unstable feature" ) ;
3266+ err. help (
3267+ "unsized fn params are gated as unstable feature \
3268+ `#[feature(unsized_fn_params)]`",
3269+ ) ;
32583270 }
32593271 }
32603272 ObligationCauseCode :: SizedReturnType | ObligationCauseCode :: SizedCallReturnType ( _) => {
0 commit comments