Rollup merge of #87811 - estebank:issue-87549, r=oli-obk

Do not ICE on HIR based WF check when involving lifetimes

Fix #87549.
This commit is contained in:
Yuki Okushi 2021-08-11 04:18:37 +09:00 committed by GitHub
commit bcef40e5fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 3 deletions

View file

@ -245,9 +245,10 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
if let ObligationCauseCode::WellFormed(Some(wf_loc)) =
root_obligation.cause.code.peel_derives()
{
if let Some(cause) =
self.tcx.diagnostic_hir_wf_check((obligation.predicate, wf_loc.clone()))
{
if let Some(cause) = self.tcx.diagnostic_hir_wf_check((
tcx.erase_regions(obligation.predicate),
wf_loc.clone(),
)) {
obligation.cause = cause;
span = obligation.cause.span;
}

View file

@ -0,0 +1,14 @@
// Regression test for #87549.
// compile-flags: -C incremental=tmp/wf/hir-wf-check-erase-regions
pub struct Table<T, const N: usize>([Option<T>; N]);
impl<'a, T, const N: usize> IntoIterator for &'a Table<T, N> {
type IntoIter = std::iter::Flatten<std::slice::Iter<'a, T>>; //~ ERROR `&T` is not an iterator
type Item = &'a T;
fn into_iter(self) -> Self::IntoIter { //~ ERROR `&T` is not an iterator
unimplemented!()
}
}
fn main() {}

View file

@ -0,0 +1,31 @@
error[E0277]: `&T` is not an iterator
--> $DIR/hir-wf-check-erase-regions.rs:7:5
|
LL | type IntoIter = std::iter::Flatten<std::slice::Iter<'a, T>>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `&T` is not an iterator
|
::: $SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL
|
LL | pub struct Flatten<I: Iterator<Item: IntoIterator>> {
| ------------ required by this bound in `Flatten`
|
= help: the trait `Iterator` is not implemented for `&T`
= note: required because of the requirements on the impl of `IntoIterator` for `&T`
error[E0277]: `&T` is not an iterator
--> $DIR/hir-wf-check-erase-regions.rs:10:27
|
LL | fn into_iter(self) -> Self::IntoIter {
| ^^^^^^^^^^^^^^ `&T` is not an iterator
|
::: $SRC_DIR/core/src/iter/adapters/flatten.rs:LL:COL
|
LL | pub struct Flatten<I: Iterator<Item: IntoIterator>> {
| ------------ required by this bound in `Flatten`
|
= help: the trait `Iterator` is not implemented for `&T`
= note: required because of the requirements on the impl of `IntoIterator` for `&T`
error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0277`.