1
- use crate :: infer:: type_variable:: TypeVariableOriginKind ;
1
+ use crate :: infer:: type_variable:: { TypeVariableOrigin , TypeVariableOriginKind } ;
2
2
use crate :: infer:: InferCtxt ;
3
3
use rustc_errors:: { pluralize, struct_span_err, Applicability , DiagnosticBuilder , ErrorGuaranteed } ;
4
4
use rustc_hir as hir;
@@ -8,12 +8,12 @@ use rustc_hir::def_id::DefId;
8
8
use rustc_hir:: intravisit:: { self , Visitor } ;
9
9
use rustc_hir:: { Body , Closure , Expr , ExprKind , FnRetTy , HirId , Local , LocalSource } ;
10
10
use rustc_middle:: hir:: nested_filter;
11
- use rustc_middle:: infer:: unify_key:: ConstVariableOriginKind ;
11
+ use rustc_middle:: infer:: unify_key:: { ConstVariableOrigin , ConstVariableOriginKind } ;
12
12
use rustc_middle:: ty:: adjustment:: { Adjust , Adjustment , AutoBorrow , AutoBorrowMutability } ;
13
13
use rustc_middle:: ty:: print:: { FmtPrinter , PrettyPrinter , Print , Printer } ;
14
14
use rustc_middle:: ty:: subst:: { GenericArg , GenericArgKind , Subst , SubstsRef } ;
15
15
use rustc_middle:: ty:: { self , DefIdTree , InferConst } ;
16
- use rustc_middle:: ty:: { Ty , TyCtxt , TypeckResults } ;
16
+ use rustc_middle:: ty:: { IsSuggestable , Ty , TyCtxt , TypeckResults } ;
17
17
use rustc_span:: symbol:: { kw, Ident } ;
18
18
use rustc_span:: { BytePos , Span } ;
19
19
use std:: borrow:: Cow ;
@@ -407,11 +407,40 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
407
407
408
408
err. span_label ( span, cannot_infer_msg) ;
409
409
410
- let printer = fmt_printer ( self , Namespace :: TypeNS ) ;
411
- let args = printer. comma_sep ( generic_args. iter ( ) . copied ( ) ) . unwrap ( ) . into_buffer ( ) ;
410
+ let args = fmt_printer ( self , Namespace :: TypeNS )
411
+ . comma_sep ( generic_args. iter ( ) . copied ( ) . map ( |arg| {
412
+ if arg. is_suggestable ( self . tcx , true ) {
413
+ return arg;
414
+ }
415
+
416
+ match arg. unpack ( ) {
417
+ GenericArgKind :: Lifetime ( _) => bug ! ( "unexpected lifetime" ) ,
418
+ GenericArgKind :: Type ( _) => self
419
+ . next_ty_var ( TypeVariableOrigin {
420
+ span : rustc_span:: DUMMY_SP ,
421
+ kind : TypeVariableOriginKind :: MiscVariable ,
422
+ } )
423
+ . into ( ) ,
424
+ GenericArgKind :: Const ( arg) => self
425
+ . next_const_var (
426
+ arg. ty ( ) ,
427
+ ConstVariableOrigin {
428
+ span : rustc_span:: DUMMY_SP ,
429
+ kind : ConstVariableOriginKind :: MiscVariable ,
430
+ } ,
431
+ )
432
+ . into ( ) ,
433
+ }
434
+ } ) )
435
+ . unwrap ( )
436
+ . into_buffer ( ) ;
437
+
412
438
err. span_suggestion_verbose (
413
439
insert_span,
414
- & format ! ( "consider specifying the generic argument{}" , pluralize!( args. len( ) ) , ) ,
440
+ & format ! (
441
+ "consider specifying the generic argument{}" ,
442
+ pluralize!( generic_args. len( ) ) ,
443
+ ) ,
415
444
format ! ( "::<{}>" , args) ,
416
445
Applicability :: HasPlaceholders ,
417
446
) ;
0 commit comments