fallback for construct_generic_bound_failure
This commit is contained in:
parent
2db26d3d55
commit
a4768fea35
3 changed files with 37 additions and 8 deletions
|
@ -2444,18 +2444,22 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||||
let suggestion =
|
let suggestion =
|
||||||
if has_lifetimes { format!(" + {lt_name}") } else { format!(": {lt_name}") };
|
if has_lifetimes { format!(" + {lt_name}") } else { format!(": {lt_name}") };
|
||||||
suggs.push((sp, suggestion))
|
suggs.push((sp, suggestion))
|
||||||
} else {
|
} else if let Some(generics) = self.tcx.hir().get_generics(suggestion_scope) {
|
||||||
let generics = self.tcx.hir().get_generics(suggestion_scope).unwrap();
|
|
||||||
let pred = format!("{bound_kind}: {lt_name}");
|
let pred = format!("{bound_kind}: {lt_name}");
|
||||||
let suggestion = format!("{} {}", generics.add_where_or_trailing_comma(), pred,);
|
let suggestion = format!("{} {}", generics.add_where_or_trailing_comma(), pred);
|
||||||
suggs.push((generics.tail_span_for_predicate_suggestion(), suggestion))
|
suggs.push((generics.tail_span_for_predicate_suggestion(), suggestion))
|
||||||
|
} else {
|
||||||
|
let consider = format!("{msg} `{bound_kind}: {sub}`...");
|
||||||
|
err.help(consider);
|
||||||
}
|
}
|
||||||
|
|
||||||
err.multipart_suggestion_verbose(
|
if !suggs.is_empty() {
|
||||||
format!("{msg}"),
|
err.multipart_suggestion_verbose(
|
||||||
suggs,
|
format!("{msg}"),
|
||||||
Applicability::MaybeIncorrect, // Issue #41966
|
suggs,
|
||||||
);
|
Applicability::MaybeIncorrect, // Issue #41966
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err
|
err
|
||||||
|
|
11
tests/ui/impl-trait/in-trait/async-and-ret-ref.rs
Normal file
11
tests/ui/impl-trait/in-trait/async-and-ret-ref.rs
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
// edition:2021
|
||||||
|
// https://github.com/rust-lang/rust/issues/117547
|
||||||
|
|
||||||
|
trait T {}
|
||||||
|
|
||||||
|
trait MyTrait {
|
||||||
|
async fn foo() -> &'static impl T;
|
||||||
|
//~^ ERROR the associated type `<Self as MyTrait>::{opaque#0}` may not live long enough
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
14
tests/ui/impl-trait/in-trait/async-and-ret-ref.stderr
Normal file
14
tests/ui/impl-trait/in-trait/async-and-ret-ref.stderr
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
error[E0310]: the associated type `<Self as MyTrait>::{opaque#0}` may not live long enough
|
||||||
|
--> $DIR/async-and-ret-ref.rs:7:5
|
||||||
|
|
|
||||||
|
LL | async fn foo() -> &'static impl T;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| the associated type `<Self as MyTrait>::{opaque#0}` must be valid for the static lifetime...
|
||||||
|
| ...so that the reference type `&'static impl T` does not outlive the data it points at
|
||||||
|
|
|
||||||
|
= help: consider adding an explicit lifetime bound `<Self as MyTrait>::{opaque#0}: 'static`...
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0310`.
|
Loading…
Add table
Add a link
Reference in a new issue