Avoid ICE in printing RPITIT type

This commit is contained in:
Michael Goulet 2022-10-02 20:25:48 +00:00
parent 39323a5877
commit 90a8d67491
3 changed files with 39 additions and 1 deletions

View File

@ -927,7 +927,7 @@ pub trait PrettyPrinter<'tcx>:
// unless we can find out what generator return type it comes from.
let term = if let Some(ty) = term.skip_binder().ty()
&& let ty::Projection(proj) = ty.kind()
&& let assoc = tcx.associated_item(proj.item_def_id)
&& let Some(assoc) = tcx.opt_associated_item(proj.item_def_id)
&& assoc.trait_container(tcx) == tcx.lang_items().gen_trait()
&& assoc.name == rustc_span::sym::Return
{

View File

@ -0,0 +1,24 @@
#![feature(return_position_impl_trait_in_trait)]
#![allow(incomplete_features)]
use std::fmt::Display;
use std::ops::Deref;
trait Foo {
fn bar(self) -> impl Deref<Target = impl Display + ?Sized>;
}
struct A;
impl Foo for A {
fn bar(self) -> &'static str {
"Hello, world"
}
}
fn foo<T: Foo>(t: T) {
let () = t.bar();
//~^ ERROR mismatched types
}
fn main() {}

View File

@ -0,0 +1,14 @@
error[E0308]: mismatched types
--> $DIR/issue-102571.rs:20:9
|
LL | let () = t.bar();
| ^^ ------- this expression has type `impl Deref<Target = impl std::fmt::Display + ?Sized>`
| |
| expected associated type, found `()`
|
= note: expected associated type `impl Deref<Target = impl std::fmt::Display + ?Sized>`
found unit type `()`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.