Skip to content

Commit

Permalink
Quick fix for rust-lang#96223.
Browse files Browse the repository at this point in the history
  • Loading branch information
ricked-twice committed May 3, 2022
1 parent e1df625 commit bfcd191
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -866,7 +866,13 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
return false;
}

let orig_ty = old_pred.self_ty().skip_binder();
// This is a quick fix to resolve an ICE ([issue#96223](https://github.com/rust-lang/rust/issues/96223)).
// This change should probably be deeper.
// As suggested by @jackh726, `mk_trait_obligation_with_new_self_ty` could take a `Binder<(TraitRef, Ty)>
// instead of `Binder<Ty>` leading to some changes to its call places.
let Some(orig_ty) = old_pred.self_ty().no_bound_vars() else {
return false;
};
let mk_result = |new_ty| {
let obligation =
self.mk_trait_obligation_with_new_self_ty(param_env, old_pred, new_ty);
Expand Down
53 changes: 53 additions & 0 deletions src/test/ui/suggestions/issue-96223.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// Test case for #96223.
// An ICE was triggered because of a failed assertion.
// Thanks to @Manishearth for the minimal test case.

pub trait Foo<'de>: Sized {}

pub trait Bar<'a>: 'static {
type Inner: 'a;
}

pub trait Fubar {
type Bar: for<'a> Bar<'a>;
}

pub struct Baz<T>(pub T);

impl<'de, T> Foo<'de> for Baz<T> where T: Foo<'de> {}

struct Empty;

impl<M> Dummy<M> for Empty
where
M: Fubar,
for<'de> Baz<<M::Bar as Bar<'de>>::Inner>: Foo<'de>,
{
}

pub trait Dummy<M>
where
M: Fubar,
{
}

pub struct EmptyBis<'a>(&'a [u8]);

impl<'a> Bar<'a> for EmptyBis<'static> {
type Inner = EmptyBis<'a>;
}

pub struct EmptyMarker;

impl Fubar for EmptyMarker {
type Bar = EmptyBis<'static>;
}

fn icey_bounds<D: Dummy<EmptyMarker>>(p: &D) {}

fn trigger_ice() {
let p = Empty;
icey_bounds(&p); //~ERROR
}

fn main() {}
28 changes: 28 additions & 0 deletions src/test/ui/suggestions/issue-96223.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
error[E0277]: the trait bound `for<'de> EmptyBis<'de>: Foo<'_>` is not satisfied
--> $DIR/issue-96223.rs:50:17
|
LL | icey_bounds(&p);
| ----------- ^^ the trait `for<'de> Foo<'_>` is not implemented for `EmptyBis<'de>`
| |
| required by a bound introduced by this call
|
= help: the trait `Foo<'de>` is implemented for `Baz<T>`
note: required because of the requirements on the impl of `for<'de> Foo<'de>` for `Baz<EmptyBis<'de>>`
--> $DIR/issue-96223.rs:17:14
|
LL | impl<'de, T> Foo<'de> for Baz<T> where T: Foo<'de> {}
| ^^^^^^^^ ^^^^^^
note: required because of the requirements on the impl of `Dummy<EmptyMarker>` for `Empty`
--> $DIR/issue-96223.rs:21:9
|
LL | impl<M> Dummy<M> for Empty
| ^^^^^^^^ ^^^^^
note: required by a bound in `icey_bounds`
--> $DIR/issue-96223.rs:46:19
|
LL | fn icey_bounds<D: Dummy<EmptyMarker>>(p: &D) {}
| ^^^^^^^^^^^^^^^^^^ required by this bound in `icey_bounds`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.

0 comments on commit bfcd191

Please sign in to comment.