1- use crate :: infer:: type_variable:: TypeVariableOriginKind ;
1+ use crate :: infer:: type_variable:: { TypeVariableOrigin , TypeVariableOriginKind } ;
22use crate :: infer:: InferCtxt ;
33use rustc_errors:: { pluralize, struct_span_err, Applicability , DiagnosticBuilder , ErrorGuaranteed } ;
44use rustc_hir as hir;
@@ -8,12 +8,12 @@ use rustc_hir::def_id::DefId;
88use rustc_hir:: intravisit:: { self , Visitor } ;
99use rustc_hir:: { Body , Closure , Expr , ExprKind , FnRetTy , HirId , Local , LocalSource } ;
1010use rustc_middle:: hir:: nested_filter;
11- use rustc_middle:: infer:: unify_key:: ConstVariableOriginKind ;
11+ use rustc_middle:: infer:: unify_key:: { ConstVariableOrigin , ConstVariableOriginKind } ;
1212use rustc_middle:: ty:: adjustment:: { Adjust , Adjustment , AutoBorrow , AutoBorrowMutability } ;
1313use rustc_middle:: ty:: print:: { FmtPrinter , PrettyPrinter , Print , Printer } ;
1414use rustc_middle:: ty:: subst:: { GenericArg , GenericArgKind , Subst , SubstsRef } ;
1515use rustc_middle:: ty:: { self , DefIdTree , InferConst } ;
16- use rustc_middle:: ty:: { Ty , TyCtxt , TypeckResults } ;
16+ use rustc_middle:: ty:: { IsSuggestable , Ty , TyCtxt , TypeckResults } ;
1717use rustc_span:: symbol:: { kw, Ident } ;
1818use rustc_span:: { BytePos , Span } ;
1919use std:: borrow:: Cow ;
@@ -407,11 +407,40 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
407407
408408 err. span_label ( span, cannot_infer_msg) ;
409409
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+
412438 err. span_suggestion_verbose (
413439 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+ ) ,
415444 format ! ( "::<{}>" , args) ,
416445 Applicability :: HasPlaceholders ,
417446 ) ;
0 commit comments