Skip to content

Commit

Permalink
Account for RPITITs in opt_suggest_box_span
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Dec 17, 2022
1 parent 65c53c3 commit 7df33a0
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 3 deletions.
14 changes: 11 additions & 3 deletions compiler/rustc_hir_typeck/src/_match.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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))
}
Expand Down
49 changes: 49 additions & 0 deletions src/test/ui/impl-trait/in-trait/box-coerce-span-in-default.rs
Original file line number Diff line number Diff line change
@@ -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!");
}
11 changes: 11 additions & 0 deletions src/test/ui/impl-trait/in-trait/box-coerce-span-in-default.stderr
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 7df33a0

Please sign in to comment.