Skip to content

Commit

Permalink
Rollup merge of #97716 - compiler-errors:issue-97708, r=wesleywiser
Browse files Browse the repository at this point in the history
Fix reachability analysis for const methods

Use `method_might_be_inlined` directly for `ImplItemKind::Fn` instead of duplicating the logic in `def_id_represents_local_inlined_item`.

This is parallel to how we use `item_might_be_inlined` for `ItemKind::Fn` in that same body.

Fixes #97708
  • Loading branch information
Dylan-DPC authored Jun 4, 2022
2 parents 9c794b4 + 15cccb9 commit 9917f38
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 25 deletions.
33 changes: 8 additions & 25 deletions compiler/rustc_passes/src/reachable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,32 +148,15 @@ impl<'tcx> ReachableContext<'tcx> {
hir::TraitItemKind::Fn(_, hir::TraitFn::Required(_))
| hir::TraitItemKind::Type(..) => false,
},
Some(Node::ImplItem(impl_item)) => {
match impl_item.kind {
hir::ImplItemKind::Const(..) => true,
hir::ImplItemKind::Fn(..) => {
let attrs = self.tcx.codegen_fn_attrs(def_id);
let generics = self.tcx.generics_of(def_id);
if generics.requires_monomorphization(self.tcx) || attrs.requests_inline() {
true
} else {
let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
let impl_did = self.tcx.hir().get_parent_item(hir_id);
// Check the impl. If the generics on the self
// type of the impl require inlining, this method
// does too.
match self.tcx.hir().expect_item(impl_did).kind {
hir::ItemKind::Impl { .. } => {
let generics = self.tcx.generics_of(impl_did);
generics.requires_monomorphization(self.tcx)
}
_ => false,
}
}
}
hir::ImplItemKind::TyAlias(_) => false,
Some(Node::ImplItem(impl_item)) => match impl_item.kind {
hir::ImplItemKind::Const(..) => true,
hir::ImplItemKind::Fn(..) => {
let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
let impl_did = self.tcx.hir().get_parent_item(hir_id);
method_might_be_inlined(self.tcx, impl_item, impl_did)
}
}
hir::ImplItemKind::TyAlias(_) => false,
},
Some(_) => false,
None => false, // This will happen for default methods.
}
Expand Down
41 changes: 41 additions & 0 deletions src/test/ui/codegen/auxiliary/issue-97708-aux.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
use std::{ptr::NonNull, task::Poll};

struct TaskRef;

struct Header {
vtable: &'static Vtable,
}

struct Vtable {
poll: unsafe fn(TaskRef) -> Poll<()>,
deallocate: unsafe fn(NonNull<Header>),
}

// in the "Header" type, which is a private type in maitake
impl Header {
pub(crate) const fn new_stub() -> Self {
unsafe fn nop(_ptr: TaskRef) -> Poll<()> {
Poll::Pending
}

unsafe fn nop_deallocate(ptr: NonNull<Header>) {
unreachable!("stub task ({ptr:p}) should never be deallocated!");
}

Self { vtable: &Vtable { poll: nop, deallocate: nop_deallocate } }
}
}

// This is a public type in `maitake`
#[repr(transparent)]
#[cfg_attr(loom, allow(dead_code))]
pub struct TaskStub {
hdr: Header,
}

impl TaskStub {
/// Create a new unique stub [`Task`].
pub const fn new() -> Self {
Self { hdr: Header::new_stub() }
}
}
9 changes: 9 additions & 0 deletions src/test/ui/codegen/issue-97708.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// build-pass
// aux-build:issue-97708-aux.rs

extern crate issue_97708_aux;
use issue_97708_aux::TaskStub;

static TASK_STUB: TaskStub = TaskStub::new();

fn main() {}

0 comments on commit 9917f38

Please sign in to comment.