Skip to content

Commit

Permalink
Skip pub structs with repr(c) and repr(transparent) in dead code anal…
Browse files Browse the repository at this point in the history
…ysis
  • Loading branch information
mu001999 committed Jul 26, 2024
1 parent 83d6768 commit 6bf42d0
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
6 changes: 5 additions & 1 deletion compiler/rustc_passes/src/dead.rs
Original file line number Diff line number Diff line change
Expand Up @@ -927,7 +927,11 @@ fn create_and_seed_worklist(
match tcx.def_kind(id) {
DefKind::Impl { .. } => false,
DefKind::AssocConst | DefKind::AssocTy | DefKind::AssocFn => !matches!(tcx.associated_item(id).container, AssocItemContainer::ImplContainer),
DefKind::Struct => struct_all_fields_are_public(tcx, id) || has_allow_dead_code_or_lang_attr(tcx, id).is_some(),
DefKind::Struct => struct_all_fields_are_public(tcx, id) || has_allow_dead_code_or_lang_attr(tcx, id).is_some() || {
let def = tcx.adt_def(id);
// often declared in Rust but constructed by FFI, so ignore
def.repr().c() || def.repr().transparent()
},
_ => true
})
.map(|id| (id, ComesFromAllowExpect::No))
Expand Down
39 changes: 39 additions & 0 deletions tests/ui/lint/dead-code/not-lint-structs-constructed-externally.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//@ check-pass
#![deny(dead_code)]

#[repr(C)]
pub struct Foo {
pub i: i16,
align: i16
}

mod ffi {
use super::*;

extern "C" {
pub fn DomPromise_AddRef(promise: *const Promise);
pub fn DomPromise_Release(promise: *const Promise);
}
}

#[repr(C)]
pub struct Promise {
private: [u8; 0],
__nosync: ::std::marker::PhantomData<::std::rc::Rc<u8>>,
}

pub unsafe trait RefCounted {
unsafe fn addref(&self);
unsafe fn release(&self);
}

unsafe impl RefCounted for Promise {
unsafe fn addref(&self) {
ffi::DomPromise_AddRef(self)
}
unsafe fn release(&self) {
ffi::DomPromise_Release(self)
}
}

fn main() {}

0 comments on commit 6bf42d0

Please sign in to comment.