// This is a regression test for the ICE from issue #10846. // // The original issue causing the ICE: the LUB-computations during // type inference were encountering late-bound lifetimes, and // asserting that such lifetimes should have already been substituted // with a concrete lifetime. // // However, those encounters were occurring within the lexical scope // of the binding for the late-bound lifetime; that is, the late-bound // lifetimes were perfectly valid. The core problem was that the type // folding code was over-zealously passing back all lifetimes when // doing region-folding, when really all clients of the region-folding // case only want to see *free* lifetime variables, not bound ones. #![feature(box_syntax)] pub fn main() { fn explicit() { fn test(_x: Option>) where F: FnMut(Box FnMut(&'a isize)>) {} test(Some(box |_f: Box FnMut(&'a isize)>| {})); } // The code below is shorthand for the code above (and more likely // to represent what one encounters in practice). fn implicit() { fn test(_x: Option>) where F: FnMut(Box) {} test(Some(box |_f: Box| {})); } explicit(); implicit(); }