Auto merge of #78134 - bugadani:arena-nodrop, r=lcnr
Use `DroplessArena` where we know the type doesn't need drop This PR uses a single `DroplessArena` in resolve instead of three separate `TypedArena`s. `DroplessArena` checks that the type indeed doesn't need drop, so in case the types change, this will result in visible failures.
This commit is contained in:
commit
6b9fbf212a
3 changed files with 11 additions and 13 deletions
|
@ -19,7 +19,7 @@ pub use rustc_hir::def::{Namespace, PerNS};
|
||||||
|
|
||||||
use Determinacy::*;
|
use Determinacy::*;
|
||||||
|
|
||||||
use rustc_arena::TypedArena;
|
use rustc_arena::{DroplessArena, TypedArena};
|
||||||
use rustc_ast::node_id::NodeMap;
|
use rustc_ast::node_id::NodeMap;
|
||||||
use rustc_ast::unwrap_or;
|
use rustc_ast::unwrap_or;
|
||||||
use rustc_ast::visit::{self, Visitor};
|
use rustc_ast::visit::{self, Visitor};
|
||||||
|
@ -1035,12 +1035,10 @@ pub struct Resolver<'a> {
|
||||||
pub struct ResolverArenas<'a> {
|
pub struct ResolverArenas<'a> {
|
||||||
modules: TypedArena<ModuleData<'a>>,
|
modules: TypedArena<ModuleData<'a>>,
|
||||||
local_modules: RefCell<Vec<Module<'a>>>,
|
local_modules: RefCell<Vec<Module<'a>>>,
|
||||||
name_bindings: TypedArena<NameBinding<'a>>,
|
|
||||||
imports: TypedArena<Import<'a>>,
|
imports: TypedArena<Import<'a>>,
|
||||||
name_resolutions: TypedArena<RefCell<NameResolution<'a>>>,
|
name_resolutions: TypedArena<RefCell<NameResolution<'a>>>,
|
||||||
macro_rules_bindings: TypedArena<MacroRulesBinding<'a>>,
|
|
||||||
ast_paths: TypedArena<ast::Path>,
|
ast_paths: TypedArena<ast::Path>,
|
||||||
pattern_spans: TypedArena<Span>,
|
dropless: DroplessArena,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> ResolverArenas<'a> {
|
impl<'a> ResolverArenas<'a> {
|
||||||
|
@ -1055,7 +1053,7 @@ impl<'a> ResolverArenas<'a> {
|
||||||
self.local_modules.borrow()
|
self.local_modules.borrow()
|
||||||
}
|
}
|
||||||
fn alloc_name_binding(&'a self, name_binding: NameBinding<'a>) -> &'a NameBinding<'a> {
|
fn alloc_name_binding(&'a self, name_binding: NameBinding<'a>) -> &'a NameBinding<'a> {
|
||||||
self.name_bindings.alloc(name_binding)
|
self.dropless.alloc(name_binding)
|
||||||
}
|
}
|
||||||
fn alloc_import(&'a self, import: Import<'a>) -> &'a Import<'_> {
|
fn alloc_import(&'a self, import: Import<'a>) -> &'a Import<'_> {
|
||||||
self.imports.alloc(import)
|
self.imports.alloc(import)
|
||||||
|
@ -1067,13 +1065,13 @@ impl<'a> ResolverArenas<'a> {
|
||||||
&'a self,
|
&'a self,
|
||||||
binding: MacroRulesBinding<'a>,
|
binding: MacroRulesBinding<'a>,
|
||||||
) -> &'a MacroRulesBinding<'a> {
|
) -> &'a MacroRulesBinding<'a> {
|
||||||
self.macro_rules_bindings.alloc(binding)
|
self.dropless.alloc(binding)
|
||||||
}
|
}
|
||||||
fn alloc_ast_paths(&'a self, paths: &[ast::Path]) -> &'a [ast::Path] {
|
fn alloc_ast_paths(&'a self, paths: &[ast::Path]) -> &'a [ast::Path] {
|
||||||
self.ast_paths.alloc_from_iter(paths.iter().cloned())
|
self.ast_paths.alloc_from_iter(paths.iter().cloned())
|
||||||
}
|
}
|
||||||
fn alloc_pattern_spans(&'a self, spans: impl Iterator<Item = Span>) -> &'a [Span] {
|
fn alloc_pattern_spans(&'a self, spans: impl Iterator<Item = Span>) -> &'a [Span] {
|
||||||
self.pattern_spans.alloc_from_iter(spans)
|
self.dropless.alloc_from_iter(spans)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
//! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/variance.html
|
//! [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/variance.html
|
||||||
|
|
||||||
use hir::Node;
|
use hir::Node;
|
||||||
use rustc_arena::TypedArena;
|
use rustc_arena::DroplessArena;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
|
||||||
use rustc_middle::ty::query::Providers;
|
use rustc_middle::ty::query::Providers;
|
||||||
|
@ -32,8 +32,8 @@ pub fn provide(providers: &mut Providers) {
|
||||||
|
|
||||||
fn crate_variances(tcx: TyCtxt<'_>, crate_num: CrateNum) -> CrateVariancesMap<'_> {
|
fn crate_variances(tcx: TyCtxt<'_>, crate_num: CrateNum) -> CrateVariancesMap<'_> {
|
||||||
assert_eq!(crate_num, LOCAL_CRATE);
|
assert_eq!(crate_num, LOCAL_CRATE);
|
||||||
let mut arena = TypedArena::default();
|
let arena = DroplessArena::default();
|
||||||
let terms_cx = terms::determine_parameters_to_be_inferred(tcx, &mut arena);
|
let terms_cx = terms::determine_parameters_to_be_inferred(tcx, &arena);
|
||||||
let constraints_cx = constraints::add_constraints_from_crate(terms_cx);
|
let constraints_cx = constraints::add_constraints_from_crate(terms_cx);
|
||||||
solve::solve_constraints(constraints_cx)
|
solve::solve_constraints(constraints_cx)
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
// `InferredIndex` is a newtype'd int representing the index of such
|
// `InferredIndex` is a newtype'd int representing the index of such
|
||||||
// a variable.
|
// a variable.
|
||||||
|
|
||||||
use rustc_arena::TypedArena;
|
use rustc_arena::DroplessArena;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
use rustc_hir::itemlikevisit::ItemLikeVisitor;
|
||||||
use rustc_hir::HirIdMap;
|
use rustc_hir::HirIdMap;
|
||||||
|
@ -47,7 +47,7 @@ impl<'a> fmt::Debug for VarianceTerm<'a> {
|
||||||
|
|
||||||
pub struct TermsContext<'a, 'tcx> {
|
pub struct TermsContext<'a, 'tcx> {
|
||||||
pub tcx: TyCtxt<'tcx>,
|
pub tcx: TyCtxt<'tcx>,
|
||||||
pub arena: &'a TypedArena<VarianceTerm<'a>>,
|
pub arena: &'a DroplessArena,
|
||||||
|
|
||||||
// For marker types, UnsafeCell, and other lang items where
|
// For marker types, UnsafeCell, and other lang items where
|
||||||
// variance is hardcoded, records the item-id and the hardcoded
|
// variance is hardcoded, records the item-id and the hardcoded
|
||||||
|
@ -64,7 +64,7 @@ pub struct TermsContext<'a, 'tcx> {
|
||||||
|
|
||||||
pub fn determine_parameters_to_be_inferred<'a, 'tcx>(
|
pub fn determine_parameters_to_be_inferred<'a, 'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
arena: &'a mut TypedArena<VarianceTerm<'a>>,
|
arena: &'a DroplessArena,
|
||||||
) -> TermsContext<'a, 'tcx> {
|
) -> TermsContext<'a, 'tcx> {
|
||||||
let mut terms_cx = TermsContext {
|
let mut terms_cx = TermsContext {
|
||||||
tcx,
|
tcx,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue