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());
|
||||
|
||||
// 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((
|
||||
future_trait,
|
||||
self_ty,
|
||||
|
@ -540,13 +540,6 @@ fn type_implements_trait<'tcx>(
|
||||
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 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,
|
||||
ty_params: &[GenericArg<'tcx>],
|
||||
) -> 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());
|
||||
cx.tcx.type_implements_trait((trait_id, ty, ty_params, cx.param_env))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user