Skip to content

DoubleEndedIterator implementation causes overflow libcore build #88

Closed
@compiler-errors

Description

@compiler-errors

Minimized when trying to build core:

#![feature(associated_type_bounds)]

use std::iter::FlatMap;

trait DoubleEndedIterator: Iterator {
    fn next_back(&mut self) -> Option<Self::Item>;
}

impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F>
where
    F: FnMut(I::Item) -> U,
    U: IntoIterator,
    <U as IntoIterator>::IntoIter: DoubleEndedIterator, //~ This line is bad, specifically b/c `DoubleEndedIterator` has the `Iterator` supertrait, I believe.
{
    fn next_back(&mut self) -> Option<U::Item> {
        todo!()
    }
}

I think it's because the solver is having trouble projecting <<U as IntoIterator>::IntoIter as Iterator>::Item into <U as IntoIterator>::Item. It should be possible to do that via this item bound type IntoIter: Iterator<Item = Self::Item>.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions