Fix ICE due to unwrap in probe_for_name_many

This commit is contained in:
Gurinder Singh 2024-06-08 08:43:08 +05:30
parent 76e7a0849c
commit 6d87fc8747
5 changed files with 72 additions and 11 deletions

View File

@ -827,7 +827,8 @@ fn annotate_alternative_method_deref(
) else {
return;
};
let in_scope_methods = self.probe_for_name_many(
let Ok(in_scope_methods) = self.probe_for_name_many(
probe::Mode::MethodCall,
path.ident,
Some(expected),
@ -835,11 +836,14 @@ fn annotate_alternative_method_deref(
self_ty,
deref.hir_id,
probe::ProbeScope::TraitsInScope,
);
) else {
return;
};
let other_methods_in_scope: Vec<_> =
in_scope_methods.iter().filter(|c| c.item.def_id != pick.item.def_id).collect();
let all_methods = self.probe_for_name_many(
let Ok(all_methods) = self.probe_for_name_many(
probe::Mode::MethodCall,
path.ident,
Some(expected),
@ -847,7 +851,10 @@ fn annotate_alternative_method_deref(
self_ty,
deref.hir_id,
probe::ProbeScope::AllTraits,
);
) else {
return;
};
let suggestions: Vec<_> = all_methods
.into_iter()
.filter(|c| c.item.def_id != pick.item.def_id)

View File

@ -306,7 +306,7 @@ pub(crate) fn probe_for_name_many(
self_ty: Ty<'tcx>,
scope_expr_id: HirId,
scope: ProbeScope,
) -> Vec<Candidate<'tcx>> {
) -> Result<Vec<Candidate<'tcx>>, MethodError<'tcx>> {
self.probe_op(
item_name.span,
mode,
@ -324,7 +324,6 @@ pub(crate) fn probe_for_name_many(
.collect())
},
)
.unwrap()
}
pub(crate) fn probe_op<OP, R>(

View File

@ -1640,10 +1640,7 @@ fn lookup_segments_chain_for_no_match_method(
.unwrap_or(Ty::new_misc_error(self.tcx)),
);
// FIXME: `probe_for_name_many` searches for methods in inherent implementations,
// so it may return a candidate that doesn't belong to this `revr_ty`. We need to
// check whether the instantiated type matches the received one.
for _matched_method in self.probe_for_name_many(
let Ok(candidates) = self.probe_for_name_many(
Mode::MethodCall,
item_name,
None,
@ -1651,7 +1648,14 @@ fn lookup_segments_chain_for_no_match_method(
rcvr_ty,
source_expr.hir_id,
ProbeScope::TraitsInScope,
) {
) else {
return;
};
// FIXME: `probe_for_name_many` searches for methods in inherent implementations,
// so it may return a candidate that doesn't belong to this `revr_ty`. We need to
// check whether the instantiated type matches the received one.
for _matched_method in candidates {
// found a match, push to stack
stack_methods.push(rcvr_ty);
}

View File

@ -0,0 +1,11 @@
// Regression test for ICE #125876
fn main() {
std::ptr::from_ref(num).cast_mut().as_deref();
//~^ ERROR cannot find value `num` in this scope
//~| ERROR no method named `as_deref` found for raw pointer `*mut _` in the current scope
//~| WARN type annotations needed
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
//~| WARN type annotations needed
//~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
}

View File

@ -0,0 +1,40 @@
error[E0425]: cannot find value `num` in this scope
--> $DIR/ice-unwrap-probe-many-result-125876.rs:4:24
|
LL | std::ptr::from_ref(num).cast_mut().as_deref();
| ^^^ not found in this scope
warning: type annotations needed
--> $DIR/ice-unwrap-probe-many-result-125876.rs:4:29
|
LL | std::ptr::from_ref(num).cast_mut().as_deref();
| ^^^^^^^^
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #46906 <https://github.com/rust-lang/rust/issues/46906>
= note: `#[warn(tyvar_behind_raw_pointer)]` on by default
warning: type annotations needed
--> $DIR/ice-unwrap-probe-many-result-125876.rs:4:40
|
LL | std::ptr::from_ref(num).cast_mut().as_deref();
| ^^^^^^^^
|
= warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
= note: for more information, see issue #46906 <https://github.com/rust-lang/rust/issues/46906>
error[E0599]: no method named `as_deref` found for raw pointer `*mut _` in the current scope
--> $DIR/ice-unwrap-probe-many-result-125876.rs:4:40
|
LL | std::ptr::from_ref(num).cast_mut().as_deref();
| ^^^^^^^^
|
help: there is a method `as_ref` with a similar name
|
LL | std::ptr::from_ref(num).cast_mut().as_ref();
| ~~~~~~
error: aborting due to 2 previous errors; 2 warnings emitted
Some errors have detailed explanations: E0425, E0599.
For more information about an error, try `rustc --explain E0425`.