Encode MIR for 'unreachable' non-generic fns
This commit is contained in:
parent
e40d5e83dc
commit
15cccb97d6
3 changed files with 58 additions and 25 deletions
|
@ -148,32 +148,15 @@ impl<'tcx> ReachableContext<'tcx> {
|
||||||
hir::TraitItemKind::Fn(_, hir::TraitFn::Required(_))
|
hir::TraitItemKind::Fn(_, hir::TraitFn::Required(_))
|
||||||
| hir::TraitItemKind::Type(..) => false,
|
| hir::TraitItemKind::Type(..) => false,
|
||||||
},
|
},
|
||||||
Some(Node::ImplItem(impl_item)) => {
|
Some(Node::ImplItem(impl_item)) => match impl_item.kind {
|
||||||
match impl_item.kind {
|
hir::ImplItemKind::Const(..) => true,
|
||||||
hir::ImplItemKind::Const(..) => true,
|
hir::ImplItemKind::Fn(..) => {
|
||||||
hir::ImplItemKind::Fn(..) => {
|
let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id);
|
||||||
let attrs = self.tcx.codegen_fn_attrs(def_id);
|
let impl_did = self.tcx.hir().get_parent_item(hir_id);
|
||||||
let generics = self.tcx.generics_of(def_id);
|
method_might_be_inlined(self.tcx, impl_item, impl_did)
|
||||||
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,
|
|
||||||
}
|
}
|
||||||
}
|
hir::ImplItemKind::TyAlias(_) => false,
|
||||||
|
},
|
||||||
Some(_) => false,
|
Some(_) => false,
|
||||||
None => false, // This will happen for default methods.
|
None => false, // This will happen for default methods.
|
||||||
}
|
}
|
||||||
|
|
41
src/test/ui/codegen/auxiliary/issue-97708-aux.rs
Normal file
41
src/test/ui/codegen/auxiliary/issue-97708-aux.rs
Normal file
|
@ -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
src/test/ui/codegen/issue-97708.rs
Normal file
9
src/test/ui/codegen/issue-97708.rs
Normal file
|
@ -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() {}
|
Loading…
Add table
Add a link
Reference in a new issue