rustc_hir_analysis/
lib.rs1#![allow(internal_features)]
60#![allow(rustc::diagnostic_outside_of_impl)]
61#![allow(rustc::untranslatable_diagnostic)]
62#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
63#![doc(rust_logo)]
64#![feature(assert_matches)]
65#![feature(debug_closure_helpers)]
66#![feature(gen_blocks)]
67#![feature(if_let_guard)]
68#![feature(iter_intersperse)]
69#![feature(never_type)]
70#![feature(rustdoc_internals)]
71#![feature(slice_partition_dedup)]
72#![feature(try_blocks)]
73#![feature(unwrap_infallible)]
74pub mod check;
78
79pub mod autoderef;
80mod check_unused;
81mod coherence;
82mod collect;
83mod constrained_generic_params;
84mod delegation;
85mod errors;
86pub mod hir_ty_lowering;
87pub mod hir_wf_check;
88mod impl_wf_check;
89mod outlives;
90mod variance;
91
92pub use errors::NoVariantNamed;
93use rustc_abi::ExternAbi;
94use rustc_hir::def::DefKind;
95use rustc_hir::lints::DelayedLint;
96use rustc_hir::{self as hir};
97use rustc_middle::middle;
98use rustc_middle::mir::interpret::GlobalId;
99use rustc_middle::query::Providers;
100use rustc_middle::ty::{self, Const, Ty, TyCtxt};
101use rustc_session::parse::feature_err;
102use rustc_span::symbol::sym;
103use rustc_span::{ErrorGuaranteed, Span};
104use rustc_trait_selection::traits;
105
106pub use crate::collect::suggest_impl_trait;
107use crate::hir_ty_lowering::{FeedConstTy, HirTyLowerer};
108
109rustc_fluent_macro::fluent_messages! { "../messages.ftl" }
110
111fn require_c_abi_if_c_variadic(
112    tcx: TyCtxt<'_>,
113    decl: &hir::FnDecl<'_>,
114    abi: ExternAbi,
115    span: Span,
116) {
117    if !decl.c_variadic || matches!(abi, ExternAbi::C { .. } | ExternAbi::Cdecl { .. }) {
119        return;
120    }
121
122    let extended_abi_support = tcx.features().extended_varargs_abi_support();
124    let extern_system_varargs = tcx.features().extern_system_varargs();
125
126    if extern_system_varargs && let ExternAbi::System { .. } = abi {
128        return;
129    };
130    if extended_abi_support && abi.supports_varargs() {
131        return;
132    };
133
134    let unstable_explain =
137        format!("C-variadic functions with the {abi} calling convention are unstable");
138    match abi {
139        ExternAbi::System { .. } => {
140            feature_err(&tcx.sess, sym::extern_system_varargs, span, unstable_explain)
141        }
142        abi if abi.supports_varargs() => {
143            feature_err(&tcx.sess, sym::extended_varargs_abi_support, span, unstable_explain)
144        }
145        _ => tcx.dcx().create_err(errors::VariadicFunctionCompatibleConvention {
146            span,
147            convention: &format!("{abi}"),
148        }),
149    }
150    .emit();
151}
152
153pub fn provide(providers: &mut Providers) {
155    collect::provide(providers);
156    coherence::provide(providers);
157    check::provide(providers);
158    *providers = Providers {
159        check_unused_traits: check_unused::check_unused_traits,
160        diagnostic_hir_wf_check: hir_wf_check::diagnostic_hir_wf_check,
161        inferred_outlives_crate: outlives::inferred_outlives_crate,
162        inferred_outlives_of: outlives::inferred_outlives_of,
163        inherit_sig_for_delegation_item: delegation::inherit_sig_for_delegation_item,
164        enforce_impl_non_lifetime_params_are_constrained:
165            impl_wf_check::enforce_impl_non_lifetime_params_are_constrained,
166        crate_variances: variance::crate_variances,
167        variances_of: variance::variances_of,
168        ..*providers
169    };
170}
171
172fn emit_delayed_lint(lint: &DelayedLint, tcx: TyCtxt<'_>) {
173    match lint {
174        DelayedLint::AttributeParsing(attribute_lint) => {
175            rustc_attr_parsing::emit_attribute_lint(attribute_lint, tcx)
176        }
177    }
178}
179
180pub fn check_crate(tcx: TyCtxt<'_>) {
181    let _prof_timer = tcx.sess.timer("type_check_crate");
182
183    tcx.sess.time("coherence_checking", || {
184        type R = Result<(), ErrorGuaranteed>;
187
188        let _: R = tcx.ensure_ok().check_type_wf(());
189
190        for &trait_def_id in tcx.all_local_trait_impls(()).keys() {
191            let _: R = tcx.ensure_ok().coherent_trait(trait_def_id);
192        }
193        let _: R = tcx.ensure_ok().crate_inherent_impls_validity_check(());
195        let _: R = tcx.ensure_ok().crate_inherent_impls_overlap_check(());
196    });
197
198    tcx.sess.time("emit_ast_lowering_delayed_lints", || {
199        #[cfg(debug_assertions)]
210        {
211            for owner_id in tcx.hir_crate_items(()).owners() {
213                if let Some(delayed_lints) = tcx.opt_ast_lowering_delayed_lints(owner_id) {
215                    if !delayed_lints.lints.is_empty() {
216                        assert!(
218                            tcx.hir_crate_items(()).delayed_lint_items().any(|i| i == owner_id)
219                        );
220                    }
221                }
222            }
223        }
224
225        for owner_id in tcx.hir_crate_items(()).delayed_lint_items() {
226            if let Some(delayed_lints) = tcx.opt_ast_lowering_delayed_lints(owner_id) {
227                for lint in &delayed_lints.lints {
228                    emit_delayed_lint(lint, tcx);
229                }
230            }
231        }
232    });
233
234    tcx.par_hir_body_owners(|item_def_id| {
235        let def_kind = tcx.def_kind(item_def_id);
236        match def_kind {
239            DefKind::Static { .. } => {
240                tcx.ensure_ok().eval_static_initializer(item_def_id);
241                check::maybe_check_static_with_link_section(tcx, item_def_id);
242            }
243            DefKind::Const if !tcx.generics_of(item_def_id).own_requires_monomorphization() => {
244                let instance = ty::Instance::new_raw(item_def_id.into(), ty::GenericArgs::empty());
247                let cid = GlobalId { instance, promoted: None };
248                let typing_env = ty::TypingEnv::fully_monomorphized();
249                tcx.ensure_ok().eval_to_const_value_raw(typing_env.as_query_input(cid));
250            }
251            _ => (),
252        }
253        if !matches!(def_kind, DefKind::AnonConst) {
255            tcx.ensure_ok().typeck(item_def_id);
256        }
257        if tcx.needs_coroutine_by_move_body_def_id(item_def_id.to_def_id()) {
260            tcx.ensure_done().coroutine_by_move_body_def_id(item_def_id);
261        }
262    });
263
264    if tcx.features().rustc_attrs() {
265        tcx.sess.time("dumping_rustc_attr_data", || {
266            outlives::dump::inferred_outlives(tcx);
267            variance::dump::variances(tcx);
268            collect::dump::opaque_hidden_types(tcx);
269            collect::dump::predicates_and_item_bounds(tcx);
270            collect::dump::def_parents(tcx);
271            collect::dump::vtables(tcx);
272        });
273    }
274
275    tcx.ensure_ok().check_unused_traits(());
276}
277
278pub fn lower_ty<'tcx>(tcx: TyCtxt<'tcx>, hir_ty: &hir::Ty<'tcx>) -> Ty<'tcx> {
289    let env_def_id = tcx.hir_get_parent_item(hir_ty.hir_id);
293    collect::ItemCtxt::new(tcx, env_def_id.def_id)
294        .lowerer()
295        .lower_ty_maybe_return_type_notation(hir_ty)
296}
297
298pub fn lower_const_arg_for_rustdoc<'tcx>(
301    tcx: TyCtxt<'tcx>,
302    hir_ct: &hir::ConstArg<'tcx>,
303    feed: FeedConstTy<'_, 'tcx>,
304) -> Const<'tcx> {
305    let env_def_id = tcx.hir_get_parent_item(hir_ct.hir_id);
306    collect::ItemCtxt::new(tcx, env_def_id.def_id).lowerer().lower_const_arg(hir_ct, feed)
307}