Skip to content

Inconsistent recursive fn call elimination #125698

@Rudxain

Description

@Rudxain

I tried this code:

#[inline(never)] #[no_mangle] const fn deep(n: usize) { match n { 0 => (), _ => deep(n - 1), } } #[inline(always)] const fn inf() -> ! { inf() } fn main() { deep(usize::MAX); println!("✅"); inf(); }

I expected to see this happen: prints "✅" fast and successfully, then hangs in an infinite loop.

Instead, this happened: prints "✅" fast and panics with stderr:

 Compiling playground v0.0.1 (/playground) Finished `release` profile [optimized] target(s) in 0.38s Running `target/release/playground` thread 'main' has overflowed its stack fatal runtime error: stack overflow 

It seems commenting-out the attributes is no-op here.

Meta

https://play.rust-lang.org/?version=nightly&mode=release&edition=2021&gist=ed0941cd328e49d8737fdff01cd4a4aa

rustc --version --verbose:

1.80.0-nightly (2024-05-28 da159eb331b27df52818) 
Backtrace

<no diff> 

Apologies in advance, if this issue is a dupe. I tried my best to find similar ones

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-LLVMArea: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues.C-bugCategory: This is a bug.F-explicit_tail_calls`#![feature(explicit_tail_calls)]`T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions