//@revisions: noopt opt //@build-pass //@[noopt] compile-flags: -Copt-level=0 //@[opt] compile-flags: -O //! This passes without optimizations, so it can (and should) also pass with optimizations. struct Fail(T); impl Fail { const C: () = panic!(); } // This function is not actually called, but is mentioned implicitly as destructor in dead code in a // function that is called. Make sure we still find this error. impl Drop for Fail { fn drop(&mut self) { let _ = Fail::::C; } } #[inline(never)] fn called(x: T) { if false { let v = Fail(x); std::mem::forget(v); // Now the destructor never gets "mentioned" so this build should *not* fail. // IOW, this demonstrates that we are using a post-drop-elab notion of "mentioned". } } pub fn main() { called::(0); }