| // 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<T: Primitive> { pub data: [T; 1] } |
| |
| impl<T: Primitive + 'static> Pixel for Luma<T> { |
| type Subpixel = T; |
| } |
| |
| pub struct ImageBuffer<P: Pixel, Container> { |
| pixels: P, |
| c: Container, |
| } |
| |
| pub trait GenericImage: Sized { |
| type Pixel: Pixel; |
| } |
| |
| pub trait Pixel: Copy + Clone { |
| type Subpixel: Primitive; |
| } |
| |
| pub trait Primitive: Copy + PartialOrd<Self> + Clone { |
| } |
| |
| impl<P, Container> GenericImage for ImageBuffer<P, Container> |
| where P: Pixel + 'static, |
| Container: Deref<Target=[P::Subpixel]> + DerefMut, |
| P::Subpixel: 'static { |
| |
| type Pixel = P; |
| } |
| |
| impl Primitive for u8 { } |
| |
| impl<P, Container> ImageBuffer<P, Container> |
| where P: Pixel + 'static, |
| P::Subpixel: 'static, |
| Container: Deref<Target=[P::Subpixel]> |
| { |
| pub fn pixels<'a>(&'a self) -> Pixels<'a, Self> { |
| loop { } |
| } |
| |
| pub fn pixels_mut(&mut self) -> PixelsMut<P> { |
| 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<Pix>(image: &ImageBuffer<Pix, Vec<u8>>) |
| -> ImageBuffer<Luma<u8>, Vec<u8>> |
| where Pix: Pixel<Subpixel=u8> + '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() { } |