//@ compile-flags:-Zverbose-internals #![allow(warnings)] #![feature(rustc_attrs)] use std::cell::Cell; // Invoke in such a way that the callee knows: // // - 'a: 'x // // and it must prove that `T: 'x`. Callee passes along `T: 'a`. fn twice<'a, F, T>(v: Cell<&'a ()>, value: T, mut f: F) where F: for<'x> FnMut(Option>, &T), { f(None, &value); f(None, &value); } #[rustc_regions] fn generic(value: T) { let cell = Cell::new(&()); twice(cell, value, |a, b| invoke(a, b)); } #[rustc_regions] fn generic_fail<'a, T>(cell: Cell<&'a ()>, value: T) { twice(cell, value, |a, b| invoke(a, b)); //~^ ERROR the parameter type `T` may not live long enough } fn invoke<'a, 'x, T>(x: Option>, y: &T) where T: 'x, { } fn main() {}