@@ -3137,11 +3137,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
3137
3137
Node :: LetStmt ( hir:: LetStmt { ty : Some ( ty) , .. } ) => {
3138
3138
err. span_suggestion_verbose (
3139
3139
ty. span . shrink_to_lo ( ) ,
3140
- "consider borrowing here " ,
3140
+ "borrowed types have a statically known size " ,
3141
3141
"&" ,
3142
3142
Applicability :: MachineApplicable ,
3143
3143
) ;
3144
- err. note ( "all local variables must have a statically known size" ) ;
3145
3144
}
3146
3145
Node :: LetStmt ( hir:: LetStmt {
3147
3146
init : Some ( hir:: Expr { kind : hir:: ExprKind :: Index ( ..) , span, .. } ) ,
@@ -3152,11 +3151,10 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
3152
3151
// order to use have a slice instead.
3153
3152
err. span_suggestion_verbose (
3154
3153
span. shrink_to_lo ( ) ,
3155
- "consider borrowing here " ,
3154
+ "borrowed values have a statically known size " ,
3156
3155
"&" ,
3157
3156
Applicability :: MachineApplicable ,
3158
3157
) ;
3159
- err. note ( "all local variables must have a statically known size" ) ;
3160
3158
}
3161
3159
Node :: Param ( param) => {
3162
3160
err. span_suggestion_verbose (
@@ -3168,11 +3166,20 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
3168
3166
) ;
3169
3167
}
3170
3168
_ => {
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
+ }
3172
3174
}
3173
3175
}
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
+ ) ;
3176
3183
}
3177
3184
}
3178
3185
ObligationCauseCode :: SizedArgumentType ( hir_id) => {
@@ -3197,64 +3204,69 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
3197
3204
{
3198
3205
ty = Some ( t) ;
3199
3206
}
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" ) ;
3248
3260
}
3249
- _ => { }
3250
3261
}
3251
- } else {
3252
- err. note ( "all function arguments must have a statically known size" ) ;
3253
3262
}
3254
3263
if tcx. sess . opts . unstable_features . is_nightly_build ( )
3255
3264
&& !tcx. features ( ) . unsized_fn_params
3256
3265
{
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
+ ) ;
3258
3270
}
3259
3271
}
3260
3272
ObligationCauseCode :: SizedReturnType | ObligationCauseCode :: SizedCallReturnType ( _) => {
0 commit comments