Account for RPITITs in opt_suggest_box_span
This commit is contained in:
parent
65c53c3bb6
commit
7df33a093c
@ -526,7 +526,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
None
|
||||
}
|
||||
})?;
|
||||
let opaque_ty = self.tcx.mk_opaque(rpit_def_id, substs);
|
||||
|
||||
if !self.can_coerce(first_ty, expected) || !self.can_coerce(second_ty, expected) {
|
||||
return None;
|
||||
@ -540,13 +539,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
{
|
||||
let pred = pred.kind().rebind(match pred.kind().skip_binder() {
|
||||
ty::PredicateKind::Clause(ty::Clause::Trait(trait_pred)) => {
|
||||
assert_eq!(trait_pred.trait_ref.self_ty(), opaque_ty);
|
||||
// FIXME(rpitit): This will need to be fixed when we move to associated types
|
||||
assert!(matches!(
|
||||
*trait_pred.trait_ref.self_ty().kind(),
|
||||
ty::Alias(_, ty::AliasTy { def_id, substs, .. })
|
||||
if def_id == rpit_def_id && substs == substs
|
||||
));
|
||||
ty::PredicateKind::Clause(ty::Clause::Trait(
|
||||
trait_pred.with_self_ty(self.tcx, ty),
|
||||
))
|
||||
}
|
||||
ty::PredicateKind::Clause(ty::Clause::Projection(mut proj_pred)) => {
|
||||
assert_eq!(proj_pred.projection_ty.self_ty(), opaque_ty);
|
||||
assert!(matches!(
|
||||
*proj_pred.projection_ty.self_ty().kind(),
|
||||
ty::Alias(_, ty::AliasTy { def_id, substs, .. })
|
||||
if def_id == rpit_def_id && substs == substs
|
||||
));
|
||||
proj_pred = proj_pred.with_self_ty(self.tcx, ty);
|
||||
ty::PredicateKind::Clause(ty::Clause::Projection(proj_pred))
|
||||
}
|
||||
|
@ -0,0 +1,49 @@
|
||||
// check-pass
|
||||
|
||||
#![feature(return_position_impl_trait_in_trait)]
|
||||
//~^ WARN the feature `return_position_impl_trait_in_trait` is incomplete
|
||||
|
||||
struct TestA {}
|
||||
struct TestB {}
|
||||
|
||||
impl TestTrait for TestA {
|
||||
type Output = ();
|
||||
}
|
||||
impl TestTrait for TestB {
|
||||
type Output = ();
|
||||
}
|
||||
|
||||
trait TestTrait {
|
||||
type Output;
|
||||
}
|
||||
|
||||
impl<A, B> TestTrait for GreeterOutput<A, B>
|
||||
where
|
||||
A: TestTrait<Output = ()>,
|
||||
B: TestTrait<Output = ()>,
|
||||
{
|
||||
type Output = ();
|
||||
}
|
||||
|
||||
enum GreeterOutput<A, B>
|
||||
where
|
||||
A: TestTrait<Output = ()>,
|
||||
B: TestTrait<Output = ()>,
|
||||
{
|
||||
SayHello(A),
|
||||
SayGoodbye(B),
|
||||
}
|
||||
|
||||
trait Greeter {
|
||||
fn test_func(&self, func: &str) -> impl TestTrait<Output = ()> {
|
||||
match func {
|
||||
"SayHello" => GreeterOutput::SayHello(TestA {}),
|
||||
"SayGoodbye" => GreeterOutput::SayGoodbye(TestB {}),
|
||||
_ => GreeterOutput::SayHello(TestA {}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
warning: the feature `return_position_impl_trait_in_trait` is incomplete and may not be safe to use and/or cause compiler crashes
|
||||
--> $DIR/box-coerce-span-in-default.rs:3:12
|
||||
|
|
||||
LL | #![feature(return_position_impl_trait_in_trait)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #91611 <https://github.com/rust-lang/rust/issues/91611> for more information
|
||||
= note: `#[warn(incomplete_features)]` on by default
|
||||
|
||||
warning: 1 warning emitted
|
||||
|
Loading…
x
Reference in New Issue
Block a user