// run-pass #![allow(dead_code)] #![allow(unused_variables)] #![allow(unreachable_code)] // A regression test extracted from image-0.3.11. The point of // failure was in `index_colors` below. use std::ops::{Deref, DerefMut}; #[derive(Copy, Clone)] pub struct Luma { pub data: [T; 1] } impl Pixel for Luma { type Subpixel = T; } pub struct ImageBuffer { pixels: P, c: Container, } pub trait GenericImage: Sized { type Pixel: Pixel; } pub trait Pixel: Copy + Clone { type Subpixel: Primitive; } pub trait Primitive: Copy + PartialOrd + Clone { } impl GenericImage for ImageBuffer where P: Pixel + 'static, Container: Deref + DerefMut, P::Subpixel: 'static { type Pixel = P; } impl Primitive for u8 { } impl ImageBuffer where P: Pixel + 'static, P::Subpixel: 'static, Container: Deref { pub fn pixels<'a>(&'a self) -> Pixels<'a, Self> { loop { } } pub fn pixels_mut(&mut self) -> PixelsMut

{ loop { } } } pub struct Pixels<'a, I: 'a> { image: &'a I, x: u32, y: u32, width: u32, height: u32 } impl<'a, I: GenericImage> Iterator for Pixels<'a, I> { type Item = (u32, u32, I::Pixel); fn next(&mut self) -> Option<(u32, u32, I::Pixel)> { loop { } } } pub struct PixelsMut<'a, P: Pixel + 'a> where P::Subpixel: 'a { chunks: &'a mut P::Subpixel } impl<'a, P: Pixel + 'a> Iterator for PixelsMut<'a, P> where P::Subpixel: 'a { type Item = &'a mut P; fn next(&mut self) -> Option<&'a mut P> { loop { } } } pub fn index_colors(image: &ImageBuffer>) -> ImageBuffer, Vec> where Pix: Pixel + 'static, { // When NLL-enabled, `let mut` below is deemed unnecessary (due to // the remaining code being unreachable); so ignore that lint. #![allow(unused_mut)] let mut indices: ImageBuffer<_,Vec<_>> = loop { }; for (pixel, idx) in image.pixels().zip(indices.pixels_mut()) { // failured occurred here ^^ because we were requiring that we // could project Pixel or Subpixel from `T_indices` (type of // `indices`), but the type is insufficiently constrained // until we reach the return below. } indices } fn main() { }