Skip to content

Commit 2c71cdf

Browse files
committed
auto merge of #13071 : ktt3ja/rust/deterministic-lifetime-suggestion, r=cmr
Close #13057
2 parents 5da14c0 + 19d913b commit 2c71cdf

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

src/librustc/middle/typeck/infer/error_reporting.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -195,13 +195,15 @@ impl<'a> ErrorReporting for InferCtxt<'a> {
195195
// failed (so the return value of this method should not be used)
196196
fn process_errors(&self, errors: &Vec<RegionResolutionError>)
197197
-> Vec<RegionResolutionError> {
198+
debug!("process_errors()");
198199
let mut var_origins = Vec::new();
199200
let mut trace_origins = Vec::new();
200201
let mut same_regions = Vec::new();
201202
let mut processed_errors = Vec::new();
202203
for error in errors.iter() {
203204
match *error {
204205
ConcreteFailure(origin, sub, sup) => {
206+
debug!("processing ConcreteFailure")
205207
let trace = match origin {
206208
infer::Subtype(trace) => Some(trace),
207209
_ => None,
@@ -218,6 +220,7 @@ impl<'a> ErrorReporting for InferCtxt<'a> {
218220
}
219221
}
220222
SubSupConflict(var_origin, _, sub_r, _, sup_r) => {
223+
debug!("processing SubSupConflict")
221224
match free_regions_from_same_fn(self.tcx, sub_r, sup_r) {
222225
Some(ref same_frs) => {
223226
var_origins.push(var_origin);
@@ -237,10 +240,13 @@ impl<'a> ErrorReporting for InferCtxt<'a> {
237240
// declaration, we want to make sure that they are, in fact,
238241
// from the same scope
239242
if sr.scope_id != common_scope_id {
243+
debug!("returning empty result from process_errors because
244+
{} != {}", sr.scope_id, common_scope_id);
240245
return vec!();
241246
}
242247
}
243248
let pe = ProcessedErrors(var_origins, trace_origins, same_regions);
249+
debug!("errors processed: {:?}", pe);
244250
processed_errors.push(pe);
245251
}
246252
return processed_errors;
@@ -256,6 +262,7 @@ impl<'a> ErrorReporting for InferCtxt<'a> {
256262
sub: Region,
257263
sup: Region)
258264
-> Option<FreeRegionsFromSameFn> {
265+
debug!("free_regions_from_same_fn(sub={:?}, sup={:?})", sub, sup);
259266
let (scope_id, fr1, fr2) = match (sub, sup) {
260267
(ReFree(fr1), ReFree(fr2)) => {
261268
if fr1.scope_id != fr2.scope_id {
@@ -284,7 +291,10 @@ impl<'a> ErrorReporting for InferCtxt<'a> {
284291
},
285292
_ => None
286293
},
287-
None => None
294+
None => {
295+
debug!("no parent node of scope_id {}", scope_id)
296+
None
297+
}
288298
}
289299
}
290300

src/librustc/middle/typeck/infer/region_inference/mod.rs

+18-2
Original file line numberDiff line numberDiff line change
@@ -1117,17 +1117,33 @@ impl<'a> RegionVarBindings<'a> {
11171117
{
11181118
// Errors in expanding nodes result from a lower-bound that is
11191119
// not contained by an upper-bound.
1120-
let (lower_bounds, lower_dup) =
1120+
let (mut lower_bounds, lower_dup) =
11211121
self.collect_concrete_regions(graph, var_data, node_idx,
11221122
graph::Incoming, dup_vec);
1123-
let (upper_bounds, upper_dup) =
1123+
let (mut upper_bounds, upper_dup) =
11241124
self.collect_concrete_regions(graph, var_data, node_idx,
11251125
graph::Outgoing, dup_vec);
11261126

11271127
if lower_dup || upper_dup {
11281128
return;
11291129
}
11301130

1131+
// We place free regions first because we are special casing
1132+
// SubSupConflict(ReFree, ReFree) when reporting error, and so
1133+
// the user will more likely get a specific suggestion.
1134+
fn free_regions_first(a: &RegionAndOrigin,
1135+
b: &RegionAndOrigin)
1136+
-> Ordering {
1137+
match (a.region, b.region) {
1138+
(ReFree(..), ReFree(..)) => Equal,
1139+
(ReFree(..), _) => Less,
1140+
(_, ReFree(..)) => Greater,
1141+
(_, _) => Equal,
1142+
}
1143+
}
1144+
lower_bounds.sort_by(|a, b| { free_regions_first(a, b) });
1145+
upper_bounds.sort_by(|a, b| { free_regions_first(a, b) });
1146+
11311147
for lower_bound in lower_bounds.iter() {
11321148
for upper_bound in upper_bounds.iter() {
11331149
if !self.is_subregion_of(lower_bound.region,

0 commit comments

Comments
 (0)