Do not report an excessive number of overflow errors for an ever-growing deref impl
This commit is contained in:
parent
394c4060d2
commit
d8a646fe77
5 changed files with 61 additions and 3 deletions
|
@ -2942,7 +2942,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
) -> Vec<(Vec<&'tcx ty::FieldDef>, GenericArgsRef<'tcx>)> {
|
||||
debug!("get_field_candidates(span: {:?}, base_t: {:?}", span, base_ty);
|
||||
|
||||
self.autoderef(span, base_ty)
|
||||
let mut autoderef = self.autoderef(span, base_ty).silence_errors();
|
||||
let deref_chain: Vec<_> = autoderef.by_ref().collect();
|
||||
|
||||
// Don't probe if we hit the recursion limit, since it may result in
|
||||
// quadratic blowup if we then try to further deref the results of this
|
||||
// function. This is a best-effort method, after all.
|
||||
if autoderef.reached_recursion_limit() {
|
||||
return vec![];
|
||||
}
|
||||
|
||||
deref_chain
|
||||
.into_iter()
|
||||
.filter_map(move |(base_t, _)| {
|
||||
match base_t.kind() {
|
||||
ty::Adt(base_def, args) if !base_def.is_enum() => {
|
||||
|
|
|
@ -375,7 +375,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
// If our autoderef loop had reached the recursion limit,
|
||||
// report an overflow error, but continue going on with
|
||||
// the truncated autoderef list.
|
||||
if steps.reached_recursion_limit {
|
||||
if steps.reached_recursion_limit && !is_suggestion.0 {
|
||||
self.probe(|_| {
|
||||
let ty = &steps
|
||||
.steps
|
||||
|
|
|
@ -672,7 +672,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
let mut ty_str_reported = ty_str.clone();
|
||||
if let ty::Adt(_, generics) = rcvr_ty.kind() {
|
||||
if generics.len() > 0 {
|
||||
let mut autoderef = self.autoderef(span, rcvr_ty);
|
||||
let mut autoderef = self.autoderef(span, rcvr_ty).silence_errors();
|
||||
let candidate_found = autoderef.any(|(ty, _)| {
|
||||
if let ty::Adt(adt_def, _) = ty.kind() {
|
||||
self.tcx
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue