Return early to avoid ICE

This commit is contained in:
Yuki Okushi 2020-05-30 18:48:54 +09:00
parent 4bd32c9804
commit 77503578e1
No known key found for this signature in database
GPG Key ID: B0986C85C0E2DAA1
5 changed files with 46 additions and 7 deletions

View File

@ -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,

View File

@ -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 {

View 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();
}

View 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`.

View File

@ -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))
} }