Closed
Description
This example causes an ICE, which I believe is due to the fact that it requires an infinite series of functions to compile monomorphically:
iface to_opt {
fn to_option() -> option<self>;
}
impl of to_opt for uint {
fn to_option() -> option<uint> {
some(self)
}
}
impl<T:copy> of to_opt for option<T> {
fn to_option() -> option<option<T>> {
some(self)
}
}
fn function<T:to_opt>(counter: uint, t: T) {
if counter > 0u {
function(counter - 1u, t.to_option());
}
}
fn main() {
function(22u, 22u);
}
Clearly, I don't think we should compile such a thing. But we should give a better error. It's somewhat unclear to me where would be the best place to detect this pattern.