@@ -22,6 +22,7 @@ use crate::hir;
2222use crate :: hir:: Node ;
2323use crate :: hir:: def_id:: DefId ;
2424use crate :: infer:: { self , InferCtxt } ;
25+ use crate :: infer:: error_reporting:: TypeAnnotationNeeded :: * ;
2526use crate :: infer:: type_variable:: { TypeVariableOrigin , TypeVariableOriginKind } ;
2627use crate :: session:: DiagnosticMessageId ;
2728use crate :: ty:: { self , AdtKind , DefIdTree , ToPredicate , ToPolyTraitRef , Ty , TyCtxt , TypeFoldable } ;
@@ -1951,7 +1952,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
19511952 return ;
19521953 }
19531954
1954- match predicate {
1955+ let mut err = match predicate {
19551956 ty:: Predicate :: Trait ( ref data) => {
19561957 let trait_ref = data. to_poly_trait_ref ( ) ;
19571958 let self_ty = trait_ref. self_ty ( ) ;
@@ -1985,73 +1986,64 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
19851986 // avoid inundating the user with unnecessary errors, but we now
19861987 // check upstream for type errors and dont add the obligations to
19871988 // begin with in those cases.
1988- if
1989- self . tcx . lang_items ( ) . sized_trait ( )
1989+ if self . tcx . lang_items ( ) . sized_trait ( )
19901990 . map_or ( false , |sized_id| sized_id == trait_ref. def_id ( ) )
19911991 {
1992- self . need_type_info_err ( body_id, span, self_ty, false ) . emit ( ) ;
1993- } else {
1994- let mut err = struct_span_err ! (
1995- self . tcx. sess,
1996- span,
1997- E0283 ,
1998- "type annotations needed: cannot resolve `{}`" ,
1999- predicate,
2000- ) ;
2001- self . note_obligation_cause ( & mut err, obligation) ;
2002- err. emit ( ) ;
1992+ self . need_type_info_err ( body_id, span, self_ty, E0282 ) . emit ( ) ;
1993+ return ;
20031994 }
1995+ let mut err = self . need_type_info_err ( body_id, span, self_ty, E0283 ) ;
1996+ err. note ( & format ! ( "cannot resolve `{}`" , predicate) ) ;
1997+ err
20041998 }
20051999
20062000 ty:: Predicate :: WellFormed ( ty) => {
20072001 // Same hacky approach as above to avoid deluging user
20082002 // with error messages.
2009- if !ty. references_error ( ) && !self . tcx . sess . has_errors ( ) {
2010- let mut err = self . need_type_info_err ( body_id, span, ty, false ) ;
2011- self . note_obligation_cause ( & mut err, obligation) ;
2012- err. emit ( ) ;
2003+ if ty. references_error ( ) || self . tcx . sess . has_errors ( ) {
2004+ return ;
20132005 }
2006+ self . need_type_info_err ( body_id, span, ty, E0282 )
20142007 }
20152008
20162009 ty:: Predicate :: Subtype ( ref data) => {
20172010 if data. references_error ( ) || self . tcx . sess . has_errors ( ) {
20182011 // no need to overload user in such cases
2019- } else {
2020- let & SubtypePredicate { a_is_expected : _, a, b } = data. skip_binder ( ) ;
2021- // both must be type variables, or the other would've been instantiated
2022- assert ! ( a. is_ty_var( ) && b. is_ty_var( ) ) ;
2023- let mut err = self . need_type_info_err ( body_id, span, a, false ) ;
2024- self . note_obligation_cause ( & mut err, obligation) ;
2025- err. emit ( ) ;
2012+ return
20262013 }
2014+ let & SubtypePredicate { a_is_expected : _, a, b } = data. skip_binder ( ) ;
2015+ // both must be type variables, or the other would've been instantiated
2016+ assert ! ( a. is_ty_var( ) && b. is_ty_var( ) ) ;
2017+ self . need_type_info_err ( body_id, span, a, E0282 )
20272018 }
20282019 ty:: Predicate :: Projection ( ref data) => {
20292020 let trait_ref = data. to_poly_trait_ref ( self . tcx ) ;
20302021 let self_ty = trait_ref. self_ty ( ) ;
20312022 if predicate. references_error ( ) {
20322023 return ;
20332024 }
2034- let mut err = self . need_type_info_err ( body_id, span, self_ty, true ) ;
2025+ let mut err = self . need_type_info_err ( body_id, span, self_ty, E0284 ) ;
20352026 err. note ( & format ! ( "cannot resolve `{}`" , predicate) ) ;
2036- self . note_obligation_cause ( & mut err, obligation) ;
2037- err. emit ( ) ;
2027+ err
20382028 }
20392029
20402030 _ => {
2041- if !self . tcx . sess . has_errors ( ) {
2042- let mut err = struct_span_err ! (
2043- self . tcx. sess,
2044- span,
2045- E0284 ,
2046- "type annotations needed: cannot resolve `{}`" ,
2047- predicate,
2048- ) ;
2049- err. span_label ( span, & format ! ( "cannot resolve `{}`" , predicate) ) ;
2050- self . note_obligation_cause ( & mut err, obligation) ;
2051- err. emit ( ) ;
2031+ if self . tcx . sess . has_errors ( ) {
2032+ return ;
20522033 }
2034+ let mut err = struct_span_err ! (
2035+ self . tcx. sess,
2036+ span,
2037+ E0284 ,
2038+ "type annotations needed: cannot resolve `{}`" ,
2039+ predicate,
2040+ ) ;
2041+ err. span_label ( span, & format ! ( "cannot resolve `{}`" , predicate) ) ;
2042+ err
20532043 }
2054- }
2044+ } ;
2045+ self . note_obligation_cause ( & mut err, obligation) ;
2046+ err. emit ( ) ;
20552047 }
20562048
20572049 /// Returns `true` if the trait predicate may apply for *some* assignment
0 commit comments