Return early to avoid ICE
This commit is contained in:
parent
4bd32c9804
commit
77503578e1
@ -1909,6 +1909,12 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
|
|||||||
|
|
||||||
let self_ty = self.resolve_vars_if_possible(&trait_ref.self_ty());
|
let self_ty = self.resolve_vars_if_possible(&trait_ref.self_ty());
|
||||||
|
|
||||||
|
// Do not check on infer_types to avoid panic in evaluate_obligation.
|
||||||
|
if self_ty.has_infer_types() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let self_ty = self.tcx.erase_regions(&self_ty);
|
||||||
|
|
||||||
let impls_future = self.tcx.type_implements_trait((
|
let impls_future = self.tcx.type_implements_trait((
|
||||||
future_trait,
|
future_trait,
|
||||||
self_ty,
|
self_ty,
|
||||||
|
@ -540,13 +540,6 @@ fn type_implements_trait<'tcx>(
|
|||||||
trait_def_id, ty, params, param_env
|
trait_def_id, ty, params, param_env
|
||||||
);
|
);
|
||||||
|
|
||||||
// Do not check on infer_types to avoid panic in evaluate_obligation.
|
|
||||||
if ty.has_infer_types() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let ty = tcx.erase_regions(&ty);
|
|
||||||
|
|
||||||
let trait_ref = ty::TraitRef { def_id: trait_def_id, substs: tcx.mk_substs_trait(ty, params) };
|
let trait_ref = ty::TraitRef { def_id: trait_def_id, substs: tcx.mk_substs_trait(ty, params) };
|
||||||
|
|
||||||
let obligation = Obligation {
|
let obligation = Obligation {
|
||||||
|
20
src/test/ui/suggestions/issue-72766.rs
Normal file
20
src/test/ui/suggestions/issue-72766.rs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// edition:2018
|
||||||
|
// compile-flags: -Cincremental=tmp/issue-72766
|
||||||
|
|
||||||
|
pub struct SadGirl;
|
||||||
|
|
||||||
|
impl SadGirl {
|
||||||
|
pub async fn call(&self) -> Result<(), ()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn async_main() -> Result<(), ()> {
|
||||||
|
// should be `.call().await?`
|
||||||
|
SadGirl {}.call()?; //~ ERROR: the `?` operator can only be applied to values
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = async_main();
|
||||||
|
}
|
15
src/test/ui/suggestions/issue-72766.stderr
Normal file
15
src/test/ui/suggestions/issue-72766.stderr
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
error[E0277]: the `?` operator can only be applied to values that implement `std::ops::Try`
|
||||||
|
--> $DIR/issue-72766.rs:14:5
|
||||||
|
|
|
||||||
|
LL | SadGirl {}.call()?;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| the `?` operator cannot be applied to type `impl std::future::Future`
|
||||||
|
| help: consider using `.await` here: `SadGirl {}.call().await?`
|
||||||
|
|
|
||||||
|
= help: the trait `std::ops::Try` is not implemented for `impl std::future::Future`
|
||||||
|
= note: required by `std::ops::Try::into_result`
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
@ -323,6 +323,11 @@ pub fn implements_trait<'a, 'tcx>(
|
|||||||
trait_id: DefId,
|
trait_id: DefId,
|
||||||
ty_params: &[GenericArg<'tcx>],
|
ty_params: &[GenericArg<'tcx>],
|
||||||
) -> bool {
|
) -> bool {
|
||||||
|
// Do not check on infer_types to avoid panic in evaluate_obligation.
|
||||||
|
if ty.has_infer_types() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
let ty = cx.tcx.erase_regions(&ty);
|
||||||
let ty_params = cx.tcx.mk_substs(ty_params.iter());
|
let ty_params = cx.tcx.mk_substs(ty_params.iter());
|
||||||
cx.tcx.type_implements_trait((trait_id, ty, ty_params, cx.param_env))
|
cx.tcx.type_implements_trait((trait_id, ty, ty_params, cx.param_env))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user