diff options
Diffstat (limited to 'compiler/rustc_hir_analysis')
| -rw-r--r-- | compiler/rustc_hir_analysis/src/check/wfcheck.rs | 25 | ||||
| -rw-r--r-- | compiler/rustc_hir_analysis/src/collect.rs | 23 | ||||
| -rw-r--r-- | compiler/rustc_hir_analysis/src/lib.rs | 6 |
3 files changed, 23 insertions, 31 deletions
diff --git a/compiler/rustc_hir_analysis/src/check/wfcheck.rs b/compiler/rustc_hir_analysis/src/check/wfcheck.rs index 8d457da89e8..c9beae5b4d4 100644 --- a/compiler/rustc_hir_analysis/src/check/wfcheck.rs +++ b/compiler/rustc_hir_analysis/src/check/wfcheck.rs @@ -1,7 +1,9 @@ use crate::autoderef::Autoderef; +use crate::collect::CollectItemTypesVisitor; use crate::constrained_generic_params::{identify_constrained_generic_params, Parameter}; use crate::errors; +use hir::intravisit::Visitor; use rustc_ast as ast; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexSet}; use rustc_errors::{codes::*, pluralize, struct_span_code_err, Applicability, ErrorGuaranteed}; @@ -225,6 +227,7 @@ fn check_item<'tcx>(tcx: TyCtxt<'tcx>, item: &'tcx hir::Item<'tcx>) -> Result<() ?item.owner_id, item.name = ? tcx.def_path_str(def_id) ); + CollectItemTypesVisitor { tcx }.visit_item(item); let res = match item.kind { // Right now we check that every default trait implementation @@ -336,9 +339,14 @@ fn check_item<'tcx>(tcx: TyCtxt<'tcx>, item: &'tcx hir::Item<'tcx>) -> Result<() res } -fn check_foreign_item(tcx: TyCtxt<'_>, item: &hir::ForeignItem<'_>) -> Result<(), ErrorGuaranteed> { +fn check_foreign_item<'tcx>( + tcx: TyCtxt<'tcx>, + item: &'tcx hir::ForeignItem<'tcx>, +) -> Result<(), ErrorGuaranteed> { let def_id = item.owner_id.def_id; + CollectItemTypesVisitor { tcx }.visit_foreign_item(item); + debug!( ?item.owner_id, item.name = ? tcx.def_path_str(def_id) @@ -355,12 +363,14 @@ fn check_foreign_item(tcx: TyCtxt<'_>, item: &hir::ForeignItem<'_>) -> Result<() } } -fn check_trait_item( - tcx: TyCtxt<'_>, - trait_item: &hir::TraitItem<'_>, +fn check_trait_item<'tcx>( + tcx: TyCtxt<'tcx>, + trait_item: &'tcx hir::TraitItem<'tcx>, ) -> Result<(), ErrorGuaranteed> { let def_id = trait_item.owner_id.def_id; + CollectItemTypesVisitor { tcx }.visit_trait_item(trait_item); + let (method_sig, span) = match trait_item.kind { hir::TraitItemKind::Fn(ref sig, _) => (Some(sig), trait_item.span), hir::TraitItemKind::Type(_bounds, Some(ty)) => (None, ty.span), @@ -895,7 +905,12 @@ fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem } } -fn check_impl_item(tcx: TyCtxt<'_>, impl_item: &hir::ImplItem<'_>) -> Result<(), ErrorGuaranteed> { +fn check_impl_item<'tcx>( + tcx: TyCtxt<'tcx>, + impl_item: &'tcx hir::ImplItem<'tcx>, +) -> Result<(), ErrorGuaranteed> { + CollectItemTypesVisitor { tcx }.visit_impl_item(impl_item); + let (method_sig, span) = match impl_item.kind { hir::ImplItemKind::Fn(ref sig, _) => (Some(sig), impl_item.span), // Constrain binding and overflow error spans to `<Ty>` in `type foo = <Ty>`. diff --git a/compiler/rustc_hir_analysis/src/collect.rs b/compiler/rustc_hir_analysis/src/collect.rs index c621867e60a..47a24a7fdc6 100644 --- a/compiler/rustc_hir_analysis/src/collect.rs +++ b/compiler/rustc_hir_analysis/src/collect.rs @@ -20,7 +20,7 @@ use rustc_data_structures::unord::UnordMap; use rustc_errors::{Applicability, Diag, ErrorGuaranteed, StashKey}; use rustc_hir as hir; use rustc_hir::def::DefKind; -use rustc_hir::def_id::{DefId, LocalDefId, LocalModDefId}; +use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::intravisit::{self, Visitor}; use rustc_hir::{GenericParamKind, Node}; use rustc_infer::infer::{InferCtxt, TyCtxtInferExt}; @@ -52,22 +52,6 @@ mod resolve_bound_vars; mod type_of; /////////////////////////////////////////////////////////////////////////// -// Main entry point - -fn collect_mod_item_types(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) { - let items = tcx.hir_module_items(module_def_id); - let hir = tcx.hir(); - let _ = items.par_items(|item| Ok(CollectItemTypesVisitor { tcx }.visit_item(hir.item(item)))); - let _ = items.par_impl_items(|item| { - Ok(CollectItemTypesVisitor { tcx }.visit_impl_item(hir.impl_item(item))) - }); - let _ = items.par_trait_items(|item| { - Ok(CollectItemTypesVisitor { tcx }.visit_trait_item(hir.trait_item(item))) - }); - let _ = items.par_foreign_items(|item| { - Ok(CollectItemTypesVisitor { tcx }.visit_foreign_item(hir.foreign_item(item))) - }); -} pub fn provide(providers: &mut Providers) { resolve_bound_vars::provide(providers); @@ -93,7 +77,6 @@ pub fn provide(providers: &mut Providers) { impl_trait_header, coroutine_kind, coroutine_for_closure, - collect_mod_item_types, is_type_alias_impl_trait, find_field, ..*providers @@ -166,8 +149,8 @@ impl<'v> Visitor<'v> for HirPlaceholderCollector { } } -struct CollectItemTypesVisitor<'tcx> { - tcx: TyCtxt<'tcx>, +pub struct CollectItemTypesVisitor<'tcx> { + pub tcx: TyCtxt<'tcx>, } /// If there are any placeholder types (`_`), emit an error explaining that this is not allowed diff --git a/compiler/rustc_hir_analysis/src/lib.rs b/compiler/rustc_hir_analysis/src/lib.rs index 77c4ff382b9..e056c0e84cf 100644 --- a/compiler/rustc_hir_analysis/src/lib.rs +++ b/compiler/rustc_hir_analysis/src/lib.rs @@ -159,12 +159,6 @@ pub fn provide(providers: &mut Providers) { pub fn check_crate(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> { let _prof_timer = tcx.sess.timer("type_check_crate"); - // this ensures that later parts of type checking can assume that items - // have valid types and not error - tcx.sess.time("type_collecting", || { - tcx.hir().for_each_module(|module| tcx.ensure().collect_mod_item_types(module)) - }); - if tcx.features().rustc_attrs { tcx.sess.time("outlives_testing", || outlives::test::test_inferred_outlives(tcx))?; } |
