Try to reword placeholder error messages to make them clearer

This commit is contained in:
lqd 2019-01-25 19:02:38 +01:00 committed by Rémy Rakic
parent 823c888be2
commit 55389f9171

View file

@ -246,7 +246,9 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
let mut counter = 0; let mut counter = 0;
let mut has_sub = None; let mut has_sub = None;
let mut has_sup = None; let mut has_sup = None;
let mut has_vid = None;
let mut actual_has_vid = None;
let mut expected_has_vid = None;
self.tcx().for_each_free_region(&expected_trait_ref, |r| { self.tcx().for_each_free_region(&expected_trait_ref, |r| {
if Some(r) == sub_placeholder && has_sub.is_none() { if Some(r) == sub_placeholder && has_sub.is_none() {
@ -256,11 +258,16 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
has_sup = Some(counter); has_sup = Some(counter);
counter += 1; counter += 1;
} }
if Some(r) == vid && expected_has_vid.is_none() {
expected_has_vid = Some(counter);
counter += 1;
}
}); });
self.tcx().for_each_free_region(&actual_trait_ref, |r| { self.tcx().for_each_free_region(&actual_trait_ref, |r| {
if Some(r) == vid && has_vid.is_none() { if Some(r) == vid && actual_has_vid.is_none() {
has_vid = Some(counter); actual_has_vid = Some(counter);
counter += 1; counter += 1;
} }
}); });
@ -274,60 +281,67 @@ impl NiceRegionError<'me, 'gcx, 'tcx> {
match (has_sub, has_sup) { match (has_sub, has_sup) {
(Some(n1), Some(n2)) => { (Some(n1), Some(n2)) => {
err.note(&format!( err.note(&format!(
"`{}` must implement `{}` \ "`{}` would have to be implemented for the type `{}`, \
for any two lifetimes `'{}` and `'{}`", for any two lifetimes `'{}` and `'{}`",
expected_trait_ref.self_ty(),
expected_trait_ref, expected_trait_ref,
expected_trait_ref.self_ty(),
std::cmp::min(n1, n2), std::cmp::min(n1, n2),
std::cmp::max(n1, n2), std::cmp::max(n1, n2),
)); ));
} }
(Some(n), _) | (_, Some(n)) => { (Some(n), _) | (_, Some(n)) => {
err.note(&format!( err.note(&format!(
"`{}` must implement `{}` \ "`{}` would have to be implemented for the type `{}`, \
for any lifetime `'{}`", for any lifetime `'{}`",
expected_trait_ref.self_ty(),
expected_trait_ref, expected_trait_ref,
expected_trait_ref.self_ty(),
n, n,
)); ));
} }
(None, None) => { (None, None) => {
err.note(&format!( err.note(&format!(
"`{}` must implement `{}`", "`{}` would have to be implemented for the type `{}`",
expected_trait_ref.self_ty(),
expected_trait_ref, expected_trait_ref,
expected_trait_ref.self_ty(),
)); ));
} }
} }
}) })
}); });
RegionHighlightMode::maybe_highlighting_region(vid, has_vid, || match has_vid { RegionHighlightMode::maybe_highlighting_region(
Some(n) => { vid,
if self_ty_has_vid { actual_has_vid.or(expected_has_vid),
|| match actual_has_vid {
Some(n) => {
if self_ty_has_vid {
err.note(&format!(
"but `{}` is actually implemented for the type `{}`, \
for the specific lifetime `'{}`",
actual_trait_ref,
actual_trait_ref.self_ty(),
n
));
} else {
err.note(&format!(
"but `{}` is actually implemented for the type `{}`, \
for some lifetime `'{}`",
actual_trait_ref,
actual_trait_ref.self_ty(),
n
));
}
}
_ => {
err.note(&format!( err.note(&format!(
"but `{}` only implements `{}` for the lifetime `'{}`", "but `{}` is actually implemented for the type `{}`",
actual_trait_ref.self_ty(),
actual_trait_ref, actual_trait_ref,
n
));
} else {
err.note(&format!(
"but `{}` only implements `{}` for some lifetime `'{}`",
actual_trait_ref.self_ty(), actual_trait_ref.self_ty(),
actual_trait_ref,
n
)); ));
} }
} }
None => { );
err.note(&format!(
"but `{}` only implements `{}`",
actual_trait_ref.self_ty(),
actual_trait_ref,
));
}
});
err.emit(); err.emit();
ErrorReported ErrorReported