Skip to content

Monomorphizing an infinitely expanding fn generates an ICE #2220

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Closed
nikomatsakis opened this issue Apr 16, 2012 · 0 comments
Closed

Monomorphizing an infinitely expanding fn generates an ICE #2220

nikomatsakis opened this issue Apr 16, 2012 · 0 comments
Labels
A-codegen Area: Code generation I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics.

Comments

@nikomatsakis
Copy link
Contributor

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.

@ghost ghost assigned marijnh Apr 19, 2012
celinval pushed a commit to celinval/rust-dev that referenced this issue Jun 4, 2024
BoxyUwU pushed a commit to BoxyUwU/rust that referenced this issue Jan 29, 2025
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
A-codegen Area: Code generation I-crash Issue: The compiler crashes (SIGSEGV, SIGABRT, etc). Use I-ICE instead when the compiler panics.
Projects
None yet
Development

No branches or pull requests

2 participants