diff options
| author | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2024-02-23 11:45:44 +0000 |
|---|---|---|
| committer | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2024-03-07 14:26:31 +0000 |
| commit | ae50e36dfa9a249f661ad959bf07eccc9581f4f2 (patch) | |
| tree | 38b6c17a5f535ba48379c627f5308c5f03c8a718 /compiler | |
| parent | 42ab88d747ba3da906e0cfaccb5de633f44d5aa6 (diff) | |
| download | rust-ae50e36dfa9a249f661ad959bf07eccc9581f4f2.tar.gz rust-ae50e36dfa9a249f661ad959bf07eccc9581f4f2.zip | |
Merge collect_mod_item_types query into check_well_formed
Diffstat (limited to 'compiler')
| -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 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/query/mod.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_middle/src/values.rs | 21 |
5 files changed, 45 insertions, 35 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))?; } diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index a8c0c3999f2..a35b873daf8 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -763,6 +763,7 @@ rustc_queries! { desc { |tcx| "computing the variances of `{}`", tcx.def_path_str(def_id) } cache_on_disk_if { def_id.is_local() } separate_provide_extern + cycle_delay_bug } /// Maps from thee `DefId` of a type to its (inferred) outlives. @@ -960,10 +961,6 @@ rustc_queries! { ensure_forwards_result_if_red } - query collect_mod_item_types(key: LocalModDefId) { - desc { |tcx| "collecting item types in {}", describe_as_module(key, tcx) } - } - /// Caches `CoerceUnsized` kinds for impls on custom types. query coerce_unsized_info(key: DefId) -> Result<ty::adjustment::CoerceUnsizedInfo, ErrorGuaranteed> { desc { |tcx| "computing CoerceUnsized info for `{}`", tcx.def_path_str(key) } diff --git a/compiler/rustc_middle/src/values.rs b/compiler/rustc_middle/src/values.rs index 27b48f46e75..f7a3879a7d4 100644 --- a/compiler/rustc_middle/src/values.rs +++ b/compiler/rustc_middle/src/values.rs @@ -131,6 +131,27 @@ impl<'tcx> Value<TyCtxt<'tcx>> for ty::EarlyBinder<ty::Binder<'_, ty::FnSig<'_>> } } +impl<'tcx> Value<TyCtxt<'tcx>> for &[ty::Variance] { + fn from_cycle_error( + tcx: TyCtxt<'tcx>, + cycle_error: &CycleError, + _guar: ErrorGuaranteed, + ) -> Self { + if let Some(frame) = cycle_error.cycle.get(0) + && frame.query.dep_kind == dep_kinds::variances_of + && let Some(def_id) = frame.query.def_id + { + let n = tcx.generics_of(def_id).params.len(); + vec![ty::Variance::Bivariant; n].leak() + } else { + span_bug!( + cycle_error.usage.as_ref().unwrap().0, + "only `variances_of` returns `&[ty::Variance]`" + ); + } + } +} + // Take a cycle of `Q` and try `try_cycle` on every permutation, falling back to `otherwise`. fn search_for_cycle_permutation<Q, T>( cycle: &[Q], |
