Do not try to report on closures to avoid ICE

This commit is contained in:
Yuki Okushi 2020-10-23 18:00:18 +09:00
parent f58ffc9381
commit 7b4c397b73
3 changed files with 35 additions and 0 deletions

View File

@ -39,6 +39,14 @@ pub(super) fn try_report_static_impl_trait(&self) -> Option<ErrorReported> {
) if **sub_r == RegionKind::ReStatic => {
// This is for an implicit `'static` requirement coming from `impl dyn Trait {}`.
if let ObligationCauseCode::UnifyReceiver(ctxt) = &cause.code {
// This may have a closure and it would cause ICE
// through `find_param_with_region` (#78262).
let anon_reg_sup = tcx.is_suitable_region(sup_r)?;
let fn_returns = tcx.return_type_impl_or_dyn_traits(anon_reg_sup.def_id);
if fn_returns.is_empty() {
return None;
}
let param = self.find_param_with_region(sup_r, sub_r)?;
let lifetime = if sup_r.has_name() {
format!("lifetime `{}`", sup_r)

View File

@ -0,0 +1,9 @@
trait TT {}
impl dyn TT {
fn func(&self) {}
}
fn main() {
let f = |x: &dyn TT| x.func(); //~ ERROR: mismatched types
}

View File

@ -0,0 +1,18 @@
error[E0308]: mismatched types
--> $DIR/issue-78262.rs:8:28
|
LL | let f = |x: &dyn TT| x.func();
| ^^^^ lifetime mismatch
|
= note: expected reference `&(dyn TT + 'static)`
found reference `&dyn TT`
note: the anonymous lifetime #1 defined on the body at 8:13...
--> $DIR/issue-78262.rs:8:13
|
LL | let f = |x: &dyn TT| x.func();
| ^^^^^^^^^^^^^^^^^^^^^
= note: ...does not necessarily outlive the static lifetime
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.