use alloc::borrow::ToOwned;
use alloc::boxed::Box;
use alloc::format;
use alloc::string::{String, ToString};
use alloc::vec;
use alloc::vec::Vec;
pub mod check;
pub mod autoderef;
mod check_unused;
mod coherence;
mod collect;
mod constrained_generic_params;
pub mod delegation;
pub mod diagnostics;
pub mod hir_ty_lowering;
pub mod hir_wf_check;
mod impl_wf_check;
mod outlives;
mod variance;
use crate::rustc_abi::{CVariadicStatus, ExternAbi};
use crate::rustc_hir as hir;
use crate::rustc_hir::def::DefKind;
use crate::rustc_middle::mir::interpret::GlobalId;
use crate::rustc_middle::query::Providers;
use crate::rustc_middle::ty::{Const, Ty, TyCtxt};
use crate::rustc_middle::{middle, ty};
use crate::rustc_session::diagnostics::feature_err;
use crate::rustc_span::{ErrorGuaranteed, Span};
use crate::rustc_trait_selection::traits;
pub use crate::rustc_hir_analysis::collect::suggest_impl_trait;
use crate::rustc_hir_analysis::hir_ty_lowering::HirTyLowerer;
fn check_c_variadic_abi(tcx: TyCtxt<'_>, decl: &hir::FnDecl<'_>, abi: ExternAbi, span: Span) {
if !decl.c_variadic() {
return;
}
match abi.supports_c_variadic() {
CVariadicStatus::Stable => {}
CVariadicStatus::NotSupported => {
tcx.dcx()
.create_err(diagnostics::VariadicFunctionCompatibleConvention {
span,
convention: &format!("{abi}"),
})
.emit();
}
CVariadicStatus::Unstable { feature } => {
if !tcx.features().enabled(feature) {
feature_err(
&tcx.sess,
feature,
span,
format!("C-variadic functions with the {abi} calling convention are unstable"),
)
.emit();
}
}
}
}
pub fn provide(providers: &mut Providers) {
collect::provide(providers);
coherence::provide(providers);
check::provide(providers);
*providers = Providers {
check_unused_traits: check_unused::check_unused_traits,
diagnostic_hir_wf_check: hir_wf_check::diagnostic_hir_wf_check,
inferred_outlives_crate: outlives::inferred_outlives_crate,
inferred_outlives_of: outlives::inferred_outlives_of,
inherit_sig_for_delegation_item: delegation::inherit_sig_for_delegation_item,
delegation_user_specified_args: delegation::delegation_user_specified_args,
enforce_impl_non_lifetime_params_are_constrained:
impl_wf_check::enforce_impl_non_lifetime_params_are_constrained,
crate_variances: variance::crate_variances,
variances_of: variance::variances_of,
..*providers
};
}
pub fn check_crate(tcx: TyCtxt<'_>) {
let _prof_timer = tcx.sess.timer("type_check_crate");
tcx.sess.time("coherence_checking", || {
type R = Result<(), ErrorGuaranteed>;
let _: R = tcx.ensure_result().check_type_wf(());
for &trait_def_id in tcx.all_local_trait_impls(()).keys() {
let _: R = tcx.ensure_result().coherent_trait(trait_def_id);
}
let _: R = tcx.ensure_result().crate_inherent_impls_validity_check(());
let _: R = tcx.ensure_result().crate_inherent_impls_overlap_check(());
});
tcx.par_hir_body_owners(|item_def_id| {
let def_kind = tcx.def_kind(item_def_id);
match def_kind {
DefKind::Static { .. } => {
tcx.ensure_ok().eval_static_initializer(item_def_id);
check::maybe_check_static_with_link_section(tcx, item_def_id);
}
DefKind::Const { .. }
if !tcx.generics_of(item_def_id).own_requires_monomorphization()
&& !tcx.is_type_const(item_def_id) =>
{
let instance = ty::Instance::new_raw(item_def_id.into(), ty::GenericArgs::empty());
let cid = GlobalId { instance, promoted: None };
let typing_env = ty::TypingEnv::fully_monomorphized();
tcx.ensure_ok().eval_to_const_value_raw(typing_env.as_query_input(cid));
}
_ => (),
}
if !(def_kind == DefKind::AnonConst
&& tcx.anon_const_kind(item_def_id) != ty::AnonConstKind::NonTypeSystemInline
|| tcx.is_typeck_child(item_def_id.to_def_id()))
{
tcx.ensure_ok().typeck(item_def_id);
}
});
tcx.par_hir_body_owners(|item_def_id| {
if tcx.needs_coroutine_by_move_body_def_id(item_def_id.to_def_id()) {
tcx.ensure_done().coroutine_by_move_body_def_id(item_def_id);
}
});
if tcx.features().rustc_attrs() {
tcx.sess.time("dumping_rustc_attr_data", || {
collect::dump::clauses_and_item_bounds(tcx);
collect::dump::def_parents(tcx);
collect::dump::generics(tcx);
collect::dump::object_lifetime_defaults(tcx);
collect::dump::opaque_hidden_types(tcx);
collect::dump::vtables(tcx);
outlives::dump::inferred_outlives(tcx);
variance::dump::variances(tcx);
});
}
tcx.ensure_ok().check_unused_traits(());
}
pub fn lower_ty<'tcx>(tcx: TyCtxt<'tcx>, hir_ty: &hir::Ty<'_>) -> Ty<'tcx> {
let env_def_id = tcx.hir_get_parent_item(hir_ty.hir_id);
collect::ItemCtxt::new(tcx, env_def_id.def_id)
.lowerer()
.lower_ty_maybe_return_type_notation(hir_ty)
}
pub fn lower_const_arg_for_rustdoc<'tcx>(
tcx: TyCtxt<'tcx>,
hir_ct: &hir::ConstArg<'_>,
ty: Ty<'tcx>,
) -> Const<'tcx> {
let env_def_id = tcx.hir_get_parent_item(hir_ct.hir_id);
collect::ItemCtxt::new(tcx, env_def_id.def_id).lowerer().lower_const_arg(hir_ct, ty)
}