// Because drop recursion can only be detected after drop elaboration which // happens for codegen: // build-fail #![deny(unconditional_recursion)] #![allow(dead_code)] pub struct RecursiveDrop; impl Drop for RecursiveDrop { fn drop(&mut self) { //~ ERROR function cannot return without recursing let _ = RecursiveDrop; } } #[derive(Default)] struct NotRecursiveDrop1; impl Drop for NotRecursiveDrop1 { fn drop(&mut self) { // Before drop elaboration, the MIR can look like a recursive drop will // occur. But it will not, since forget() prevents drop() from running. let taken = std::mem::take(self); std::mem::forget(taken); } } struct NotRecursiveDrop2; impl Drop for NotRecursiveDrop2 { fn drop(&mut self) { // Before drop elaboration, the MIR can look like a recursive drop will // occur. But it will not, since this will panic. std::panic::panic_any(NotRecursiveDrop2); } } fn main() {}