1
+ use crate :: errors:: RegionOriginNote ;
1
2
use crate :: infer:: error_reporting:: { note_and_explain_region, ObligationCauseExt } ;
2
3
use 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
+ } ;
4
8
use rustc_middle:: traits:: ObligationCauseCode ;
5
9
use rustc_middle:: ty:: error:: TypeError ;
6
10
use rustc_middle:: ty:: { self , Region } ;
7
11
8
12
impl < ' a , ' tcx > InferCtxt < ' a , ' tcx > {
9
13
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 | {
11
15
let sub_count = err. children . iter ( ) . filter ( |d| d. span . is_dummy ( ) ) . count ( ) ;
12
16
let expanded_sub_count = err. children . iter ( ) . filter ( |d| !d. span . is_dummy ( ) ) . count ( ) ;
13
17
let span_is_primary = err. span . primary_spans ( ) . iter ( ) . all ( |& sp| sp == span) ;
@@ -20,77 +24,70 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
20
24
}
21
25
} ;
22
26
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 ) ,
41
31
}
32
+ . add_to_diagnostic ( err) ,
42
33
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)
44
37
}
45
38
infer:: ReborrowUpvar ( span, ref upvar_id) => {
46
39
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) ;
48
47
}
49
48
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) ;
51
52
}
52
53
infer:: DataBorrowed ( ty, span) => {
53
- label_or_note (
54
+ RegionOriginNote :: WithName {
54
55
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 ) ;
60
61
}
61
62
infer:: ReferenceOutlivesReferent ( ty, span) => {
62
- label_or_note (
63
+ RegionOriginNote :: WithName {
63
64
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 ) ;
69
70
}
70
- infer:: RelateParamBound ( span, t , opt_span) => {
71
- label_or_note (
71
+ infer:: RelateParamBound ( span, ty , opt_span) => {
72
+ RegionOriginNote :: WithName {
72
73
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) ;
79
79
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) ;
81
82
}
82
83
}
83
84
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) ;
88
87
}
89
88
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) ;
94
91
}
95
92
infer:: CheckAssociatedTypeBounds { ref parent, .. } => {
96
93
self . note_region_origin ( err, & parent) ;
0 commit comments