Skip to content

Fact propagation fails when combined with drop, panics, and memory swaps #114533

Open
@SUPERCILEX

Description

@SUPERCILEX
use std::mem;

struct Foo(Vec<u32>);

impl Drop for Foo {
    fn drop(&mut self) {
        if self.0.is_empty() {
            return;
        }

        let v = mem::take(&mut self.0);

        panic!("dead");
    }
}

pub fn foo() {
    let a = Foo(Vec::new());
    unsafe {unknown(9);}
}

extern "Rust" {
    fn unknown(x: i32) -> bool;
}

https://rust.godbolt.org/z/ra7bj7zf1

Related issue: #114532. Notice that in this case drop is called before ret so this code can't be eliminated yet (I think).

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.I-slowIssue: Problems and improvements with respect to performance of generated code.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