1
Fork 0

Don't walk the bodies of free constants for reachability.

This commit is contained in:
Oli Scherer 2024-03-14 17:19:06 +00:00
parent 50b07aa899
commit 22d0073d47
3 changed files with 38 additions and 8 deletions

View file

@ -29,12 +29,12 @@ use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{DefId, LocalDefId};
use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::Node;
use rustc_middle::bug;
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
use rustc_middle::middle::privacy::{self, Level};
use rustc_middle::mir::interpret::{ConstAllocation, GlobalAlloc};
use rustc_middle::mir::interpret::{ConstAllocation, ErrorHandled, GlobalAlloc};
use rustc_middle::query::Providers;
use rustc_middle::ty::{self, ExistentialTraitRef, TyCtxt};
use rustc_middle::{bug, span_bug};
use rustc_privacy::DefIdVisitor;
use rustc_session::config::CrateType;
use tracing::debug;
@ -209,8 +209,18 @@ impl<'tcx> ReachableContext<'tcx> {
// Reachable constants will be inlined into other crates
// unconditionally, so we need to make sure that their
// contents are also reachable.
hir::ItemKind::Const(_, _, init) => {
self.visit_nested_body(init);
hir::ItemKind::Const(..) => {
match self.tcx.const_eval_poly_to_alloc(item.owner_id.def_id.into()) {
Ok(alloc) => {
let alloc = self.tcx.global_alloc(alloc.alloc_id).unwrap_memory();
self.propagate_from_alloc(alloc);
}
Err(ErrorHandled::TooGeneric(span)) => span_bug!(
span,
"generic constants aren't implemented in reachability"
),
Err(ErrorHandled::Reported(..)) => {}
}
}
hir::ItemKind::Static(..) => {
if let Ok(alloc) = self.tcx.eval_static_initializer(item.owner_id.def_id) {