1+ use crate :: errors:: RegionOriginNote ;
12use crate :: infer:: error_reporting:: { note_and_explain_region, ObligationCauseExt } ;
23use crate :: infer:: { self , InferCtxt , SubregionOrigin } ;
3- use rustc_errors:: { struct_span_err, Diagnostic , DiagnosticBuilder , ErrorGuaranteed } ;
4+ use rustc_errors:: {
5+ fluent, struct_span_err, AddSubdiagnostic , Diagnostic , DiagnosticBuilder , DiagnosticMessage ,
6+ ErrorGuaranteed ,
7+ } ;
48use rustc_middle:: traits:: ObligationCauseCode ;
59use rustc_middle:: ty:: error:: TypeError ;
610use rustc_middle:: ty:: { self , Region } ;
711
812impl < ' a , ' tcx > InferCtxt < ' a , ' tcx > {
913 pub ( super ) fn note_region_origin ( & self , err : & mut Diagnostic , origin : & SubregionOrigin < ' tcx > ) {
10- let mut label_or_note = |span, msg : & str | {
14+ let mut label_or_note = |span, msg : DiagnosticMessage | {
1115 let sub_count = err. children . iter ( ) . filter ( |d| d. span . is_dummy ( ) ) . count ( ) ;
1216 let expanded_sub_count = err. children . iter ( ) . filter ( |d| !d. span . is_dummy ( ) ) . count ( ) ;
1317 let span_is_primary = err. span . primary_spans ( ) . iter ( ) . all ( |& sp| sp == span) ;
@@ -20,77 +24,70 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
2024 }
2125 } ;
2226 match * origin {
23- infer:: Subtype ( ref trace) => {
24- if let Some ( ( expected, found) ) = self . values_str ( trace. values ) {
25- label_or_note (
26- trace. cause . span ,
27- & format ! ( "...so that the {}" , trace. cause. as_requirement_str( ) ) ,
28- ) ;
29-
30- err. note_expected_found ( & "" , expected, & "" , found) ;
31- } else {
32- // FIXME: this really should be handled at some earlier stage. Our
33- // handling of region checking when type errors are present is
34- // *terrible*.
35-
36- label_or_note (
37- trace. cause . span ,
38- & format ! ( "...so that {}" , trace. cause. as_requirement_str( ) ) ,
39- ) ;
40- }
27+ infer:: Subtype ( ref trace) => RegionOriginNote :: WithRequirement {
28+ span : trace. cause . span ,
29+ requirement : trace. cause . as_requirement_localised ( ) ,
30+ expected_found : self . values_str ( trace. values ) ,
4131 }
32+ . add_to_diagnostic ( err) ,
4233 infer:: Reborrow ( span) => {
43- label_or_note ( span, "...so that reference does not outlive borrowed content" ) ;
34+ label_or_note ( span, fluent:: infer:: reborrow) ;
35+ RegionOriginNote :: Plain { span, msg : fluent:: infer:: reborrow }
36+ . add_to_diagnostic ( err)
4437 }
4538 infer:: ReborrowUpvar ( span, ref upvar_id) => {
4639 let var_name = self . tcx . hir ( ) . name ( upvar_id. var_path . hir_id ) ;
47- label_or_note ( span, & format ! ( "...so that closure can access `{}`" , var_name) ) ;
40+ RegionOriginNote :: WithName {
41+ span,
42+ msg : fluent:: infer:: reborrow,
43+ name : & var_name. to_string ( ) ,
44+ continues : false ,
45+ }
46+ . add_to_diagnostic ( err) ;
4847 }
4948 infer:: RelateObjectBound ( span) => {
50- label_or_note ( span, "...so that it can be closed over into an object" ) ;
49+ label_or_note ( span, fluent:: infer:: relate_object_bound) ;
50+ RegionOriginNote :: Plain { span, msg : fluent:: infer:: relate_object_bound }
51+ . add_to_diagnostic ( err) ;
5152 }
5253 infer:: DataBorrowed ( ty, span) => {
53- label_or_note (
54+ RegionOriginNote :: WithName {
5455 span,
55- & format ! (
56- "...so that the type `{}` is not borrowed for too long" ,
57- self . ty_to_string ( ty )
58- ) ,
59- ) ;
56+ msg : fluent :: infer :: data_borrowed ,
57+ name : & self . ty_to_string ( ty ) ,
58+ continues : false ,
59+ }
60+ . add_to_diagnostic ( err ) ;
6061 }
6162 infer:: ReferenceOutlivesReferent ( ty, span) => {
62- label_or_note (
63+ RegionOriginNote :: WithName {
6364 span,
64- & format ! (
65- "...so that the reference type `{}` does not outlive the data it points at" ,
66- self . ty_to_string ( ty )
67- ) ,
68- ) ;
65+ msg : fluent :: infer :: reference_outlives_referent ,
66+ name : & self . ty_to_string ( ty ) ,
67+ continues : false ,
68+ }
69+ . add_to_diagnostic ( err ) ;
6970 }
70- infer:: RelateParamBound ( span, t , opt_span) => {
71- label_or_note (
71+ infer:: RelateParamBound ( span, ty , opt_span) => {
72+ RegionOriginNote :: WithName {
7273 span,
73- & format ! (
74- "...so that the type `{}` will meet its required lifetime bounds{}" ,
75- self . ty_to_string( t) ,
76- if opt_span. is_some( ) { "..." } else { "" } ,
77- ) ,
78- ) ;
74+ msg : fluent:: infer:: relate_param_bound,
75+ name : & self . ty_to_string ( ty) ,
76+ continues : opt_span. is_some ( ) ,
77+ }
78+ . add_to_diagnostic ( err) ;
7979 if let Some ( span) = opt_span {
80- err. span_note ( span, "...that is required by this bound" ) ;
80+ RegionOriginNote :: Plain { span, msg : fluent:: infer:: relate_param_bound_2 }
81+ . add_to_diagnostic ( err) ;
8182 }
8283 }
8384 infer:: RelateRegionParamBound ( span) => {
84- label_or_note (
85- span,
86- "...so that the declared lifetime parameter bounds are satisfied" ,
87- ) ;
85+ RegionOriginNote :: Plain { span, msg : fluent:: infer:: relate_region_param_bound }
86+ . add_to_diagnostic ( err) ;
8887 }
8988 infer:: CompareImplItemObligation { span, .. } => {
90- label_or_note (
91- span,
92- "...so that the definition in impl matches the definition from the trait" ,
93- ) ;
89+ RegionOriginNote :: Plain { span, msg : fluent:: infer:: compare_impl_item_obligation }
90+ . add_to_diagnostic ( err) ;
9491 }
9592 infer:: CheckAssociatedTypeBounds { ref parent, .. } => {
9693 self . note_region_origin ( err, & parent) ;
0 commit comments