1#![feature(const_default)]
35#![feature(const_trait_impl)]
36#![feature(default_field_values)]
37#![feature(deref_patterns)]
38#![recursion_limit = "256"]
39use std::mem;
42use std::sync::Arc;
43
44use rustc_ast::mut_visit::{self, MutVisitor};
45use rustc_ast::node_id::NodeMap;
46use rustc_ast::visit::{self, Visitor};
47use rustc_ast::{self as ast, *};
48use rustc_attr_parsing::{AttributeParser, OmitDoc, Recovery, ShouldEmit};
49use rustc_data_structures::fx::FxIndexMap;
50use rustc_data_structures::sorted_map::SortedMap;
51use rustc_data_structures::stable_hash::{StableHash, StableHasher};
52use rustc_data_structures::steal::Steal;
53use rustc_data_structures::tagged_ptr::TaggedRef;
54use rustc_data_structures::unord::ExtendUnord;
55use rustc_errors::codes::*;
56use rustc_errors::{DiagArgFromDisplay, DiagCtxtHandle, ErrorGuaranteed};
57use rustc_hir::attrs::lang_items::LangItem;
58use rustc_hir::def::{DefKind, LifetimeRes, Namespace, PartialRes, PerNS, Res};
59use rustc_hir::def_id::{DefId, LOCAL_CRATE, LocalDefId, LocalDefIdMap};
60use rustc_hir::definitions::PerParentDisambiguatorState;
61use rustc_hir::lints::DelayedLint;
62use rustc_hir::{
63 self as hir, AngleBrackets, ConstArg, GenericArg, HirId, ItemLocalMap, LifetimeSource,
64 LifetimeSyntax, MissingLifetimeKind, ParamName, Target, TraitCandidate, find_attr,
65};
66use rustc_index::{Idx, IndexVec};
67use rustc_macros::extension;
68use rustc_middle::queries::Providers;
69use rustc_middle::span_bug;
70use rustc_middle::ty::{PerOwnerResolverData, ResolverAstLowering, TyCtxt};
71use rustc_session::diagnostics::add_feature_diagnostics;
72use rustc_span::symbol::{Ident, Symbol, kw, sym};
73use rustc_span::{DUMMY_SP, DesugaringKind, Span};
74use smallvec::{SmallVec, smallvec};
75use thin_vec::ThinVec;
76use tracing::{debug, instrument, trace};
77
78use crate::diagnostics::{AssocTyParentheses, AssocTyParenthesesSub, MisplacedImplTrait};
79
80macro_rules! arena_vec {
81 ($this:expr; $($x:expr),*) => (
82 $this.arena.alloc_from_iter([$($x),*])
83 );
84}
85
86mod asm;
87mod block;
88mod contract;
89mod delegation;
90mod diagnostics;
91mod expr;
92mod format;
93mod index;
94mod item;
95mod pat;
96mod path;
97pub mod stability;
98
99pub fn provide(providers: &mut Providers) {
100 providers.index_ast = index_ast;
101 providers.lower_to_hir = lower_to_hir;
102}
103
104#[cfg(debug_assertions)]
105pub(crate) mod re_lowering {
106 use rustc_ast::NodeId;
107 use rustc_ast::node_id::NodeMap;
108 use rustc_hir as hir;
109
110 use crate::LoweringContext;
111
112 #[derive(#[automatically_derived]
impl ::core::fmt::Debug for ReloweringChecker {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ReloweringChecker", "node_id_to_local_id",
&self.node_id_to_local_id, "can_relower", &&self.can_relower)
}
}Debug, #[automatically_derived]
impl ::core::default::Default for ReloweringChecker {
#[inline]
fn default() -> ReloweringChecker {
ReloweringChecker {
node_id_to_local_id: ::core::default::Default::default(),
can_relower: ::core::default::Default::default(),
}
}
}Default)]
113 pub(crate) struct ReloweringChecker {
114 node_id_to_local_id: NodeMap<hir::ItemLocalId>,
115 can_relower: bool,
116 }
117
118 impl ReloweringChecker {
119 pub(crate) fn assert_node_is_not_relowered(
120 &mut self,
121 ast_node_id: NodeId,
122 local_id: hir::ItemLocalId,
123 ) {
124 if !self.can_relower {
125 let old = self.node_id_to_local_id.insert(ast_node_id, local_id);
126 {
match (&old, &None) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};assert_eq!(old, None);
127 }
128 }
129
130 pub(crate) fn allow_relowering<'a, 'hir, TRes>(
131 ctx: &mut LoweringContext<'a, 'hir>,
132 op: impl FnOnce(&mut LoweringContext<'a, 'hir>) -> TRes,
133 ) -> TRes {
134 if !!ctx.relowering_checker.can_relower {
{
::core::panicking::panic_fmt(format_args!("reentrant relowering is not supported"));
}
};assert!(!ctx.relowering_checker.can_relower, "reentrant relowering is not supported");
135
136 ctx.relowering_checker.can_relower = true;
137
138 let res = op(ctx);
139
140 ctx.relowering_checker.can_relower = false;
141
142 res
143 }
144 }
145}
146
147struct LoweringContext<'a, 'hir> {
148 tcx: TyCtxt<'hir>,
149 resolver: &'a ResolverAstLowering<'hir>,
150 current_disambiguator: PerParentDisambiguatorState,
151
152 arena: &'hir hir::Arena<'hir>,
154
155 bodies: Vec<(hir::ItemLocalId, &'hir hir::Body<'hir>)>,
157 define_opaque: Option<&'hir [(Span, LocalDefId)]>,
159 attrs: SortedMap<hir::ItemLocalId, &'hir [hir::Attribute]>,
161 children: LocalDefIdMap<hir::MaybeOwner<'hir>>,
163
164 contract_ensures: Option<(Span, Ident, HirId)>,
165
166 coroutine_kind: Option<hir::CoroutineKind>,
167
168 task_context: Option<HirId>,
171
172 current_item: Option<Span>,
175
176 try_block_scope: TryBlockScope,
177 loop_scope: Option<HirId>,
178 is_in_loop_condition: bool,
179 is_in_dyn_type: bool,
180
181 current_hir_id_owner: hir::OwnerId,
182 owner: &'a PerOwnerResolverData<'hir>,
183 item_local_id_counter: hir::ItemLocalId,
184 trait_map: ItemLocalMap<&'hir [TraitCandidate<'hir>]>,
185
186 impl_trait_defs: Vec<hir::GenericParam<'hir>>,
187 impl_trait_bounds: Vec<hir::WherePredicate<'hir>>,
188
189 ident_and_label_to_local_id: NodeMap<hir::ItemLocalId>,
191 #[cfg(debug_assertions)]
193 relowering_checker: re_lowering::ReloweringChecker,
194 next_node_id: NodeId,
198 node_id_to_def_id: NodeMap<LocalDefId>,
200 partial_res_overrides: NodeMap<NodeId>,
204
205 allow_contracts: Arc<[Symbol]>,
206 allow_try_trait: Arc<[Symbol]>,
207 allow_gen_future: Arc<[Symbol]>,
208 allow_pattern_type: Arc<[Symbol]>,
209 allow_async_gen: Arc<[Symbol]>,
210 allow_async_iterator: Arc<[Symbol]>,
211 allow_for_await: Arc<[Symbol]>,
212 allow_async_fn_traits: Arc<[Symbol]>,
213
214 delayed_lints: Vec<DelayedLint>,
215
216 move_expr_bindings: Vec<Option<expr::MoveExprState<'hir>>>,
220
221 attribute_parser: AttributeParser<'hir>,
222}
223
224impl<'a, 'hir> LoweringContext<'a, 'hir> {
225 fn new(tcx: TyCtxt<'hir>, resolver: &'a ResolverAstLowering<'hir>, owner: NodeId) -> Self {
226 let current_ast_owner = &resolver.owners[&owner];
227 let current_hir_id_owner = hir::OwnerId { def_id: current_ast_owner.def_id };
228 let current_disambiguator = resolver
229 .disambiguators
230 .get(¤t_hir_id_owner.def_id)
231 .map(|s| s.steal())
232 .unwrap_or_else(|| PerParentDisambiguatorState::new(current_hir_id_owner.def_id));
233
234 Self {
235 tcx,
236 resolver,
237 current_disambiguator,
238 owner: current_ast_owner,
239 arena: tcx.hir_arena,
240
241 bodies: Vec::new(),
243 define_opaque: None,
244 attrs: SortedMap::default(),
245 children: LocalDefIdMap::default(),
246 contract_ensures: None,
247 current_hir_id_owner,
248 item_local_id_counter: hir::ItemLocalId::new(1),
251 ident_and_label_to_local_id: Default::default(),
252
253 #[cfg(debug_assertions)]
254 relowering_checker: Default::default(),
255
256 trait_map: Default::default(),
257 next_node_id: resolver.next_node_id,
258 node_id_to_def_id: NodeMap::default(),
259 partial_res_overrides: NodeMap::default(),
260
261 try_block_scope: TryBlockScope::Function,
263 loop_scope: None,
264 is_in_loop_condition: false,
265 is_in_dyn_type: false,
266 coroutine_kind: None,
267 task_context: None,
268 current_item: None,
269 impl_trait_defs: Vec::new(),
270 impl_trait_bounds: Vec::new(),
271 allow_contracts: [sym::contracts_internals].into(),
272 allow_try_trait: [
273 sym::try_trait_v2,
274 sym::try_trait_v2_residual,
275 sym::yeet_desugar_details,
276 ]
277 .into(),
278 allow_pattern_type: [sym::pattern_types, sym::pattern_type_range_trait].into(),
279 allow_gen_future: if tcx.features().async_fn_track_caller() {
280 [sym::gen_future, sym::closure_track_caller].into()
281 } else {
282 [sym::gen_future].into()
283 },
284 allow_for_await: [sym::async_gen_internals, sym::async_iterator].into(),
285 allow_async_fn_traits: [sym::async_fn_traits].into(),
286 allow_async_gen: [sym::async_gen_internals].into(),
287 allow_async_iterator: [sym::gen_future, sym::async_iterator].into(),
290
291 move_expr_bindings: Vec::new(),
292 attribute_parser: AttributeParser::new(
293 tcx.sess,
294 tcx.features(),
295 tcx.registered_attr_tools(()),
296 ShouldEmit::ErrorsAndLints { recovery: Recovery::Allowed },
297 ),
298 delayed_lints: Vec::new(),
299 }
300 }
301
302 pub(crate) fn dcx(&self) -> DiagCtxtHandle<'hir> {
303 self.tcx.dcx()
304 }
305}
306
307struct SpanLowerer {
308 is_incremental: bool,
309 def_id: LocalDefId,
310}
311
312impl SpanLowerer {
313 fn lower(&self, span: Span) -> Span {
314 if self.is_incremental {
315 span.with_parent(Some(self.def_id))
316 } else {
317 span
319 }
320 }
321}
322
323impl<'tcx> ResolverAstLoweringExt<'tcx> for ResolverAstLowering<'tcx> {
fn legacy_const_generic_args(&self, expr: &Expr, tcx: TyCtxt<'tcx>)
-> Option<Vec<usize>> {
let ExprKind::Path(None, path) = &expr.kind else { return None; };
if path.segments.last().unwrap().args.is_some() { return None; }
let def_id =
self.partial_res_map.get(&expr.id)?.full_res()?.opt_def_id()?;
if def_id.is_local() { return None; }
{
{
'done:
{
for i in ::rustc_attr_ir::HasAttrs::get_attrs(def_id, &tcx)
{
#[allow(unused_imports)]
use ::rustc_attr_ir::AttributeKind::*;
let i: &::rustc_attr_ir::Attribute = i;
match i {
::rustc_attr_ir::Attribute::Parsed(RustcLegacyConstGenerics {
fn_indexes, .. }) => {
break 'done Some(fn_indexes);
}
::rustc_attr_ir::Attribute::Unparsed(..) =>
{}
#[deny(unreachable_patterns)]
_ => {}
}
}
None
}
}
}.map(|fn_indexes|
fn_indexes.iter().map(|(num, _)| *num).collect())
}
}#[extension(trait ResolverAstLoweringExt<'tcx>)]
324impl<'tcx> ResolverAstLowering<'tcx> {
325 fn legacy_const_generic_args(&self, expr: &Expr, tcx: TyCtxt<'tcx>) -> Option<Vec<usize>> {
326 let ExprKind::Path(None, path) = &expr.kind else {
327 return None;
328 };
329
330 if path.segments.last().unwrap().args.is_some() {
333 return None;
334 }
335
336 let def_id = self.partial_res_map.get(&expr.id)?.full_res()?.opt_def_id()?;
340
341 if def_id.is_local() {
345 return None;
346 }
347
348 find_attr!(
350 tcx, def_id,
351 RustcLegacyConstGenerics{fn_indexes,..} => fn_indexes
352 )
353 .map(|fn_indexes| fn_indexes.iter().map(|(num, _)| *num).collect())
354 }
355}
356
357#[derive(#[automatically_derived]
impl<'a> ::core::fmt::Debug for RelaxedBoundPolicy<'a> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
RelaxedBoundPolicy::Allowed(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Allowed", &__self_0),
RelaxedBoundPolicy::Forbidden(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Forbidden", &__self_0),
}
}
}Debug)]
362enum RelaxedBoundPolicy<'a> {
363 Allowed(&'a mut FxIndexMap<DefId, Span>),
365 Forbidden(RelaxedBoundForbiddenReason),
366}
367impl RelaxedBoundPolicy<'_> {
368 fn reborrow(&mut self) -> RelaxedBoundPolicy<'_> {
369 match self {
370 RelaxedBoundPolicy::Allowed(m) => RelaxedBoundPolicy::Allowed(m),
371 RelaxedBoundPolicy::Forbidden(reason) => RelaxedBoundPolicy::Forbidden(*reason),
372 }
373 }
374}
375
376#[derive(#[automatically_derived]
impl ::core::clone::Clone for RelaxedBoundForbiddenReason {
#[inline]
fn clone(&self) -> RelaxedBoundForbiddenReason { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for RelaxedBoundForbiddenReason { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for RelaxedBoundForbiddenReason {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RelaxedBoundForbiddenReason::TraitObjectTy => "TraitObjectTy",
RelaxedBoundForbiddenReason::SuperTrait => "SuperTrait",
RelaxedBoundForbiddenReason::TraitAlias => "TraitAlias",
RelaxedBoundForbiddenReason::AssocTyBounds => "AssocTyBounds",
RelaxedBoundForbiddenReason::WhereBound => "WhereBound",
})
}
}Debug)]
377enum RelaxedBoundForbiddenReason {
378 TraitObjectTy,
379 SuperTrait,
380 TraitAlias,
381 AssocTyBounds,
382 WhereBound,
385}
386
387#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplTraitContext {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
ImplTraitContext::Universal =>
::core::fmt::Formatter::write_str(f, "Universal"),
ImplTraitContext::OpaqueTy { origin: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"OpaqueTy", "origin", &__self_0),
ImplTraitContext::InBinding =>
::core::fmt::Formatter::write_str(f, "InBinding"),
ImplTraitContext::FeatureGated(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"FeatureGated", __self_0, &__self_1),
ImplTraitContext::Disallowed(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Disallowed", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitContext { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ImplTraitContext {
#[inline]
fn clone(&self) -> ImplTraitContext {
let _:
::core::clone::AssertParamIsClone<hir::OpaqueTyOrigin<LocalDefId>>;
let _: ::core::clone::AssertParamIsClone<ImplTraitPosition>;
let _: ::core::clone::AssertParamIsClone<Symbol>;
*self
}
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitContext {
#[inline]
fn eq(&self, other: &ImplTraitContext) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(ImplTraitContext::OpaqueTy { origin: __self_0 },
ImplTraitContext::OpaqueTy { origin: __arg1_0 }) =>
__self_0 == __arg1_0,
(ImplTraitContext::FeatureGated(__self_0, __self_1),
ImplTraitContext::FeatureGated(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(ImplTraitContext::Disallowed(__self_0),
ImplTraitContext::Disallowed(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitContext {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<hir::OpaqueTyOrigin<LocalDefId>>;
let _: ::core::cmp::AssertParamIsEq<ImplTraitPosition>;
let _: ::core::cmp::AssertParamIsEq<Symbol>;
}
}Eq)]
390enum ImplTraitContext {
391 Universal,
397
398 OpaqueTy { origin: hir::OpaqueTyOrigin<LocalDefId> },
403
404 InBinding,
409
410 FeatureGated(ImplTraitPosition, Symbol),
412 Disallowed(ImplTraitPosition),
414}
415
416#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplTraitPosition {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
const __NAMES: &str =
"PathVariableTraitBoundGenericExternFnParamClosureParamPointerParamFnTraitParamExternFnReturnClosureReturnPointerReturnFnTraitReturnGenericDefaultConstTyStaticTyAssocTyFieldTyCastImplSelfOffsetOf";
const __OFFSET: [usize; 22] =
[0usize, 4usize, 12usize, 17usize, 22usize, 29usize, 42usize,
54usize, 66usize, 78usize, 92usize, 105usize, 118usize,
131usize, 145usize, 152usize, 160usize, 167usize, 174usize,
178usize, 186usize, 194usize];
let __d = ::core::intrinsics::discriminant_value(self) as usize;
::core::fmt::Formatter::debug_c_like_enum_write_str(f, __NAMES,
&__OFFSET, __d)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for ImplTraitPosition { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ImplTraitPosition {
#[inline]
fn clone(&self) -> ImplTraitPosition { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ImplTraitPosition {
#[inline]
fn eq(&self, other: &ImplTraitPosition) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplTraitPosition {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq)]
418enum ImplTraitPosition {
419 Path,
420 Variable,
421 Trait,
422 Bound,
423 Generic,
424 ExternFnParam,
425 ClosureParam,
426 PointerParam,
427 FnTraitParam,
428 ExternFnReturn,
429 ClosureReturn,
430 PointerReturn,
431 FnTraitReturn,
432 GenericDefault,
433 ConstTy,
434 StaticTy,
435 AssocTy,
436 FieldTy,
437 Cast,
438 ImplSelf,
439 OffsetOf,
440}
441
442impl std::fmt::Display for ImplTraitPosition {
443 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
444 let name = match self {
445 ImplTraitPosition::Path => "paths",
446 ImplTraitPosition::Variable => "the type of variable bindings",
447 ImplTraitPosition::Trait => "traits",
448 ImplTraitPosition::Bound => "bounds",
449 ImplTraitPosition::Generic => "generics",
450 ImplTraitPosition::ExternFnParam => "`extern fn` parameters",
451 ImplTraitPosition::ClosureParam => "closure parameters",
452 ImplTraitPosition::PointerParam => "`fn` pointer parameters",
453 ImplTraitPosition::FnTraitParam => "the parameters of `Fn` trait bounds",
454 ImplTraitPosition::ExternFnReturn => "`extern fn` return types",
455 ImplTraitPosition::ClosureReturn => "closure return types",
456 ImplTraitPosition::PointerReturn => "`fn` pointer return types",
457 ImplTraitPosition::FnTraitReturn => "the return type of `Fn` trait bounds",
458 ImplTraitPosition::GenericDefault => "generic parameter defaults",
459 ImplTraitPosition::ConstTy => "const types",
460 ImplTraitPosition::StaticTy => "static types",
461 ImplTraitPosition::AssocTy => "associated types",
462 ImplTraitPosition::FieldTy => "field types",
463 ImplTraitPosition::Cast => "cast expression types",
464 ImplTraitPosition::ImplSelf => "impl headers",
465 ImplTraitPosition::OffsetOf => "`offset_of!` parameters",
466 };
467
468 f.write_fmt(format_args!("{0}", name))write!(f, "{name}")
469 }
470}
471
472#[derive(#[automatically_derived]
impl ::core::marker::Copy for FnDeclKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for FnDeclKind {
#[inline]
fn clone(&self) -> FnDeclKind { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FnDeclKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
FnDeclKind::Fn => "Fn",
FnDeclKind::Inherent => "Inherent",
FnDeclKind::ExternFn => "ExternFn",
FnDeclKind::Closure => "Closure",
FnDeclKind::Pointer => "Pointer",
FnDeclKind::Trait => "Trait",
FnDeclKind::Impl => "Impl",
})
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for FnDeclKind {
#[inline]
fn eq(&self, other: &FnDeclKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FnDeclKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {}
}Eq)]
473enum FnDeclKind {
474 Fn,
475 Inherent,
476 ExternFn,
477 Closure,
478 Pointer,
479 Trait,
480 Impl,
481}
482
483#[derive(#[automatically_derived]
impl ::core::marker::Copy for TryBlockScope { }Copy, #[automatically_derived]
impl ::core::clone::Clone for TryBlockScope {
#[inline]
fn clone(&self) -> TryBlockScope {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for TryBlockScope {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
TryBlockScope::Function =>
::core::fmt::Formatter::write_str(f, "Function"),
TryBlockScope::Homogeneous(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Homogeneous", &__self_0),
TryBlockScope::Heterogeneous(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Heterogeneous", &__self_0),
}
}
}Debug)]
484enum TryBlockScope {
485 Function,
487 Homogeneous(HirId),
490 Heterogeneous(HirId),
493}
494
495fn index_ast<'tcx>(
496 tcx: TyCtxt<'tcx>,
497 (): (),
498) -> IndexVec<LocalDefId, Steal<(Arc<ResolverAstLowering<'tcx>>, AstOwner)>> {
499 tcx.ensure_done().output_filenames(());
501 tcx.ensure_done().early_lint_checks(());
502 tcx.ensure_done().get_lang_items(());
503 tcx.ensure_done().debugger_visualizers(LOCAL_CRATE);
504
505 let (resolver, krate) = tcx.resolver_for_lowering();
506 let mut resolver = resolver.steal();
507 let mut krate = krate.steal();
508
509 let mut indexer = Indexer {
510 owners: &resolver.owners,
511 index: IndexVec::new(),
512 next_node_id: resolver.next_node_id,
513 };
514 indexer.visit_crate(&mut krate);
515 indexer.insert(CRATE_NODE_ID, AstOwner::Crate(Box::new(krate)));
516 resolver.next_node_id = indexer.next_node_id;
517
518 let index = indexer.index;
519 let resolver = Arc::new(resolver);
520 let index = index.into_iter().map(|owner| Steal::new((Arc::clone(&resolver), owner))).collect();
521 return index;
522
523 struct Indexer<'s, 'hir> {
524 owners: &'s NodeMap<PerOwnerResolverData<'hir>>,
525 index: IndexVec<LocalDefId, AstOwner>,
526 next_node_id: NodeId,
527 }
528
529 impl Indexer<'_, '_> {
530 fn insert(&mut self, id: NodeId, node: AstOwner) {
531 let def_id = self.owners[&id].def_id;
532 self.index.ensure_contains_elem(def_id, || AstOwner::NonOwner);
533 self.index[def_id] = node;
534 }
535
536 fn make_dummy<K>(
537 &mut self,
538 id: NodeId,
539 span: Span,
540 dummy: impl FnOnce(Box<MacCall>) -> K,
541 ) -> Box<Item<K>> {
542 use rustc_ast::token::Delimiter;
543 use rustc_ast::tokenstream::{DelimSpan, TokenStream};
544 use thin_vec::thin_vec;
545
546 Box::new(Item {
547 attrs: AttrVec::default(),
548 id,
549 span,
550 vis: Visibility { kind: VisibilityKind::Public, span },
551 kind: dummy(Box::new(MacCall {
554 path: Path { span, segments: ::thin_vec::ThinVec::new()thin_vec![] },
555 args: Box::new(DelimArgs {
556 dspan: DelimSpan::from_single(span),
557 delim: Delimiter::Parenthesis,
558 tokens: TokenStream::new(Vec::new()),
559 }),
560 })),
561 tokens: None,
562 })
563 }
564
565 fn replace_with_dummy<K>(
566 &mut self,
567 item: &mut ast::Item<K>,
568 dummy: impl FnOnce(Box<MacCall>) -> K,
569 node: impl FnOnce(Box<Item<K>>) -> AstOwner,
570 ) {
571 let dummy = self.make_dummy(item.id, item.span, dummy);
572 let item = mem::replace(item, *dummy);
573 self.insert(item.id, node(Box::new(item)));
574 }
575
576 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("visit_item_id_use_tree",
"rustc_ast_lowering", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(576u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("tree")
}> =
::tracing::__macro_support::FieldName::new("tree");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("parent")
}> =
::tracing::__macro_support::FieldName::new("parent");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("items")
}> =
::tracing::__macro_support::FieldName::new("items");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&tree)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&parent)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&items)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: () = loop {};
return __tracing_attr_fake_return;
}
{
match tree.kind {
UseTreeKind::Glob(_) | UseTreeKind::Simple(_) => {}
UseTreeKind::Nested { items: ref nested_vec, span } => {
for &(ref nested, id) in nested_vec {
self.insert(id, AstOwner::NestedUseTree(parent));
items.push(self.make_dummy(id, span, ItemKind::MacCall));
let def_id = self.owners[&id].def_id;
self.visit_item_id_use_tree(nested, def_id, items);
}
}
}
}
}
}#[tracing::instrument(level = "trace", skip(self))]
577 fn visit_item_id_use_tree(
578 &mut self,
579 tree: &UseTree,
580 parent: LocalDefId,
581 items: &mut SmallVec<[Box<Item>; 1]>,
582 ) {
583 match tree.kind {
584 UseTreeKind::Glob(_) | UseTreeKind::Simple(_) => {}
585 UseTreeKind::Nested { items: ref nested_vec, span } => {
586 for &(ref nested, id) in nested_vec {
587 self.insert(id, AstOwner::NestedUseTree(parent));
588 items.push(self.make_dummy(id, span, ItemKind::MacCall));
589
590 let def_id = self.owners[&id].def_id;
591 self.visit_item_id_use_tree(nested, def_id, items);
592 }
593 }
594 }
595 }
596 }
597
598 impl MutVisitor for Indexer<'_, '_> {
599 fn visit_attribute(&mut self, _: &mut Attribute) {
600 }
603
604 fn flat_map_item(&mut self, mut item: Box<Item>) -> SmallVec<[Box<Item>; 1]> {
605 let def_id = self.owners[&item.id].def_id;
606 mut_visit::walk_item(self, &mut *item);
607 let dummy = self.make_dummy(item.id, item.span, ItemKind::MacCall);
608 let mut items = {
let count = 0usize + 1usize;
let mut vec = ::smallvec::SmallVec::new();
if count <= vec.inline_size() {
vec.push(dummy);
vec
} else {
::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[dummy])))
}
}smallvec![dummy];
609 if let ItemKind::Use(ref use_tree) = item.kind {
610 self.visit_item_id_use_tree(use_tree, def_id, &mut items);
611 }
612 self.insert(item.id, AstOwner::Item(item));
613 items
614 }
615
616 fn flat_map_stmt(&mut self, stmt: Stmt) -> SmallVec<[Stmt; 1]> {
617 let Stmt { id, span, kind } = stmt;
618 let mut id = Some(id);
619 mut_visit::walk_flat_map_stmt_kind(self, kind)
620 .into_iter()
621 .map(|kind| {
622 let id = id.take().unwrap_or_else(|| {
627 let next = self.next_node_id;
628 self.next_node_id.increment_by(1);
629 next
630 });
631 Stmt { id, kind, span }
632 })
633 .collect()
634 }
635
636 fn visit_assoc_item(&mut self, item: &mut AssocItem, ctxt: visit::AssocCtxt) {
637 mut_visit::walk_assoc_item(self, item, ctxt);
638 match ctxt {
639 visit::AssocCtxt::Trait => {
640 self.replace_with_dummy(item, AssocItemKind::MacCall, AstOwner::TraitItem)
641 }
642 visit::AssocCtxt::Impl { .. } => {
643 self.replace_with_dummy(item, AssocItemKind::MacCall, AstOwner::ImplItem)
644 }
645 }
646 }
647
648 fn visit_foreign_item(&mut self, item: &mut ForeignItem) {
649 mut_visit::walk_item(self, item);
650 self.replace_with_dummy(item, ForeignItemKind::MacCall, AstOwner::ForeignItem);
651 }
652 }
653}
654
655#[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_to_hir",
"rustc_ast_lowering", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(655u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("def_id")
}> =
::tracing::__macro_support::FieldName::new("def_id");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&def_id)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::MaybeOwner<'_> = loop {};
return __tracing_attr_fake_return;
}
{
let ast_index = tcx.index_ast(());
let resolver_and_node = ast_index.get(def_id).map(Steal::steal);
let fallback_to_ancestor =
|parent_id|
{
let mut parent_info = tcx.lower_to_hir(parent_id);
if let hir::MaybeOwner::NonOwner(hir_id) = parent_info {
parent_info = tcx.lower_to_hir(hir_id.owner);
}
let parent_info = parent_info.unwrap();
*parent_info.children.get(&def_id).unwrap_or_else(||
{
{
::core::panicking::panic_fmt(format_args!("{0:?} does not appear in children of {1:?}",
def_id, parent_info.nodes.node().def_id()));
}
})
};
let Some((resolver, node)) =
resolver_and_node else {
return fallback_to_ancestor(tcx.local_parent(def_id));
};
let mut item_lowerer =
item::ItemLowerer { tcx, resolver: &*resolver };
let item =
match &node {
AstOwner::Crate(c) => item_lowerer.lower_crate(&c),
AstOwner::Item(item) => item_lowerer.lower_item(&item),
AstOwner::TraitItem(item) =>
item_lowerer.lower_trait_item(&item),
AstOwner::ImplItem(item) =>
item_lowerer.lower_impl_item(&item),
AstOwner::ForeignItem(item) =>
item_lowerer.lower_foreign_item(&item),
AstOwner::NestedUseTree(owner_id) =>
fallback_to_ancestor(*owner_id),
AstOwner::NonOwner =>
fallback_to_ancestor(tcx.local_parent(def_id)),
};
tcx.sess.time("drop_ast", || mem::drop(node));
item
}
}
}#[instrument(level = "trace", skip(tcx))]
656fn lower_to_hir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::MaybeOwner<'_> {
657 let ast_index = tcx.index_ast(());
658 let resolver_and_node = ast_index.get(def_id).map(Steal::steal);
659
660 let fallback_to_ancestor = |parent_id| {
661 let mut parent_info = tcx.lower_to_hir(parent_id);
665 if let hir::MaybeOwner::NonOwner(hir_id) = parent_info {
666 parent_info = tcx.lower_to_hir(hir_id.owner);
672 }
673
674 let parent_info = parent_info.unwrap();
675 *parent_info.children.get(&def_id).unwrap_or_else(|| {
676 panic!(
677 "{:?} does not appear in children of {:?}",
678 def_id,
679 parent_info.nodes.node().def_id()
680 )
681 })
682 };
683
684 let Some((resolver, node)) = resolver_and_node else {
685 return fallback_to_ancestor(tcx.local_parent(def_id));
689 };
690
691 let mut item_lowerer = item::ItemLowerer { tcx, resolver: &*resolver };
692
693 let item = match &node {
694 AstOwner::Crate(c) => item_lowerer.lower_crate(&c),
696 AstOwner::Item(item) => item_lowerer.lower_item(&item),
697 AstOwner::TraitItem(item) => item_lowerer.lower_trait_item(&item),
698 AstOwner::ImplItem(item) => item_lowerer.lower_impl_item(&item),
699 AstOwner::ForeignItem(item) => item_lowerer.lower_foreign_item(&item),
700 AstOwner::NestedUseTree(owner_id) => fallback_to_ancestor(*owner_id),
701 AstOwner::NonOwner => fallback_to_ancestor(tcx.local_parent(def_id)),
704 };
705
706 tcx.sess.time("drop_ast", || mem::drop(node));
707
708 item
709}
710
711#[derive(#[automatically_derived]
impl ::core::marker::Copy for ParamMode { }Copy, #[automatically_derived]
impl ::core::clone::Clone for ParamMode {
#[inline]
fn clone(&self) -> ParamMode { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for ParamMode {
#[inline]
fn eq(&self, other: &ParamMode) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for ParamMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
ParamMode::Explicit => "Explicit",
ParamMode::Optional => "Optional",
})
}
}Debug)]
712enum ParamMode {
713 Explicit,
715 Optional,
717}
718
719#[derive(#[automatically_derived]
impl ::core::marker::Copy for AllowReturnTypeNotation { }Copy, #[automatically_derived]
impl ::core::clone::Clone for AllowReturnTypeNotation {
#[inline]
fn clone(&self) -> AllowReturnTypeNotation { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AllowReturnTypeNotation {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
AllowReturnTypeNotation::Yes => "Yes",
AllowReturnTypeNotation::No => "No",
})
}
}Debug)]
720enum AllowReturnTypeNotation {
721 Yes,
723 No,
725}
726
727enum GenericArgsMode {
728 ParenSugar,
730 ReturnTypeNotation,
732 Err,
734 Silence,
736}
737
738impl<'hir> LoweringContext<'_, 'hir> {
739 fn create_def(
740 &mut self,
741 node_id: NodeId,
742 name: Option<Symbol>,
743 def_kind: DefKind,
744 span: Span,
745 ) -> LocalDefId {
746 let parent = self.current_hir_id_owner.def_id;
747 {
match (&node_id, &ast::DUMMY_NODE_ID) {
(left_val, right_val) => {
if *left_val == *right_val {
let kind = ::core::panicking::AssertKind::Ne;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};assert_ne!(node_id, ast::DUMMY_NODE_ID);
748 if !self.opt_local_def_id(node_id).is_none() {
{
::core::panicking::panic_fmt(format_args!("adding a def\'n for node-id {0:?} and def kind {1:?} but a previous def\'n exists: {2:?}",
node_id, def_kind,
self.tcx.hir_def_key(self.local_def_id(node_id))));
}
};assert!(
749 self.opt_local_def_id(node_id).is_none(),
750 "adding a def'n for node-id {:?} and def kind {:?} but a previous def'n exists: {:?}",
751 node_id,
752 def_kind,
753 self.tcx.hir_def_key(self.local_def_id(node_id)),
754 );
755
756 let def_id = self
757 .tcx
758 .at(span)
759 .create_def(parent, name, def_kind, None, &mut self.current_disambiguator)
760 .def_id();
761
762 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:762",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(762u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("create_def: def_id_to_node_id[{0:?}] <-> {1:?}",
def_id, node_id) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("create_def: def_id_to_node_id[{:?}] <-> {:?}", def_id, node_id);
763 self.node_id_to_def_id.insert(node_id, def_id);
764
765 def_id
766 }
767
768 fn next_node_id(&mut self) -> NodeId {
769 let start = self.next_node_id;
770 let next = start.as_u32().checked_add(1).expect("input too large; ran out of NodeIds");
771 self.next_node_id = NodeId::from_u32(next);
772 start
773 }
774
775 x;#[instrument(level = "trace", skip(self), ret)]
778 fn opt_local_def_id(&self, node: NodeId) -> Option<LocalDefId> {
779 self.node_id_to_def_id
780 .get(&node)
781 .or_else(|| self.owner.node_id_to_def_id.get(&node))
782 .copied()
783 }
784
785 fn local_def_id(&self, node: NodeId) -> LocalDefId {
786 self.opt_local_def_id(node).unwrap_or_else(|| {
787 self.resolver.owners.items().any(|(id, items)| {
788 items.node_id_to_def_id.items().any(|(node_id, def_id)| {
789 if *node_id == node {
790 let actual_owner = items.node_id_to_def_id.get(id);
791 {
::core::panicking::panic_fmt(format_args!("{0:?} ({1}) was found in {2:?} ({3})",
def_id, node_id, actual_owner, id));
}panic!("{def_id:?} ({node_id}) was found in {actual_owner:?} ({id})",)
792 }
793 false
794 })
795 });
796 {
::core::panicking::panic_fmt(format_args!("no entry for node id: `{0:?}`",
node));
};panic!("no entry for node id: `{node:?}`");
797 })
798 }
799
800 fn get_partial_res(&self, id: NodeId) -> Option<PartialRes> {
801 match self.partial_res_overrides.get(&id) {
802 Some(self_param_id) => Some(PartialRes::new(Res::Local(*self_param_id))),
803 None => self.resolver.partial_res_map.get(&id).copied(),
804 }
805 }
806
807 fn owner_id(&self, node: NodeId) -> hir::OwnerId {
809 hir::OwnerId { def_id: self.resolver.owners[&node].def_id }
810 }
811
812 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("with_hir_id_owner",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(817u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("owner")
}> =
::tracing::__macro_support::FieldName::new("owner");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&owner)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: () = loop {};
return __tracing_attr_fake_return;
}
{
let owner_id = self.owner_id(owner);
let def_id = owner_id.def_id;
let new_disambig =
self.resolver.disambiguators.get(&def_id).map(|s|
s.steal()).unwrap_or_else(||
PerParentDisambiguatorState::new(def_id));
let disambiguator =
mem::replace(&mut self.current_disambiguator, new_disambig);
let current_ast_owner =
mem::replace(&mut self.owner, &self.resolver.owners[&owner]);
let current_attrs = mem::take(&mut self.attrs);
let current_bodies = mem::take(&mut self.bodies);
let current_define_opaque = mem::take(&mut self.define_opaque);
let current_ident_and_label_to_local_id =
mem::take(&mut self.ident_and_label_to_local_id);
let current_relowering_checker =
mem::take(&mut self.relowering_checker);
let current_trait_map = mem::take(&mut self.trait_map);
let current_owner =
mem::replace(&mut self.current_hir_id_owner, owner_id);
let current_local_counter =
mem::replace(&mut self.item_local_id_counter,
hir::ItemLocalId::new(1));
let current_impl_trait_defs =
mem::take(&mut self.impl_trait_defs);
let current_impl_trait_bounds =
mem::take(&mut self.impl_trait_bounds);
let current_delayed_lints = mem::take(&mut self.delayed_lints);
let current_children = mem::take(&mut self.children);
self.relowering_checker.assert_node_is_not_relowered(owner,
hir::ItemLocalId::ZERO);
let item = f(self);
{
match (&owner_id, &item.def_id()) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
if !self.impl_trait_defs.is_empty() {
::core::panicking::panic("assertion failed: self.impl_trait_defs.is_empty()")
};
if !self.impl_trait_bounds.is_empty() {
::core::panicking::panic("assertion failed: self.impl_trait_bounds.is_empty()")
};
let info = self.make_owner_info(item);
self.current_disambiguator = disambiguator;
self.owner = current_ast_owner;
self.attrs = current_attrs;
self.bodies = current_bodies;
self.define_opaque = current_define_opaque;
self.ident_and_label_to_local_id =
current_ident_and_label_to_local_id;
{ self.relowering_checker = current_relowering_checker; }
self.trait_map = current_trait_map;
self.current_hir_id_owner = current_owner;
self.item_local_id_counter = current_local_counter;
self.impl_trait_defs = current_impl_trait_defs;
self.impl_trait_bounds = current_impl_trait_bounds;
self.delayed_lints = current_delayed_lints;
self.children = current_children;
self.children.extend_unord(info.children.items().map(|(&def_id,
&info)| (def_id, info)));
if true {
if !!self.children.contains_key(&owner_id.def_id) {
::core::panicking::panic("assertion failed: !self.children.contains_key(&owner_id.def_id)")
};
};
self.children.insert(owner_id.def_id,
hir::MaybeOwner::Owner(info));
}
}
}#[instrument(level = "debug", skip(self, f))]
818 fn with_hir_id_owner(
819 &mut self,
820 owner: NodeId,
821 f: impl FnOnce(&mut Self) -> hir::OwnerNode<'hir>,
822 ) {
823 let owner_id = self.owner_id(owner);
824 let def_id = owner_id.def_id;
825
826 let new_disambig = self
827 .resolver
828 .disambiguators
829 .get(&def_id)
830 .map(|s| s.steal())
831 .unwrap_or_else(|| PerParentDisambiguatorState::new(def_id));
832
833 let disambiguator = mem::replace(&mut self.current_disambiguator, new_disambig);
834 let current_ast_owner = mem::replace(&mut self.owner, &self.resolver.owners[&owner]);
835 let current_attrs = mem::take(&mut self.attrs);
836 let current_bodies = mem::take(&mut self.bodies);
837 let current_define_opaque = mem::take(&mut self.define_opaque);
838 let current_ident_and_label_to_local_id = mem::take(&mut self.ident_and_label_to_local_id);
839
840 #[cfg(debug_assertions)]
841 let current_relowering_checker = mem::take(&mut self.relowering_checker);
842 let current_trait_map = mem::take(&mut self.trait_map);
843 let current_owner = mem::replace(&mut self.current_hir_id_owner, owner_id);
844 let current_local_counter =
845 mem::replace(&mut self.item_local_id_counter, hir::ItemLocalId::new(1));
846 let current_impl_trait_defs = mem::take(&mut self.impl_trait_defs);
847 let current_impl_trait_bounds = mem::take(&mut self.impl_trait_bounds);
848 let current_delayed_lints = mem::take(&mut self.delayed_lints);
849 let current_children = mem::take(&mut self.children);
850
851 #[cfg(debug_assertions)]
857 self.relowering_checker.assert_node_is_not_relowered(owner, hir::ItemLocalId::ZERO);
858
859 let item = f(self);
860 assert_eq!(owner_id, item.def_id());
861 assert!(self.impl_trait_defs.is_empty());
863 assert!(self.impl_trait_bounds.is_empty());
864 let info = self.make_owner_info(item);
865
866 self.current_disambiguator = disambiguator;
867 self.owner = current_ast_owner;
868 self.attrs = current_attrs;
869 self.bodies = current_bodies;
870 self.define_opaque = current_define_opaque;
871 self.ident_and_label_to_local_id = current_ident_and_label_to_local_id;
872
873 #[cfg(debug_assertions)]
874 {
875 self.relowering_checker = current_relowering_checker;
876 }
877 self.trait_map = current_trait_map;
878 self.current_hir_id_owner = current_owner;
879 self.item_local_id_counter = current_local_counter;
880 self.impl_trait_defs = current_impl_trait_defs;
881 self.impl_trait_bounds = current_impl_trait_bounds;
882 self.delayed_lints = current_delayed_lints;
883 self.children = current_children;
884 self.children.extend_unord(info.children.items().map(|(&def_id, &info)| (def_id, info)));
885
886 debug_assert!(!self.children.contains_key(&owner_id.def_id));
887 self.children.insert(owner_id.def_id, hir::MaybeOwner::Owner(info));
888 }
889
890 fn make_owner_info(&mut self, node: hir::OwnerNode<'hir>) -> &'hir hir::OwnerInfo<'hir> {
891 let attrs = mem::take(&mut self.attrs);
892 let mut bodies = mem::take(&mut self.bodies);
893 let define_opaque = mem::take(&mut self.define_opaque);
894 let trait_map = mem::take(&mut self.trait_map);
895 let delayed_lints = Steal::new(mem::take(&mut self.delayed_lints).into_boxed_slice());
896 let children = mem::take(&mut self.children);
897
898 #[cfg(debug_assertions)]
899 for (id, attrs) in attrs.iter() {
900 if attrs.is_empty() {
902 {
::core::panicking::panic_fmt(format_args!("Stored empty attributes for {0:?}",
id));
};panic!("Stored empty attributes for {:?}", id);
903 }
904 }
905
906 bodies.sort_by_key(|(k, _)| *k);
907 let bodies = SortedMap::from_presorted_elements(bodies);
908
909 let rustc_middle::hir::Hashes { bodies_hash, attrs_hash } =
911 self.tcx.hash_owner_nodes(node, &bodies, &attrs, define_opaque);
912 let num_nodes = self.item_local_id_counter.as_usize();
913 let (nodes, parenting) = index::index_hir(self.tcx, node, &bodies, num_nodes);
914 let nodes = hir::OwnerNodes { opt_hash: bodies_hash, nodes, bodies };
915 let attrs = hir::AttributeMap { map: attrs, opt_hash: attrs_hash, define_opaque };
916
917 let opt_hash = self.tcx.needs_hir_hash().then(|| {
918 self.tcx.with_stable_hashing_context(|mut hcx| {
919 let mut stable_hasher = StableHasher::new();
920 bodies_hash.unwrap().stable_hash(&mut hcx, &mut stable_hasher);
921 attrs_hash.unwrap().stable_hash(&mut hcx, &mut stable_hasher);
922 parenting.stable_hash(&mut hcx, &mut stable_hasher);
924 trait_map.stable_hash(&mut hcx, &mut stable_hasher);
925 children.stable_hash(&mut hcx, &mut stable_hasher);
926 stable_hasher.finish()
927 })
928 });
929
930 self.arena.alloc(hir::OwnerInfo {
931 opt_hash,
932 nodes,
933 parenting,
934 attrs,
935 trait_map,
936 delayed_lints,
937 children,
938 })
939 }
940
941 x;#[instrument(level = "debug", skip(self), ret)]
947 fn lower_node_id(&mut self, ast_node_id: NodeId) -> HirId {
948 assert_ne!(ast_node_id, DUMMY_NODE_ID);
949
950 let owner = self.current_hir_id_owner;
951 let local_id = self.item_local_id_counter;
952 assert_ne!(local_id, hir::ItemLocalId::ZERO);
953 self.item_local_id_counter.increment_by(1);
954 let hir_id = HirId { owner, local_id };
955
956 if let Some(def_id) = self.opt_local_def_id(ast_node_id) {
957 self.children.insert(def_id, hir::MaybeOwner::NonOwner(hir_id));
958 }
959
960 if let Some(traits) = self.owner.trait_map.get(&ast_node_id) {
961 self.trait_map.insert(hir_id.local_id, *traits);
962 }
963
964 #[cfg(debug_assertions)]
966 self.relowering_checker.assert_node_is_not_relowered(ast_node_id, local_id);
967
968 hir_id
969 }
970
971 x;#[instrument(level = "debug", skip(self), ret)]
973 fn next_id(&mut self) -> HirId {
974 let owner = self.current_hir_id_owner;
975 let local_id = self.item_local_id_counter;
976 assert_ne!(local_id, hir::ItemLocalId::ZERO);
977 self.item_local_id_counter.increment_by(1);
978 HirId { owner, local_id }
979 }
980
981 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_res",
"rustc_ast_lowering", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(981u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("res")
}> =
::tracing::__macro_support::FieldName::new("res");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: Res = loop {};
return __tracing_attr_fake_return;
}
{
let res: Result<Res, ()> =
res.apply_id(|id|
{
let owner = self.current_hir_id_owner;
let local_id =
self.ident_and_label_to_local_id.get(&id).copied().ok_or(())?;
Ok(HirId { owner, local_id })
});
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:988",
"rustc_ast_lowering", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(988u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("res")
}> =
::tracing::__macro_support::FieldName::new("res");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
res.unwrap_or(Res::Err)
}
}
}#[instrument(level = "trace", skip(self))]
982 fn lower_res(&mut self, res: Res<NodeId>) -> Res {
983 let res: Result<Res, ()> = res.apply_id(|id| {
984 let owner = self.current_hir_id_owner;
985 let local_id = self.ident_and_label_to_local_id.get(&id).copied().ok_or(())?;
986 Ok(HirId { owner, local_id })
987 });
988 trace!(?res);
989
990 res.unwrap_or(Res::Err)
996 }
997
998 fn expect_full_res(&mut self, id: NodeId) -> Res<NodeId> {
999 self.get_partial_res(id).map_or(Res::Err, |pr| pr.expect_full_res())
1000 }
1001
1002 fn lower_import_res(&mut self, id: NodeId, span: Span) -> PerNS<Option<Res>> {
1003 if true {
{
match (&id, &self.owner.id) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(id, self.owner.id);
1004 let per_ns = self.owner.import_res.map(|res| res.map(|res| self.lower_res(res)));
1005 if per_ns.is_empty() {
1006 self.dcx().span_delayed_bug(span, "no resolution for an import");
1008 let err = Some(Res::Err);
1009 return PerNS { type_ns: err, value_ns: err, macro_ns: err };
1010 }
1011 per_ns
1012 }
1013
1014 fn make_lang_item_qpath(
1015 &mut self,
1016 lang_item: LangItem,
1017 span: Span,
1018 args: Option<&'hir hir::GenericArgs<'hir>>,
1019 ) -> hir::QPath<'hir> {
1020 hir::QPath::Resolved(None, self.make_lang_item_path(lang_item, span, args))
1021 }
1022
1023 fn make_lang_item_path(
1024 &mut self,
1025 lang_item: LangItem,
1026 span: Span,
1027 args: Option<&'hir hir::GenericArgs<'hir>>,
1028 ) -> &'hir hir::Path<'hir> {
1029 let def_id = self.tcx.require_lang_item(lang_item, span);
1030 let def_kind = self.tcx.def_kind(def_id);
1031 let res = Res::Def(def_kind, def_id);
1032 self.arena.alloc(hir::Path {
1033 span,
1034 res,
1035 segments: self.arena.alloc_from_iter([hir::PathSegment {
1036 ident: Ident::new(lang_item.name(), span),
1037 hir_id: self.next_id(),
1038 res,
1039 args,
1040 infer_args: args.is_none(),
1041 delegation_child_segment: false,
1042 }]),
1043 })
1044 }
1045
1046 fn mark_span_with_reason(
1049 &self,
1050 reason: DesugaringKind,
1051 span: Span,
1052 allow_internal_unstable: Option<Arc<[Symbol]>>,
1053 ) -> Span {
1054 self.tcx.with_stable_hashing_context(|hcx| {
1055 span.mark_with_reason(allow_internal_unstable, reason, span.edition(), hcx)
1056 })
1057 }
1058
1059 fn span_lowerer(&self) -> SpanLowerer {
1060 SpanLowerer {
1061 is_incremental: self.tcx.sess.opts.incremental.is_some(),
1062 def_id: self.current_hir_id_owner.def_id,
1063 }
1064 }
1065
1066 fn lower_span(&self, span: Span) -> Span {
1069 self.span_lowerer().lower(span)
1070 }
1071
1072 fn lower_ident(&self, ident: Ident) -> Ident {
1073 Ident::new(ident.name, self.lower_span(ident.span))
1074 }
1075
1076 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lifetime_res_to_generic_param",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1077u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("ident")
}> =
::tracing::__macro_support::FieldName::new("ident");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("node_id")
}> =
::tracing::__macro_support::FieldName::new("node_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("kind")
}> =
::tracing::__macro_support::FieldName::new("kind");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("source")
}> =
::tracing::__macro_support::FieldName::new("source");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ident)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&node_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&kind)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&source)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::GenericParam<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
let _def_id =
self.create_def(node_id, Some(kw::UnderscoreLifetime),
DefKind::LifetimeParam, ident.span);
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1092",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1092u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("_def_id")
}> =
::tracing::__macro_support::FieldName::new("_def_id");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&_def_id)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let hir_id = self.lower_node_id(node_id);
let def_id = self.local_def_id(node_id);
hir::GenericParam {
hir_id,
def_id,
name: hir::ParamName::Fresh,
span: self.lower_span(ident.span),
pure_wrt_drop: false,
kind: hir::GenericParamKind::Lifetime {
kind: hir::LifetimeParamKind::Elided(kind),
},
colon_span: None,
source,
}
}
}
}#[instrument(level = "debug", skip(self))]
1078 fn lifetime_res_to_generic_param(
1079 &mut self,
1080 ident: Ident,
1081 node_id: NodeId,
1082 kind: MissingLifetimeKind,
1083 source: hir::GenericParamSource,
1084 ) -> hir::GenericParam<'hir> {
1085 let _def_id = self.create_def(
1087 node_id,
1088 Some(kw::UnderscoreLifetime),
1089 DefKind::LifetimeParam,
1090 ident.span,
1091 );
1092 debug!(?_def_id);
1093
1094 let hir_id = self.lower_node_id(node_id);
1095 let def_id = self.local_def_id(node_id);
1096 hir::GenericParam {
1097 hir_id,
1098 def_id,
1099 name: hir::ParamName::Fresh,
1100 span: self.lower_span(ident.span),
1101 pure_wrt_drop: false,
1102 kind: hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Elided(kind) },
1103 colon_span: None,
1104 source,
1105 }
1106 }
1107
1108 x;#[instrument(level = "debug", skip(self), ret)]
1114 #[inline]
1115 fn lower_lifetime_binder(
1116 &mut self,
1117 binder: NodeId,
1118 generic_params: &[GenericParam],
1119 ) -> &'hir [hir::GenericParam<'hir>] {
1120 let extra_lifetimes = self.owner.extra_lifetime_params(binder);
1123 debug!(?extra_lifetimes);
1124 let extra_lifetimes: Vec<_> = extra_lifetimes
1125 .iter()
1126 .map(|&(ident, node_id, res)| {
1127 self.lifetime_res_to_generic_param(
1128 ident,
1129 node_id,
1130 res,
1131 hir::GenericParamSource::Binder,
1132 )
1133 })
1134 .collect();
1135 let arena = self.arena;
1136 let explicit_generic_params =
1137 self.lower_generic_params_mut(generic_params, hir::GenericParamSource::Binder);
1138 arena.alloc_from_iter(explicit_generic_params.chain(extra_lifetimes.into_iter()))
1139 }
1140
1141 fn with_dyn_type_scope<T>(&mut self, in_scope: bool, f: impl FnOnce(&mut Self) -> T) -> T {
1142 let was_in_dyn_type = self.is_in_dyn_type;
1143 self.is_in_dyn_type = in_scope;
1144
1145 let result = f(self);
1146
1147 self.is_in_dyn_type = was_in_dyn_type;
1148
1149 result
1150 }
1151
1152 fn with_new_scopes<T>(&mut self, scope_span: Span, f: impl FnOnce(&mut Self) -> T) -> T {
1153 let current_item = self.current_item;
1154 self.current_item = Some(scope_span);
1155
1156 let was_in_loop_condition = self.is_in_loop_condition;
1157 self.is_in_loop_condition = false;
1158
1159 let old_contract = self.contract_ensures.take();
1160
1161 let try_block_scope = mem::replace(&mut self.try_block_scope, TryBlockScope::Function);
1162 let loop_scope = self.loop_scope.take();
1163 let ret = f(self);
1164 self.try_block_scope = try_block_scope;
1165 self.loop_scope = loop_scope;
1166
1167 self.contract_ensures = old_contract;
1168
1169 self.is_in_loop_condition = was_in_loop_condition;
1170
1171 self.current_item = current_item;
1172
1173 ret
1174 }
1175
1176 fn lower_attrs(
1177 &mut self,
1178 id: HirId,
1179 attrs: &[Attribute],
1180 target_span: Span,
1181 target: Target,
1182 ) -> &'hir [hir::Attribute] {
1183 self.lower_attrs_with_extra(id, attrs, target_span, target, &[])
1184 }
1185
1186 fn lower_attrs_with_extra(
1187 &mut self,
1188 id: HirId,
1189 attrs: &[Attribute],
1190 target_span: Span,
1191 target: Target,
1192 extra_hir_attributes: &[hir::Attribute],
1193 ) -> &'hir [hir::Attribute] {
1194 if attrs.is_empty() && extra_hir_attributes.is_empty() {
1195 &[]
1196 } else {
1197 let mut lowered_attrs =
1198 self.lower_attrs_vec(attrs, self.lower_span(target_span), id, target);
1199 lowered_attrs.extend(extra_hir_attributes.iter().cloned());
1200
1201 {
match (&id.owner, &self.current_hir_id_owner) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};assert_eq!(id.owner, self.current_hir_id_owner);
1202 let ret = self.arena.alloc_from_iter(lowered_attrs);
1203
1204 if ret.is_empty() {
1211 &[]
1212 } else {
1213 self.attrs.insert(id.local_id, ret);
1214 ret
1215 }
1216 }
1217 }
1218
1219 fn lower_attrs_vec(
1220 &mut self,
1221 attrs: &[Attribute],
1222 target_span: Span,
1223 target_hir_id: HirId,
1224 target: Target,
1225 ) -> Vec<hir::Attribute> {
1226 let l = self.span_lowerer();
1227 self.attribute_parser.parse_attribute_list(
1228 attrs,
1229 target_span,
1230 target,
1231 OmitDoc::Lower,
1232 |s| l.lower(s),
1233 |lint_id, span, kind| {
1234 self.delayed_lints.push(DelayedLint {
1235 lint_id,
1236 id: target_hir_id,
1237 span,
1238 callback: Box::new(move |dcx, level, sess: &dyn std::any::Any| {
1239 let sess = sess
1240 .downcast_ref::<rustc_session::Session>()
1241 .expect("expected `Session`");
1242 (kind.0)(dcx, level, sess)
1243 }),
1244 });
1245 },
1246 )
1247 }
1248
1249 fn alias_attrs(&mut self, id: HirId, target_id: HirId) {
1250 {
match (&id.owner, &self.current_hir_id_owner) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};assert_eq!(id.owner, self.current_hir_id_owner);
1251 {
match (&target_id.owner, &self.current_hir_id_owner) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};assert_eq!(target_id.owner, self.current_hir_id_owner);
1252 if let Some(&a) = self.attrs.get(&target_id.local_id) {
1253 if !!a.is_empty() {
::core::panicking::panic("assertion failed: !a.is_empty()")
};assert!(!a.is_empty());
1254 self.attrs.insert(id.local_id, a);
1255 }
1256 }
1257
1258 fn lower_delim_args(&self, args: &DelimArgs) -> DelimArgs {
1259 args.clone()
1260 }
1261
1262 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_assoc_item_constraint",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1263u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{ meta.fields().value_set_all(&[]) })
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::AssocItemConstraint<'hir> =
loop {};
return __tracing_attr_fake_return;
}
{
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1269",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1269u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("constraint")
}> =
::tracing::__macro_support::FieldName::new("constraint");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("itctx")
}> =
::tracing::__macro_support::FieldName::new("itctx");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&constraint)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let gen_args =
if let Some(gen_args) = &constraint.gen_args {
let gen_args_ctor =
match gen_args {
GenericArgs::AngleBracketed(data) => {
self.lower_angle_bracketed_parameter_data(data,
ParamMode::Explicit, itctx).0
}
GenericArgs::Parenthesized(data) => {
if let Some(first_char) =
constraint.ident.as_str().chars().next() &&
first_char.is_ascii_lowercase() {
let err =
match (&data.inputs[..], &data.output) {
([_, ..], FnRetTy::Default(_)) => {
diagnostics::BadReturnTypeNotation::Inputs {
span: data.inputs_span,
}
}
([], FnRetTy::Default(_)) => {
diagnostics::BadReturnTypeNotation::NeedsDots {
span: data.inputs_span,
}
}
(_, FnRetTy::Ty(ty)) => {
let span = data.inputs_span.shrink_to_hi().to(ty.span);
diagnostics::BadReturnTypeNotation::Output {
span,
suggestion: diagnostics::RTNSuggestion {
output: span,
input: data.inputs_span,
},
}
}
};
let mut err = self.dcx().create_err(err);
if !self.tcx.features().return_type_notation() &&
self.tcx.sess.is_nightly_build() {
add_feature_diagnostics(&mut err, &self.tcx.sess,
sym::return_type_notation);
}
err.emit();
GenericArgsCtor {
args: Default::default(),
constraints: &[],
parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
span: data.span,
}
} else {
self.emit_bad_parenthesized_trait_in_assoc_ty(data);
self.lower_angle_bracketed_parameter_data(&data.as_angle_bracketed_args(),
ParamMode::Explicit, itctx).0
}
}
GenericArgs::ParenthesizedElided(span) =>
GenericArgsCtor {
args: Default::default(),
constraints: &[],
parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
span: *span,
},
};
gen_args_ctor.into_generic_args(self)
} else { hir::GenericArgs::NONE };
let kind =
match &constraint.kind {
AssocItemConstraintKind::Equality { term } => {
let term =
match term {
Term::Ty(ty) => self.lower_ty_alloc(ty, itctx).into(),
Term::Const(c) =>
self.lower_anon_const_to_const_arg_and_alloc(c).into(),
};
hir::AssocItemConstraintKind::Equality { term }
}
AssocItemConstraintKind::Bound { bounds } => {
if self.is_in_dyn_type {
let suggestion =
match itctx {
ImplTraitContext::OpaqueTy { .. } |
ImplTraitContext::Universal => {
let bound_end_span =
constraint.gen_args.as_ref().map_or(constraint.ident.span,
|args| args.span());
if bound_end_span.eq_ctxt(constraint.span) {
Some(self.tcx.sess.source_map().next_point(bound_end_span))
} else { None }
}
_ => None,
};
let guar =
self.dcx().emit_err(diagnostics::MisplacedAssocTyBinding {
span: constraint.span,
suggestion,
});
let err_ty =
&*self.arena.alloc(self.ty(constraint.span,
hir::TyKind::Err(guar)));
hir::AssocItemConstraintKind::Equality {
term: err_ty.into(),
}
} else {
let bounds =
self.lower_param_bounds(bounds,
RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::AssocTyBounds),
itctx);
hir::AssocItemConstraintKind::Bound { bounds }
}
}
};
hir::AssocItemConstraint {
hir_id: self.lower_node_id(constraint.id),
ident: self.lower_ident(constraint.ident),
gen_args,
kind,
span: self.lower_span(constraint.span),
}
}
}
}#[instrument(level = "debug", skip_all)]
1264 fn lower_assoc_item_constraint(
1265 &mut self,
1266 constraint: &AssocItemConstraint,
1267 itctx: ImplTraitContext,
1268 ) -> hir::AssocItemConstraint<'hir> {
1269 debug!(?constraint, ?itctx);
1270 let gen_args = if let Some(gen_args) = &constraint.gen_args {
1272 let gen_args_ctor = match gen_args {
1273 GenericArgs::AngleBracketed(data) => {
1274 self.lower_angle_bracketed_parameter_data(data, ParamMode::Explicit, itctx).0
1275 }
1276 GenericArgs::Parenthesized(data) => {
1277 if let Some(first_char) = constraint.ident.as_str().chars().next()
1278 && first_char.is_ascii_lowercase()
1279 {
1280 let err = match (&data.inputs[..], &data.output) {
1281 ([_, ..], FnRetTy::Default(_)) => {
1282 diagnostics::BadReturnTypeNotation::Inputs {
1283 span: data.inputs_span,
1284 }
1285 }
1286 ([], FnRetTy::Default(_)) => {
1287 diagnostics::BadReturnTypeNotation::NeedsDots {
1288 span: data.inputs_span,
1289 }
1290 }
1291 (_, FnRetTy::Ty(ty)) => {
1293 let span = data.inputs_span.shrink_to_hi().to(ty.span);
1294 diagnostics::BadReturnTypeNotation::Output {
1295 span,
1296 suggestion: diagnostics::RTNSuggestion {
1297 output: span,
1298 input: data.inputs_span,
1299 },
1300 }
1301 }
1302 };
1303 let mut err = self.dcx().create_err(err);
1304 if !self.tcx.features().return_type_notation()
1305 && self.tcx.sess.is_nightly_build()
1306 {
1307 add_feature_diagnostics(
1308 &mut err,
1309 &self.tcx.sess,
1310 sym::return_type_notation,
1311 );
1312 }
1313 err.emit();
1314 GenericArgsCtor {
1315 args: Default::default(),
1316 constraints: &[],
1317 parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
1318 span: data.span,
1319 }
1320 } else {
1321 self.emit_bad_parenthesized_trait_in_assoc_ty(data);
1322 self.lower_angle_bracketed_parameter_data(
1323 &data.as_angle_bracketed_args(),
1324 ParamMode::Explicit,
1325 itctx,
1326 )
1327 .0
1328 }
1329 }
1330 GenericArgs::ParenthesizedElided(span) => GenericArgsCtor {
1331 args: Default::default(),
1332 constraints: &[],
1333 parenthesized: hir::GenericArgsParentheses::ReturnTypeNotation,
1334 span: *span,
1335 },
1336 };
1337 gen_args_ctor.into_generic_args(self)
1338 } else {
1339 hir::GenericArgs::NONE
1340 };
1341 let kind = match &constraint.kind {
1342 AssocItemConstraintKind::Equality { term } => {
1343 let term = match term {
1344 Term::Ty(ty) => self.lower_ty_alloc(ty, itctx).into(),
1345 Term::Const(c) => self.lower_anon_const_to_const_arg_and_alloc(c).into(),
1346 };
1347 hir::AssocItemConstraintKind::Equality { term }
1348 }
1349 AssocItemConstraintKind::Bound { bounds } => {
1350 if self.is_in_dyn_type {
1352 let suggestion = match itctx {
1353 ImplTraitContext::OpaqueTy { .. } | ImplTraitContext::Universal => {
1354 let bound_end_span = constraint
1355 .gen_args
1356 .as_ref()
1357 .map_or(constraint.ident.span, |args| args.span());
1358 if bound_end_span.eq_ctxt(constraint.span) {
1359 Some(self.tcx.sess.source_map().next_point(bound_end_span))
1360 } else {
1361 None
1362 }
1363 }
1364 _ => None,
1365 };
1366
1367 let guar = self.dcx().emit_err(diagnostics::MisplacedAssocTyBinding {
1368 span: constraint.span,
1369 suggestion,
1370 });
1371 let err_ty =
1372 &*self.arena.alloc(self.ty(constraint.span, hir::TyKind::Err(guar)));
1373 hir::AssocItemConstraintKind::Equality { term: err_ty.into() }
1374 } else {
1375 let bounds = self.lower_param_bounds(
1376 bounds,
1377 RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::AssocTyBounds),
1378 itctx,
1379 );
1380 hir::AssocItemConstraintKind::Bound { bounds }
1381 }
1382 }
1383 };
1384
1385 hir::AssocItemConstraint {
1386 hir_id: self.lower_node_id(constraint.id),
1387 ident: self.lower_ident(constraint.ident),
1388 gen_args,
1389 kind,
1390 span: self.lower_span(constraint.span),
1391 }
1392 }
1393
1394 fn emit_bad_parenthesized_trait_in_assoc_ty(&self, data: &ParenthesizedArgs) {
1395 let sub = if data.inputs.is_empty() {
1397 let parentheses_span =
1398 data.inputs_span.shrink_to_lo().to(data.inputs_span.shrink_to_hi());
1399 AssocTyParenthesesSub::Empty { parentheses_span }
1400 }
1401 else {
1403 let open_param = data.inputs_span.shrink_to_lo().to(data
1405 .inputs
1406 .first()
1407 .unwrap()
1408 .span
1409 .shrink_to_lo());
1410 let close_param =
1412 data.inputs.last().unwrap().span.shrink_to_hi().to(data.inputs_span.shrink_to_hi());
1413 AssocTyParenthesesSub::NotEmpty { open_param, close_param }
1414 };
1415 self.dcx().emit_err(AssocTyParentheses { span: data.span, sub });
1416 }
1417
1418 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_generic_arg",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1418u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("arg")
}> =
::tracing::__macro_support::FieldName::new("arg");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("itctx")
}> =
::tracing::__macro_support::FieldName::new("itctx");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&arg)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::GenericArg<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
match arg {
ast::GenericArg::Lifetime(lt) =>
GenericArg::Lifetime(self.lower_lifetime(lt,
LifetimeSource::Path {
angle_brackets: hir::AngleBrackets::Full,
}, lt.ident.into())),
ast::GenericArg::Type(ty) => {
if ty.is_maybe_parenthesised_infer() {
return GenericArg::Infer(hir::InferArg {
hir_id: self.lower_node_id(ty.id),
span: self.lower_span(ty.span),
});
}
match &ty.kind {
TyKind::Path(None, path) => {
if let Some(res) =
self.get_partial_res(ty.id).and_then(|partial_res|
partial_res.full_res()) {
if !res.matches_ns(Namespace::TypeNS) &&
path.is_potential_trivial_const_arg() {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1455",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1455u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("lower_generic_arg: Lowering type argument as const argument: {0:?}",
ty) as &dyn ::tracing::field::Value))])
});
} else { ; }
};
let ct =
self.lower_const_path_to_const_arg(path, res, ty.id,
ty.span);
return GenericArg::Const(ct.try_as_ambig_ct().unwrap());
}
}
}
TyKind::DirectConstArg(expr) if
self.tcx.features().min_generic_const_args() => {
let ct =
match self.can_lower_expr_to_const_arg_direct(expr,
DirectConstArgContext::MacrolessMinGenericConstArgs) {
Ok(()) => self.lower_expr_to_const_arg_direct(expr, None),
Err(e) => e.emit(self),
};
let ct = self.arena.alloc(ct);
return match ct.try_as_ambig_ct() {
Some(ct) => GenericArg::Const(ct),
None =>
GenericArg::Infer(hir::InferArg {
hir_id: ct.hir_id,
span: ct.span,
}),
};
}
_ => {}
}
GenericArg::Type(self.lower_ty_alloc(ty,
itctx).try_as_ambig_ty().unwrap())
}
ast::GenericArg::Const(ct) => {
let ct = self.lower_anon_const_to_const_arg_and_alloc(ct);
match ct.try_as_ambig_ct() {
Some(ct) => GenericArg::Const(ct),
None =>
GenericArg::Infer(hir::InferArg {
hir_id: ct.hir_id,
span: ct.span,
}),
}
}
}
}
}
}#[instrument(level = "debug", skip(self))]
1419 fn lower_generic_arg(
1420 &mut self,
1421 arg: &ast::GenericArg,
1422 itctx: ImplTraitContext,
1423 ) -> hir::GenericArg<'hir> {
1424 match arg {
1425 ast::GenericArg::Lifetime(lt) => GenericArg::Lifetime(self.lower_lifetime(
1426 lt,
1427 LifetimeSource::Path { angle_brackets: hir::AngleBrackets::Full },
1428 lt.ident.into(),
1429 )),
1430 ast::GenericArg::Type(ty) => {
1431 if ty.is_maybe_parenthesised_infer() {
1434 return GenericArg::Infer(hir::InferArg {
1435 hir_id: self.lower_node_id(ty.id),
1436 span: self.lower_span(ty.span),
1437 });
1438 }
1439
1440 match &ty.kind {
1441 TyKind::Path(None, path) => {
1448 if let Some(res) = self
1449 .get_partial_res(ty.id)
1450 .and_then(|partial_res| partial_res.full_res())
1451 {
1452 if !res.matches_ns(Namespace::TypeNS)
1453 && path.is_potential_trivial_const_arg()
1454 {
1455 debug!(
1456 "lower_generic_arg: Lowering type argument as const argument: {:?}",
1457 ty,
1458 );
1459
1460 let ct =
1461 self.lower_const_path_to_const_arg(path, res, ty.id, ty.span);
1462 return GenericArg::Const(ct.try_as_ambig_ct().unwrap());
1463 }
1464 }
1465 }
1466 TyKind::DirectConstArg(expr)
1467 if self.tcx.features().min_generic_const_args() =>
1468 {
1469 let ct = match self.can_lower_expr_to_const_arg_direct(
1470 expr,
1471 DirectConstArgContext::MacrolessMinGenericConstArgs,
1472 ) {
1473 Ok(()) => self.lower_expr_to_const_arg_direct(expr, None),
1474 Err(e) => e.emit(self),
1475 };
1476 let ct = self.arena.alloc(ct);
1477 return match ct.try_as_ambig_ct() {
1480 Some(ct) => GenericArg::Const(ct),
1481 None => GenericArg::Infer(hir::InferArg {
1482 hir_id: ct.hir_id,
1483 span: ct.span,
1484 }),
1485 };
1486 }
1487 _ => {}
1488 }
1489 GenericArg::Type(self.lower_ty_alloc(ty, itctx).try_as_ambig_ty().unwrap())
1490 }
1491 ast::GenericArg::Const(ct) => {
1492 let ct = self.lower_anon_const_to_const_arg_and_alloc(ct);
1493 match ct.try_as_ambig_ct() {
1494 Some(ct) => GenericArg::Const(ct),
1495 None => GenericArg::Infer(hir::InferArg { hir_id: ct.hir_id, span: ct.span }),
1496 }
1497 }
1498 }
1499 }
1500
1501 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_ty_alloc",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1501u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("t")
}> =
::tracing::__macro_support::FieldName::new("t");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("itctx")
}> =
::tracing::__macro_support::FieldName::new("itctx");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&t)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'hir hir::Ty<'hir> = loop {};
return __tracing_attr_fake_return;
}
{ self.arena.alloc(self.lower_ty(t, itctx)) }
}
}#[instrument(level = "debug", skip(self))]
1502 fn lower_ty_alloc(&mut self, t: &Ty, itctx: ImplTraitContext) -> &'hir hir::Ty<'hir> {
1503 self.arena.alloc(self.lower_ty(t, itctx))
1504 }
1505
1506 fn lower_path_ty(
1507 &mut self,
1508 t: &Ty,
1509 qself: &Option<Box<QSelf>>,
1510 path: &Path,
1511 param_mode: ParamMode,
1512 itctx: ImplTraitContext,
1513 ) -> hir::Ty<'hir> {
1514 if qself.is_none()
1520 && let Some(partial_res) = self.get_partial_res(t.id)
1521 && let Some(Res::Def(DefKind::Trait | DefKind::TraitAlias, _)) = partial_res.full_res()
1522 {
1523 let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1524 let bound = this.lower_poly_trait_ref(
1525 &PolyTraitRef {
1526 bound_generic_params: ThinVec::new(),
1527 modifiers: TraitBoundModifiers::NONE,
1528 trait_ref: TraitRef { path: path.clone(), ref_id: t.id },
1529 span: t.span,
1530 parens: ast::Parens::No,
1531 },
1532 RelaxedBoundPolicy::Forbidden(RelaxedBoundForbiddenReason::TraitObjectTy),
1533 itctx,
1534 );
1535 let bounds = this.arena.alloc_from_iter([bound]);
1536 let lifetime_bound = this.elided_dyn_bound(t.span);
1537 (bounds, lifetime_bound)
1538 });
1539 let kind = hir::TyKind::TraitObject(
1540 bounds,
1541 TaggedRef::new(lifetime_bound, TraitObjectSyntax::None),
1542 );
1543 return hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.next_id() };
1544 }
1545
1546 let id = self.lower_node_id(t.id);
1547 let qpath = self.lower_qpath(
1548 t.id,
1549 qself,
1550 path,
1551 param_mode,
1552 AllowReturnTypeNotation::Yes,
1553 itctx,
1554 None,
1555 );
1556 self.ty_path(id, t.span, qpath)
1557 }
1558
1559 fn ty(&mut self, span: Span, kind: hir::TyKind<'hir>) -> hir::Ty<'hir> {
1560 hir::Ty { hir_id: self.next_id(), kind, span: self.lower_span(span) }
1561 }
1562
1563 fn ty_tup(&mut self, span: Span, tys: &'hir [hir::Ty<'hir>]) -> hir::Ty<'hir> {
1564 self.ty(span, hir::TyKind::Tup(tys))
1565 }
1566
1567 fn lower_ty(&mut self, t: &Ty, itctx: ImplTraitContext) -> hir::Ty<'hir> {
1568 let kind = match &t.kind {
1569 TyKind::Infer => hir::TyKind::Infer(()),
1570 TyKind::Err(guar) => hir::TyKind::Err(*guar),
1571 TyKind::Slice(ty) => hir::TyKind::Slice(self.lower_ty_alloc(ty, itctx)),
1572 TyKind::Ptr(mt) => hir::TyKind::Ptr(self.lower_mt(mt, itctx)),
1573 TyKind::Ref(region, mt) => {
1574 let lifetime = self.lower_ty_direct_lifetime(t, *region);
1575 hir::TyKind::Ref(lifetime, self.lower_mt(mt, itctx))
1576 }
1577 TyKind::PinnedRef(region, mt) => {
1578 let lifetime = self.lower_ty_direct_lifetime(t, *region);
1579 let kind = hir::TyKind::Ref(lifetime, self.lower_mt(mt, itctx));
1580 let span = self.lower_span(t.span);
1581 let arg = hir::Ty { kind, span, hir_id: self.next_id() };
1582 let args = self.arena.alloc(hir::GenericArgs {
1583 args: self.arena.alloc([hir::GenericArg::Type(self.arena.alloc(arg))]),
1584 constraints: &[],
1585 parenthesized: hir::GenericArgsParentheses::No,
1586 span_ext: span,
1587 });
1588 let path = self.make_lang_item_qpath(LangItem::Pin, span, Some(args));
1589 hir::TyKind::Path(path)
1590 }
1591 TyKind::FnPtr(f) => {
1592 let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1593 hir::TyKind::FnPtr(self.arena.alloc(hir::FnPtrTy {
1594 generic_params,
1595 safety: self.lower_safety(f.safety, hir::Safety::Safe),
1596 abi: self.lower_extern(f.ext),
1597 decl: self.lower_fn_decl(&f.decl, t.id, t.span, FnDeclKind::Pointer, None),
1598 param_idents: self.lower_fn_params_to_idents(&f.decl),
1599 }))
1600 }
1601 TyKind::UnsafeBinder(f) => {
1602 let generic_params = self.lower_lifetime_binder(t.id, &f.generic_params);
1603 hir::TyKind::UnsafeBinder(self.arena.alloc(hir::UnsafeBinderTy {
1604 generic_params,
1605 inner_ty: self.lower_ty_alloc(&f.inner_ty, itctx),
1606 }))
1607 }
1608 TyKind::Never => hir::TyKind::Never,
1609 TyKind::Tup(tys) => hir::TyKind::Tup(
1610 self.arena.alloc_from_iter(tys.iter().map(|ty| self.lower_ty(ty, itctx))),
1611 ),
1612 TyKind::Paren(ty) => {
1613 return self.lower_ty(ty, itctx);
1614 }
1615 TyKind::Path(qself, path) => {
1616 return self.lower_path_ty(t, qself, path, ParamMode::Explicit, itctx);
1617 }
1618 TyKind::ImplicitSelf => {
1619 let hir_id = self.next_id();
1620 let res = self.expect_full_res(t.id);
1621 let res = self.lower_res(res);
1622 hir::TyKind::Path(hir::QPath::Resolved(
1623 None,
1624 self.arena.alloc(hir::Path {
1625 res,
1626 segments: self.arena.alloc_from_iter([hir::PathSegment::new(Ident::with_dummy_span(kw::SelfUpper),
hir_id, res)])arena_vec![self; hir::PathSegment::new(
1627 Ident::with_dummy_span(kw::SelfUpper),
1628 hir_id,
1629 res
1630 )],
1631 span: self.lower_span(t.span),
1632 }),
1633 ))
1634 }
1635 TyKind::Array(ty, length) => hir::TyKind::Array(
1636 self.lower_ty_alloc(ty, itctx),
1637 self.lower_array_length_to_const_arg(length),
1638 ),
1639 TyKind::TraitObject(bounds, kind) => {
1640 let mut lifetime_bound = None;
1641 let (bounds, lifetime_bound) = self.with_dyn_type_scope(true, |this| {
1642 let bounds =
1643 this.arena.alloc_from_iter(bounds.iter().filter_map(|bound| match bound {
1644 GenericBound::Trait(ty) => {
1648 let trait_ref = this.lower_poly_trait_ref(
1649 ty,
1650 RelaxedBoundPolicy::Forbidden(
1651 RelaxedBoundForbiddenReason::TraitObjectTy,
1652 ),
1653 itctx,
1654 );
1655 Some(trait_ref)
1656 }
1657 GenericBound::Outlives(lifetime) => {
1658 if lifetime_bound.is_none() {
1659 lifetime_bound = Some(this.lower_lifetime(
1660 lifetime,
1661 LifetimeSource::Other,
1662 lifetime.ident.into(),
1663 ));
1664 }
1665 None
1666 }
1667 GenericBound::Use(_, span) => {
1669 this.dcx()
1670 .span_delayed_bug(*span, "use<> not allowed in dyn types");
1671 None
1672 }
1673 }));
1674 let lifetime_bound =
1675 lifetime_bound.unwrap_or_else(|| this.elided_dyn_bound(t.span));
1676 (bounds, lifetime_bound)
1677 });
1678 hir::TyKind::TraitObject(bounds, TaggedRef::new(lifetime_bound, *kind))
1679 }
1680 TyKind::ImplTrait(def_node_id, bounds) => {
1681 let span = t.span;
1682 match itctx {
1683 ImplTraitContext::OpaqueTy { origin } => {
1684 self.lower_opaque_impl_trait(span, origin, *def_node_id, bounds, itctx)
1685 }
1686 ImplTraitContext::Universal => {
1687 if let Some(span) = bounds.iter().find_map(|bound| match *bound {
1688 ast::GenericBound::Use(_, span) => Some(span),
1689 _ => None,
1690 }) {
1691 self.tcx.dcx().emit_err(diagnostics::NoPreciseCapturesOnApit { span });
1692 }
1693
1694 let def_id = self.local_def_id(*def_node_id);
1695 let name = self.tcx.item_name(def_id.to_def_id());
1696 let ident = Ident::new(name, span);
1697 let (param, bounds, path) = self.lower_universal_param_and_bounds(
1698 *def_node_id,
1699 span,
1700 ident,
1701 bounds,
1702 );
1703 self.impl_trait_defs.push(param);
1704 if let Some(bounds) = bounds {
1705 self.impl_trait_bounds.push(bounds);
1706 }
1707 path
1708 }
1709 ImplTraitContext::InBinding => {
1710 hir::TyKind::TraitAscription(self.lower_param_bounds(
1711 bounds,
1712 RelaxedBoundPolicy::Allowed(&mut Default::default()),
1713 itctx,
1714 ))
1715 }
1716 ImplTraitContext::FeatureGated(position, feature) => {
1717 let guar = self
1718 .tcx
1719 .sess
1720 .create_feature_err(
1721 MisplacedImplTrait {
1722 span: t.span,
1723 position: DiagArgFromDisplay(&position),
1724 },
1725 feature,
1726 )
1727 .emit();
1728 hir::TyKind::Err(guar)
1729 }
1730 ImplTraitContext::Disallowed(position) => {
1731 let guar = self.dcx().emit_err(MisplacedImplTrait {
1732 span: t.span,
1733 position: DiagArgFromDisplay(&position),
1734 });
1735 hir::TyKind::Err(guar)
1736 }
1737 }
1738 }
1739 TyKind::Pat(ty, pat) => {
1740 hir::TyKind::Pat(self.lower_ty_alloc(ty, itctx), self.lower_ty_pat(pat, ty.span))
1741 }
1742 TyKind::FieldOf(ty, variant, field) => hir::TyKind::FieldOf(
1743 self.lower_ty_alloc(ty, itctx),
1744 self.arena.alloc(hir::TyFieldPath {
1745 variant: variant.map(|variant| self.lower_ident(variant)),
1746 field: self.lower_ident(*field),
1747 }),
1748 ),
1749 TyKind::MacCall(_) => {
1750 ::rustc_middle::util::bug::span_bug_fmt(t.span,
format_args!("`TyKind::MacCall` should have been expanded by now"))span_bug!(t.span, "`TyKind::MacCall` should have been expanded by now")
1751 }
1752 TyKind::CVarArgs => {
1753 let guar = self.dcx().span_delayed_bug(
1754 t.span,
1755 "`TyKind::CVarArgs` should have been handled elsewhere",
1756 );
1757 hir::TyKind::Err(guar)
1758 }
1759 TyKind::View(ty, fields) => {
1760 let ty = self.lower_ty_alloc(ty, itctx);
1761 let fields = self.arena.alloc_slice(fields);
1762 hir::TyKind::View(ty, fields)
1763 }
1764 TyKind::DirectConstArg(expr) => {
1765 let e = self.emit_bad_direct_const_arg(t.span, expr, "type");
1766 hir::TyKind::Err(e)
1767 }
1768 TyKind::Dummy => {
::core::panicking::panic_fmt(format_args!("`TyKind::Dummy` should never be lowered"));
}panic!("`TyKind::Dummy` should never be lowered"),
1769 };
1770
1771 hir::Ty { kind, span: self.lower_span(t.span), hir_id: self.lower_node_id(t.id) }
1772 }
1773
1774 pub(crate) fn emit_bad_direct_const_arg(
1775 &mut self,
1776 span: Span,
1777 expr: &Expr,
1778 expected: &'static str,
1779 ) -> ErrorGuaranteed {
1780 let msg = ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("expected {0}, found `direct_const_arg!()` constant",
expected))
})format!("expected {expected}, found `direct_const_arg!()` constant");
1781 if expr::WillCreateDefIdsVisitor.visit_expr(expr).is_break() {
1782 self.dcx().struct_span_fatal(span, msg).emit()
1785 } else {
1786 self.dcx().struct_span_err(span, msg).emit()
1787 }
1788 }
1789
1790 fn lower_ty_direct_lifetime(
1791 &mut self,
1792 t: &Ty,
1793 region: Option<Lifetime>,
1794 ) -> &'hir hir::Lifetime {
1795 let (region, syntax) = match region {
1796 Some(region) => (region, region.ident.into()),
1797
1798 None => {
1799 let id = if let Some(LifetimeRes::ElidedAnchor { start, end }) =
1800 self.owner.get_lifetime_res(t.id)
1801 {
1802 {
match (&start.plus(1), &end) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};assert_eq!(start.plus(1), end);
1803 start
1804 } else {
1805 self.next_node_id()
1806 };
1807 let span = self.tcx.sess.source_map().start_point(t.span).shrink_to_hi();
1808 let region = Lifetime { ident: Ident::new(kw::UnderscoreLifetime, span), id };
1809 (region, LifetimeSyntax::Implicit)
1810 }
1811 };
1812 self.lower_lifetime(®ion, LifetimeSource::Reference, syntax)
1813 }
1814
1815 x;#[instrument(level = "debug", skip(self), ret)]
1847 fn lower_opaque_impl_trait(
1848 &mut self,
1849 span: Span,
1850 origin: hir::OpaqueTyOrigin<LocalDefId>,
1851 opaque_ty_node_id: NodeId,
1852 bounds: &GenericBounds,
1853 itctx: ImplTraitContext,
1854 ) -> hir::TyKind<'hir> {
1855 let opaque_ty_span = self.mark_span_with_reason(DesugaringKind::OpaqueTy, span, None);
1861
1862 self.lower_opaque_inner(opaque_ty_node_id, origin, opaque_ty_span, |this| {
1863 this.lower_param_bounds(
1864 bounds,
1865 RelaxedBoundPolicy::Allowed(&mut Default::default()),
1866 itctx,
1867 )
1868 })
1869 }
1870
1871 fn lower_opaque_inner(
1872 &mut self,
1873 opaque_ty_node_id: NodeId,
1874 origin: hir::OpaqueTyOrigin<LocalDefId>,
1875 opaque_ty_span: Span,
1876 lower_item_bounds: impl FnOnce(&mut Self) -> &'hir [hir::GenericBound<'hir>],
1877 ) -> hir::TyKind<'hir> {
1878 let opaque_ty_def_id = self.local_def_id(opaque_ty_node_id);
1879 let opaque_ty_hir_id = self.lower_node_id(opaque_ty_node_id);
1880 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:1880",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1880u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("opaque_ty_def_id")
}> =
::tracing::__macro_support::FieldName::new("opaque_ty_def_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("opaque_ty_hir_id")
}> =
::tracing::__macro_support::FieldName::new("opaque_ty_hir_id");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&opaque_ty_def_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&opaque_ty_hir_id)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!(?opaque_ty_def_id, ?opaque_ty_hir_id);
1881
1882 let bounds = lower_item_bounds(self);
1883 let opaque_ty_def = hir::OpaqueTy {
1884 hir_id: opaque_ty_hir_id,
1885 def_id: opaque_ty_def_id,
1886 bounds,
1887 origin,
1888 span: self.lower_span(opaque_ty_span),
1889 };
1890 let opaque_ty_def = self.arena.alloc(opaque_ty_def);
1891
1892 hir::TyKind::OpaqueDef(opaque_ty_def)
1893 }
1894
1895 fn lower_precise_capturing_args(
1896 &mut self,
1897 precise_capturing_args: &[PreciseCapturingArg],
1898 ) -> &'hir [hir::PreciseCapturingArg<'hir>] {
1899 self.arena.alloc_from_iter(precise_capturing_args.iter().map(|arg| match arg {
1900 PreciseCapturingArg::Lifetime(lt) => hir::PreciseCapturingArg::Lifetime(
1901 self.lower_lifetime(lt, LifetimeSource::PreciseCapturing, lt.ident.into()),
1902 ),
1903 PreciseCapturingArg::Arg(path, id) => {
1904 let [segment] = path.segments.as_slice() else {
1905 ::core::panicking::panic("explicit panic");panic!();
1906 };
1907 let res = self.get_partial_res(*id).map_or(Res::Err, |partial_res| {
1908 partial_res.full_res().expect("no partial res expected for precise capture arg")
1909 });
1910 hir::PreciseCapturingArg::Param(hir::PreciseCapturingNonLifetimeArg {
1911 hir_id: self.lower_node_id(*id),
1912 ident: self.lower_ident(segment.ident),
1913 res: self.lower_res(res),
1914 })
1915 }
1916 }))
1917 }
1918
1919 fn lower_fn_params_to_idents(&mut self, decl: &FnDecl) -> &'hir [Option<Ident>] {
1920 self.arena.alloc_from_iter(decl.inputs.iter().map(|param| match param.pat.kind {
1921 PatKind::Missing => None,
1922 PatKind::Ident(_, ident, _) => Some(self.lower_ident(ident)),
1923 PatKind::Wild => Some(Ident::new(kw::Underscore, self.lower_span(param.pat.span))),
1924 _ => {
1925 self.dcx().span_delayed_bug(
1926 param.pat.span,
1927 "non-missing/ident/wild param pat must trigger an error",
1928 );
1929 None
1930 }
1931 }))
1932 }
1933
1934 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_fn_decl",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(1943u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("decl")
}> =
::tracing::__macro_support::FieldName::new("decl");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("fn_node_id")
}> =
::tracing::__macro_support::FieldName::new("fn_node_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("fn_span")
}> =
::tracing::__macro_support::FieldName::new("fn_span");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("kind")
}> =
::tracing::__macro_support::FieldName::new("kind");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("coro")
}> =
::tracing::__macro_support::FieldName::new("coro");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&decl)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_node_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_span)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&kind)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&coro)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'hir hir::FnDecl<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
let c_variadic = decl.c_variadic();
let mut splatted = decl.splatted();
let mut inputs = &decl.inputs[..];
if decl.c_variadic() {
splatted = None;
inputs = &inputs[..inputs.len() - 1];
}
let inputs =
self.arena.alloc_from_iter(inputs.iter().map(|param|
{
let itctx =
match kind {
FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl |
FnDeclKind::Trait => {
ImplTraitContext::Universal
}
FnDeclKind::ExternFn => {
ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnParam)
}
FnDeclKind::Closure => {
ImplTraitContext::Disallowed(ImplTraitPosition::ClosureParam)
}
FnDeclKind::Pointer => {
ImplTraitContext::Disallowed(ImplTraitPosition::PointerParam)
}
};
self.lower_ty(¶m.ty, itctx)
}));
let output =
match coro {
Some(coro) => {
let fn_def_id = self.owner.def_id;
self.lower_coroutine_fn_ret_ty(&decl.output, fn_def_id,
coro, kind)
}
None =>
match &decl.output {
FnRetTy::Ty(ty) => {
let itctx =
match kind {
FnDeclKind::Fn | FnDeclKind::Inherent =>
ImplTraitContext::OpaqueTy {
origin: hir::OpaqueTyOrigin::FnReturn {
parent: self.owner.def_id,
in_trait_or_impl: None,
},
},
FnDeclKind::Trait =>
ImplTraitContext::OpaqueTy {
origin: hir::OpaqueTyOrigin::FnReturn {
parent: self.owner.def_id,
in_trait_or_impl: Some(hir::RpitContext::Trait),
},
},
FnDeclKind::Impl =>
ImplTraitContext::OpaqueTy {
origin: hir::OpaqueTyOrigin::FnReturn {
parent: self.owner.def_id,
in_trait_or_impl: Some(hir::RpitContext::TraitImpl),
},
},
FnDeclKind::ExternFn => {
ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnReturn)
}
FnDeclKind::Closure => {
ImplTraitContext::Disallowed(ImplTraitPosition::ClosureReturn)
}
FnDeclKind::Pointer => {
ImplTraitContext::Disallowed(ImplTraitPosition::PointerReturn)
}
};
hir::FnRetTy::Return(self.lower_ty_alloc(ty, itctx))
}
FnRetTy::Default(span) =>
hir::FnRetTy::DefaultReturn(self.lower_span(*span)),
},
};
let fn_decl_kind =
hir::FnDeclFlags::default().set_implicit_self(decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None,
|arg|
{
let is_mutable_pat =
#[allow(non_exhaustive_omitted_patterns)] match arg.pat.kind
{
PatKind::Ident(hir::BindingMode(_, Mutability::Mut), ..) =>
true,
_ => false,
};
match &arg.ty.kind {
TyKind::ImplicitSelf if is_mutable_pat =>
hir::ImplicitSelfKind::Mut,
TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
TyKind::Ref(_, mt) | TyKind::PinnedRef(_, mt) if
mt.ty.kind.is_implicit_self() => {
match mt.mutbl {
hir::Mutability::Not => hir::ImplicitSelfKind::RefImm,
hir::Mutability::Mut => hir::ImplicitSelfKind::RefMut,
}
}
_ => hir::ImplicitSelfKind::None,
}
})).set_lifetime_elision_allowed(self.owner.id == fn_node_id
&&
self.owner.lifetime_elision_allowed).set_c_variadic(c_variadic).set_splatted(splatted,
inputs.len()).unwrap();
self.arena.alloc(hir::FnDecl { inputs, output, fn_decl_kind })
}
}
}#[instrument(level = "debug", skip(self))]
1944 fn lower_fn_decl(
1945 &mut self,
1946 decl: &FnDecl,
1947 fn_node_id: NodeId,
1948 fn_span: Span,
1949 kind: FnDeclKind,
1950 coro: Option<CoroutineKind>,
1951 ) -> &'hir hir::FnDecl<'hir> {
1952 let c_variadic = decl.c_variadic();
1953 let mut splatted = decl.splatted();
1954
1955 let mut inputs = &decl.inputs[..];
1959 if decl.c_variadic() {
1960 splatted = None;
1962 inputs = &inputs[..inputs.len() - 1];
1963 }
1964 let inputs = self.arena.alloc_from_iter(inputs.iter().map(|param| {
1965 let itctx = match kind {
1966 FnDeclKind::Fn | FnDeclKind::Inherent | FnDeclKind::Impl | FnDeclKind::Trait => {
1967 ImplTraitContext::Universal
1968 }
1969 FnDeclKind::ExternFn => {
1970 ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnParam)
1971 }
1972 FnDeclKind::Closure => {
1973 ImplTraitContext::Disallowed(ImplTraitPosition::ClosureParam)
1974 }
1975 FnDeclKind::Pointer => {
1976 ImplTraitContext::Disallowed(ImplTraitPosition::PointerParam)
1977 }
1978 };
1979 self.lower_ty(¶m.ty, itctx)
1980 }));
1981
1982 let output = match coro {
1983 Some(coro) => {
1984 let fn_def_id = self.owner.def_id;
1985 self.lower_coroutine_fn_ret_ty(&decl.output, fn_def_id, coro, kind)
1986 }
1987 None => match &decl.output {
1988 FnRetTy::Ty(ty) => {
1989 let itctx = match kind {
1990 FnDeclKind::Fn | FnDeclKind::Inherent => ImplTraitContext::OpaqueTy {
1991 origin: hir::OpaqueTyOrigin::FnReturn {
1992 parent: self.owner.def_id,
1993 in_trait_or_impl: None,
1994 },
1995 },
1996 FnDeclKind::Trait => ImplTraitContext::OpaqueTy {
1997 origin: hir::OpaqueTyOrigin::FnReturn {
1998 parent: self.owner.def_id,
1999 in_trait_or_impl: Some(hir::RpitContext::Trait),
2000 },
2001 },
2002 FnDeclKind::Impl => ImplTraitContext::OpaqueTy {
2003 origin: hir::OpaqueTyOrigin::FnReturn {
2004 parent: self.owner.def_id,
2005 in_trait_or_impl: Some(hir::RpitContext::TraitImpl),
2006 },
2007 },
2008 FnDeclKind::ExternFn => {
2009 ImplTraitContext::Disallowed(ImplTraitPosition::ExternFnReturn)
2010 }
2011 FnDeclKind::Closure => {
2012 ImplTraitContext::Disallowed(ImplTraitPosition::ClosureReturn)
2013 }
2014 FnDeclKind::Pointer => {
2015 ImplTraitContext::Disallowed(ImplTraitPosition::PointerReturn)
2016 }
2017 };
2018 hir::FnRetTy::Return(self.lower_ty_alloc(ty, itctx))
2019 }
2020 FnRetTy::Default(span) => hir::FnRetTy::DefaultReturn(self.lower_span(*span)),
2021 },
2022 };
2023
2024 let fn_decl_kind = hir::FnDeclFlags::default()
2025 .set_implicit_self(decl.inputs.get(0).map_or(hir::ImplicitSelfKind::None, |arg| {
2026 let is_mutable_pat = matches!(
2027 arg.pat.kind,
2028 PatKind::Ident(hir::BindingMode(_, Mutability::Mut), ..)
2029 );
2030
2031 match &arg.ty.kind {
2032 TyKind::ImplicitSelf if is_mutable_pat => hir::ImplicitSelfKind::Mut,
2033 TyKind::ImplicitSelf => hir::ImplicitSelfKind::Imm,
2034 TyKind::Ref(_, mt) | TyKind::PinnedRef(_, mt)
2038 if mt.ty.kind.is_implicit_self() =>
2039 {
2040 match mt.mutbl {
2041 hir::Mutability::Not => hir::ImplicitSelfKind::RefImm,
2042 hir::Mutability::Mut => hir::ImplicitSelfKind::RefMut,
2043 }
2044 }
2045 _ => hir::ImplicitSelfKind::None,
2046 }
2047 }))
2048 .set_lifetime_elision_allowed(
2049 self.owner.id == fn_node_id && self.owner.lifetime_elision_allowed,
2050 )
2051 .set_c_variadic(c_variadic)
2052 .set_splatted(splatted, inputs.len())
2053 .unwrap();
2054
2055 self.arena.alloc(hir::FnDecl { inputs, output, fn_decl_kind })
2056 }
2057
2058 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_coroutine_fn_ret_ty",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2066u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("output")
}> =
::tracing::__macro_support::FieldName::new("output");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("fn_def_id")
}> =
::tracing::__macro_support::FieldName::new("fn_def_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("coro")
}> =
::tracing::__macro_support::FieldName::new("coro");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("fn_kind")
}> =
::tracing::__macro_support::FieldName::new("fn_kind");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&output)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_def_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&coro)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&fn_kind)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::FnRetTy<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
let span = self.lower_span(output.span());
let (opaque_ty_node_id, allowed_features) =
match coro {
CoroutineKind::Async { return_impl_trait_id, .. } =>
(return_impl_trait_id, None),
CoroutineKind::Gen { return_impl_trait_id, .. } =>
(return_impl_trait_id, None),
CoroutineKind::AsyncGen { return_impl_trait_id, .. } => {
(return_impl_trait_id,
Some(Arc::clone(&self.allow_async_iterator)))
}
};
let opaque_ty_span =
self.mark_span_with_reason(DesugaringKind::Async, span,
allowed_features);
let in_trait_or_impl =
match fn_kind {
FnDeclKind::Trait => Some(hir::RpitContext::Trait),
FnDeclKind::Impl => Some(hir::RpitContext::TraitImpl),
FnDeclKind::Fn | FnDeclKind::Inherent => None,
FnDeclKind::ExternFn | FnDeclKind::Closure |
FnDeclKind::Pointer =>
::core::panicking::panic("internal error: entered unreachable code"),
};
let opaque_ty_ref =
self.lower_opaque_inner(opaque_ty_node_id,
hir::OpaqueTyOrigin::AsyncFn {
parent: fn_def_id,
in_trait_or_impl,
}, opaque_ty_span,
|this|
{
let bound =
this.lower_coroutine_fn_output_type_to_bound(output, coro,
opaque_ty_span,
ImplTraitContext::OpaqueTy {
origin: hir::OpaqueTyOrigin::FnReturn {
parent: fn_def_id,
in_trait_or_impl,
},
});
this.arena.alloc_from_iter([bound])
});
let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
}
}
}#[instrument(level = "debug", skip(self))]
2067 fn lower_coroutine_fn_ret_ty(
2068 &mut self,
2069 output: &FnRetTy,
2070 fn_def_id: LocalDefId,
2071 coro: CoroutineKind,
2072 fn_kind: FnDeclKind,
2073 ) -> hir::FnRetTy<'hir> {
2074 let span = self.lower_span(output.span());
2075
2076 let (opaque_ty_node_id, allowed_features) = match coro {
2077 CoroutineKind::Async { return_impl_trait_id, .. } => (return_impl_trait_id, None),
2078 CoroutineKind::Gen { return_impl_trait_id, .. } => (return_impl_trait_id, None),
2079 CoroutineKind::AsyncGen { return_impl_trait_id, .. } => {
2080 (return_impl_trait_id, Some(Arc::clone(&self.allow_async_iterator)))
2081 }
2082 };
2083
2084 let opaque_ty_span =
2085 self.mark_span_with_reason(DesugaringKind::Async, span, allowed_features);
2086
2087 let in_trait_or_impl = match fn_kind {
2088 FnDeclKind::Trait => Some(hir::RpitContext::Trait),
2089 FnDeclKind::Impl => Some(hir::RpitContext::TraitImpl),
2090 FnDeclKind::Fn | FnDeclKind::Inherent => None,
2091 FnDeclKind::ExternFn | FnDeclKind::Closure | FnDeclKind::Pointer => unreachable!(),
2092 };
2093
2094 let opaque_ty_ref = self.lower_opaque_inner(
2095 opaque_ty_node_id,
2096 hir::OpaqueTyOrigin::AsyncFn { parent: fn_def_id, in_trait_or_impl },
2097 opaque_ty_span,
2098 |this| {
2099 let bound = this.lower_coroutine_fn_output_type_to_bound(
2100 output,
2101 coro,
2102 opaque_ty_span,
2103 ImplTraitContext::OpaqueTy {
2104 origin: hir::OpaqueTyOrigin::FnReturn {
2105 parent: fn_def_id,
2106 in_trait_or_impl,
2107 },
2108 },
2109 );
2110 arena_vec![this; bound]
2111 },
2112 );
2113
2114 let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref);
2115 hir::FnRetTy::Return(self.arena.alloc(opaque_ty))
2116 }
2117
2118 fn lower_coroutine_fn_output_type_to_bound(
2120 &mut self,
2121 output: &FnRetTy,
2122 coro: CoroutineKind,
2123 opaque_ty_span: Span,
2124 itctx: ImplTraitContext,
2125 ) -> hir::GenericBound<'hir> {
2126 let output_ty = match output {
2128 FnRetTy::Ty(ty) => {
2129 self.lower_ty_alloc(ty, itctx)
2133 }
2134 FnRetTy::Default(ret_ty_span) => self.arena.alloc(self.ty_tup(*ret_ty_span, &[])),
2135 };
2136
2137 let (assoc_ty_name, trait_lang_item) = match coro {
2139 CoroutineKind::Async { .. } => (sym::Output, LangItem::Future),
2140 CoroutineKind::Gen { .. } => (sym::Item, LangItem::Iterator),
2141 CoroutineKind::AsyncGen { .. } => (sym::Item, LangItem::AsyncIterator),
2142 };
2143
2144 let bound_args = self.arena.alloc(hir::GenericArgs {
2145 args: &[],
2146 constraints: self.arena.alloc_from_iter([self.assoc_ty_binding(assoc_ty_name,
opaque_ty_span, output_ty)])arena_vec![self; self.assoc_ty_binding(assoc_ty_name, opaque_ty_span, output_ty)],
2147 parenthesized: hir::GenericArgsParentheses::No,
2148 span_ext: DUMMY_SP,
2149 });
2150
2151 hir::GenericBound::Trait(hir::PolyTraitRef {
2152 bound_generic_params: &[],
2153 modifiers: hir::TraitBoundModifiers::NONE,
2154 trait_ref: hir::TraitRef {
2155 path: self.make_lang_item_path(trait_lang_item, opaque_ty_span, Some(bound_args)),
2156 hir_ref_id: self.next_id(),
2157 },
2158 span: opaque_ty_span,
2159 })
2160 }
2161
2162 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_param_bound",
"rustc_ast_lowering", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2162u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("tpb")
}> =
::tracing::__macro_support::FieldName::new("tpb");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("rbp")
}> =
::tracing::__macro_support::FieldName::new("rbp");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("itctx")
}> =
::tracing::__macro_support::FieldName::new("itctx");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&tpb)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&rbp)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::GenericBound<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
match tpb {
GenericBound::Trait(p) => {
hir::GenericBound::Trait(self.lower_poly_trait_ref(p, rbp,
itctx))
}
GenericBound::Outlives(lifetime) =>
hir::GenericBound::Outlives(self.lower_lifetime(lifetime,
LifetimeSource::OutlivesBound, lifetime.ident.into())),
GenericBound::Use(args, span) =>
hir::GenericBound::Use(self.lower_precise_capturing_args(args),
self.lower_span(*span)),
}
}
}
}#[instrument(level = "trace", skip(self))]
2163 fn lower_param_bound(
2164 &mut self,
2165 tpb: &GenericBound,
2166 rbp: RelaxedBoundPolicy<'_>,
2167 itctx: ImplTraitContext,
2168 ) -> hir::GenericBound<'hir> {
2169 match tpb {
2170 GenericBound::Trait(p) => {
2171 hir::GenericBound::Trait(self.lower_poly_trait_ref(p, rbp, itctx))
2172 }
2173 GenericBound::Outlives(lifetime) => hir::GenericBound::Outlives(self.lower_lifetime(
2174 lifetime,
2175 LifetimeSource::OutlivesBound,
2176 lifetime.ident.into(),
2177 )),
2178 GenericBound::Use(args, span) => hir::GenericBound::Use(
2179 self.lower_precise_capturing_args(args),
2180 self.lower_span(*span),
2181 ),
2182 }
2183 }
2184
2185 fn lower_lifetime(
2186 &mut self,
2187 l: &Lifetime,
2188 source: LifetimeSource,
2189 syntax: LifetimeSyntax,
2190 ) -> &'hir hir::Lifetime {
2191 self.new_named_lifetime(l.id, l.id, l.ident, source, syntax)
2192 }
2193
2194 fn lower_lifetime_hidden_in_path(
2195 &mut self,
2196 id: NodeId,
2197 span: Span,
2198 angle_brackets: AngleBrackets,
2199 ) -> &'hir hir::Lifetime {
2200 self.new_named_lifetime(
2201 id,
2202 id,
2203 Ident::new(kw::UnderscoreLifetime, span),
2204 LifetimeSource::Path { angle_brackets },
2205 LifetimeSyntax::Implicit,
2206 )
2207 }
2208
2209 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("new_named_lifetime",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2209u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("id")
}> =
::tracing::__macro_support::FieldName::new("id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("new_id")
}> =
::tracing::__macro_support::FieldName::new("new_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("ident")
}> =
::tracing::__macro_support::FieldName::new("ident");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("source")
}> =
::tracing::__macro_support::FieldName::new("source");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("syntax")
}> =
::tracing::__macro_support::FieldName::new("syntax");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&new_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ident)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&source)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&syntax)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'hir hir::Lifetime = loop {};
return __tracing_attr_fake_return;
}
{
let res =
if let Some(res) = self.owner.get_lifetime_res(id) {
match res {
LifetimeRes::Param { param, .. } =>
hir::LifetimeKind::Param(param),
LifetimeRes::Fresh { param, .. } => {
{
match (&ident.name, &kw::UnderscoreLifetime) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
let param = self.local_def_id(param);
hir::LifetimeKind::Param(param)
}
LifetimeRes::Infer => {
{
match (&ident.name, &kw::UnderscoreLifetime) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
hir::LifetimeKind::Infer
}
LifetimeRes::Static { .. } => {
if !#[allow(non_exhaustive_omitted_patterns)] match ident.name
{
kw::StaticLifetime | kw::UnderscoreLifetime => true,
_ => false,
} {
::core::panicking::panic("assertion failed: matches!(ident.name, kw::StaticLifetime | kw::UnderscoreLifetime)")
};
hir::LifetimeKind::Static
}
LifetimeRes::Error(guar) => hir::LifetimeKind::Error(guar),
LifetimeRes::ElidedAnchor { .. } => {
{
::core::panicking::panic_fmt(format_args!("Unexpected `ElidedAnchar` {0:?} at {1:?}",
ident, ident.span));
};
}
}
} else {
hir::LifetimeKind::Error(self.dcx().span_delayed_bug(ident.span,
"unresolved lifetime"))
};
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:2243",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2243u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("res")
}> =
::tracing::__macro_support::FieldName::new("res");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};
self.arena.alloc(hir::Lifetime::new(self.lower_node_id(new_id),
self.lower_ident(ident), res, source, syntax))
}
}
}#[instrument(level = "debug", skip(self))]
2210 fn new_named_lifetime(
2211 &mut self,
2212 id: NodeId,
2213 new_id: NodeId,
2214 ident: Ident,
2215 source: LifetimeSource,
2216 syntax: LifetimeSyntax,
2217 ) -> &'hir hir::Lifetime {
2218 let res = if let Some(res) = self.owner.get_lifetime_res(id) {
2219 match res {
2220 LifetimeRes::Param { param, .. } => hir::LifetimeKind::Param(param),
2221 LifetimeRes::Fresh { param, .. } => {
2222 assert_eq!(ident.name, kw::UnderscoreLifetime);
2223 let param = self.local_def_id(param);
2224 hir::LifetimeKind::Param(param)
2225 }
2226 LifetimeRes::Infer => {
2227 assert_eq!(ident.name, kw::UnderscoreLifetime);
2228 hir::LifetimeKind::Infer
2229 }
2230 LifetimeRes::Static { .. } => {
2231 assert!(matches!(ident.name, kw::StaticLifetime | kw::UnderscoreLifetime));
2232 hir::LifetimeKind::Static
2233 }
2234 LifetimeRes::Error(guar) => hir::LifetimeKind::Error(guar),
2235 LifetimeRes::ElidedAnchor { .. } => {
2236 panic!("Unexpected `ElidedAnchar` {:?} at {:?}", ident, ident.span);
2237 }
2238 }
2239 } else {
2240 hir::LifetimeKind::Error(self.dcx().span_delayed_bug(ident.span, "unresolved lifetime"))
2241 };
2242
2243 debug!(?res);
2244 self.arena.alloc(hir::Lifetime::new(
2245 self.lower_node_id(new_id),
2246 self.lower_ident(ident),
2247 res,
2248 source,
2249 syntax,
2250 ))
2251 }
2252
2253 fn lower_generic_params_mut(
2254 &mut self,
2255 params: &[GenericParam],
2256 source: hir::GenericParamSource,
2257 ) -> impl Iterator<Item = hir::GenericParam<'hir>> {
2258 params.iter().map(move |param| self.lower_generic_param(param, source))
2259 }
2260
2261 fn lower_generic_params(
2262 &mut self,
2263 params: &[GenericParam],
2264 source: hir::GenericParamSource,
2265 ) -> &'hir [hir::GenericParam<'hir>] {
2266 self.arena.alloc_from_iter(self.lower_generic_params_mut(params, source))
2267 }
2268
2269 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_generic_param",
"rustc_ast_lowering", ::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2269u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("param")
}> =
::tracing::__macro_support::FieldName::new("param");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("source")
}> =
::tracing::__macro_support::FieldName::new("source");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(¶m)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&source)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::GenericParam<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
let (name, kind) = self.lower_generic_param_kind(param, source);
let hir_id = self.lower_node_id(param.id);
let param_attrs = ¶m.attrs;
let param_span = param.span();
let param =
hir::GenericParam {
hir_id,
def_id: self.local_def_id(param.id),
name,
span: self.lower_span(param.span()),
pure_wrt_drop: attr::contains_name(¶m.attrs,
sym::may_dangle),
kind,
colon_span: param.colon_span.map(|s| self.lower_span(s)),
source,
};
self.lower_attrs(hir_id, param_attrs, param_span,
Target::from(¶m));
param
}
}
}#[instrument(level = "trace", skip(self))]
2270 fn lower_generic_param(
2271 &mut self,
2272 param: &GenericParam,
2273 source: hir::GenericParamSource,
2274 ) -> hir::GenericParam<'hir> {
2275 let (name, kind) = self.lower_generic_param_kind(param, source);
2276
2277 let hir_id = self.lower_node_id(param.id);
2278 let param_attrs = ¶m.attrs;
2279 let param_span = param.span();
2280 let param = hir::GenericParam {
2281 hir_id,
2282 def_id: self.local_def_id(param.id),
2283 name,
2284 span: self.lower_span(param.span()),
2285 pure_wrt_drop: attr::contains_name(¶m.attrs, sym::may_dangle),
2286 kind,
2287 colon_span: param.colon_span.map(|s| self.lower_span(s)),
2288 source,
2289 };
2290 self.lower_attrs(hir_id, param_attrs, param_span, Target::from(¶m));
2291 param
2292 }
2293
2294 fn lower_generic_param_kind(
2295 &mut self,
2296 param: &GenericParam,
2297 source: hir::GenericParamSource,
2298 ) -> (hir::ParamName, hir::GenericParamKind<'hir>) {
2299 match ¶m.kind {
2300 GenericParamKind::Lifetime => {
2301 let ident = self.lower_ident(param.ident);
2304 let param_name =
2305 if let Some(LifetimeRes::Error(..)) = self.owner.get_lifetime_res(param.id) {
2306 ParamName::Error(ident)
2307 } else {
2308 ParamName::Plain(ident)
2309 };
2310 let kind =
2311 hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Explicit };
2312
2313 (param_name, kind)
2314 }
2315 GenericParamKind::Type { default, .. } => {
2316 let default = default
2319 .as_ref()
2320 .filter(|_| match source {
2321 hir::GenericParamSource::Generics => true,
2322 hir::GenericParamSource::Binder => {
2323 self.dcx().emit_err(diagnostics::GenericParamDefaultInBinder {
2324 span: param.span(),
2325 });
2326
2327 false
2328 }
2329 })
2330 .map(|def| {
2331 self.lower_ty_alloc(
2332 def,
2333 ImplTraitContext::Disallowed(ImplTraitPosition::GenericDefault),
2334 )
2335 });
2336
2337 let kind = hir::GenericParamKind::Type { default, synthetic: false };
2338
2339 (hir::ParamName::Plain(self.lower_ident(param.ident)), kind)
2340 }
2341 GenericParamKind::Const { ty, span: _, default } => {
2342 let ty = self.lower_ty_alloc(
2343 ty,
2344 ImplTraitContext::Disallowed(ImplTraitPosition::GenericDefault),
2345 );
2346
2347 let default = default
2350 .as_ref()
2351 .filter(|anon_const| match source {
2352 hir::GenericParamSource::Generics => true,
2353 hir::GenericParamSource::Binder => {
2354 let err =
2355 diagnostics::GenericParamDefaultInBinder { span: param.span() };
2356 if expr::WillCreateDefIdsVisitor
2357 .visit_expr(&anon_const.value)
2358 .is_break()
2359 {
2360 self.dcx().emit_fatal(err)
2364 } else {
2365 self.dcx().emit_err(err);
2366 false
2367 }
2368 }
2369 })
2370 .map(|def| self.lower_anon_const_to_const_arg_and_alloc(def));
2371
2372 (
2373 hir::ParamName::Plain(self.lower_ident(param.ident)),
2374 hir::GenericParamKind::Const { ty, default },
2375 )
2376 }
2377 }
2378 }
2379
2380 fn lower_trait_ref(
2381 &mut self,
2382 modifiers: ast::TraitBoundModifiers,
2383 p: &TraitRef,
2384 itctx: ImplTraitContext,
2385 ) -> hir::TraitRef<'hir> {
2386 let path = match self.lower_qpath(
2387 p.ref_id,
2388 &None,
2389 &p.path,
2390 ParamMode::Explicit,
2391 AllowReturnTypeNotation::No,
2392 itctx,
2393 Some(modifiers),
2394 ) {
2395 hir::QPath::Resolved(None, path) => path,
2396 qpath => {
::core::panicking::panic_fmt(format_args!("lower_trait_ref: unexpected QPath `{0:?}`",
qpath));
}panic!("lower_trait_ref: unexpected QPath `{qpath:?}`"),
2397 };
2398 hir::TraitRef { path, hir_ref_id: self.lower_node_id(p.ref_id) }
2399 }
2400
2401 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_poly_trait_ref",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2401u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("bound_generic_params")
}> =
::tracing::__macro_support::FieldName::new("bound_generic_params");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("modifiers")
}> =
::tracing::__macro_support::FieldName::new("modifiers");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("trait_ref")
}> =
::tracing::__macro_support::FieldName::new("trait_ref");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("span")
}> =
::tracing::__macro_support::FieldName::new("span");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("rbp")
}> =
::tracing::__macro_support::FieldName::new("rbp");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("itctx")
}> =
::tracing::__macro_support::FieldName::new("itctx");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&bound_generic_params)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&modifiers)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&trait_ref)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&span)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&rbp)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&itctx)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::PolyTraitRef<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
let bound_generic_params =
self.lower_lifetime_binder(trait_ref.ref_id,
bound_generic_params);
let trait_ref =
self.lower_trait_ref(*modifiers, trait_ref, itctx);
let modifiers = self.lower_trait_bound_modifiers(*modifiers);
if let ast::BoundPolarity::Maybe(_) = modifiers.polarity {
self.validate_relaxed_bound(trait_ref, *span, rbp);
}
hir::PolyTraitRef {
bound_generic_params,
modifiers,
trait_ref,
span: self.lower_span(*span),
}
}
}
}#[instrument(level = "debug", skip(self))]
2402 fn lower_poly_trait_ref(
2403 &mut self,
2404 PolyTraitRef { bound_generic_params, modifiers, trait_ref, span, parens: _ }: &PolyTraitRef,
2405 rbp: RelaxedBoundPolicy<'_>,
2406 itctx: ImplTraitContext,
2407 ) -> hir::PolyTraitRef<'hir> {
2408 let bound_generic_params =
2409 self.lower_lifetime_binder(trait_ref.ref_id, bound_generic_params);
2410 let trait_ref = self.lower_trait_ref(*modifiers, trait_ref, itctx);
2411 let modifiers = self.lower_trait_bound_modifiers(*modifiers);
2412
2413 if let ast::BoundPolarity::Maybe(_) = modifiers.polarity {
2414 self.validate_relaxed_bound(trait_ref, *span, rbp);
2415 }
2416
2417 hir::PolyTraitRef {
2418 bound_generic_params,
2419 modifiers,
2420 trait_ref,
2421 span: self.lower_span(*span),
2422 }
2423 }
2424
2425 fn validate_relaxed_bound(
2426 &self,
2427 trait_ref: hir::TraitRef<'_>,
2428 span: Span,
2429 rbp: RelaxedBoundPolicy<'_>,
2430 ) {
2431 match rbp {
2441 RelaxedBoundPolicy::Allowed(dedup_map) => {
2442 let Some(trait_def_id) = trait_ref.trait_def_id() else { return };
2444 let tcx = self.tcx;
2445 let err = |s| {
2446 let name = tcx.item_name(trait_def_id);
2447 tcx.dcx()
2448 .struct_span_err(
2449 ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[span, s]))vec![span, s],
2450 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("duplicate relaxed `{0}` bounds",
name))
})format!("duplicate relaxed `{name}` bounds"),
2451 )
2452 .with_code(E0203)
2453 .emit();
2454 };
2455 dedup_map.entry(trait_def_id).and_modify(|&mut s| err(s)).or_insert(span);
2456 return;
2457 }
2458 RelaxedBoundPolicy::Forbidden(reason) => {
2459 let gate = |context, subject| {
2460 let extended = self.tcx.features().more_maybe_bounds();
2461 let is_sized = trait_ref
2462 .trait_def_id()
2463 .is_some_and(|def_id| self.tcx.is_lang_item(def_id, LangItem::Sized));
2464
2465 if extended && !is_sized {
2466 return;
2467 }
2468
2469 let prefix = if extended { "`Sized` " } else { "" };
2470 let mut diag = self.dcx().struct_span_err(
2471 span,
2472 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("relaxed {0}bounds are not permitted in {1}",
prefix, context))
})format!("relaxed {prefix}bounds are not permitted in {context}"),
2473 );
2474 if is_sized {
2475 diag.note(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0} are not implicitly bounded by `Sized`, so there is nothing to relax",
subject))
})format!(
2476 "{subject} are not implicitly bounded by `Sized`, \
2477 so there is nothing to relax"
2478 ));
2479 }
2480 diag.emit();
2481 };
2482
2483 match reason {
2484 RelaxedBoundForbiddenReason::TraitObjectTy => {
2485 gate("trait object types", "trait object types");
2486 return;
2487 }
2488 RelaxedBoundForbiddenReason::SuperTrait => {
2489 gate("supertrait bounds", "traits");
2490 return;
2491 }
2492 RelaxedBoundForbiddenReason::TraitAlias => {
2493 gate("trait alias bounds", "trait aliases");
2494 return;
2495 }
2496 RelaxedBoundForbiddenReason::AssocTyBounds
2497 | RelaxedBoundForbiddenReason::WhereBound => {}
2498 };
2499 }
2500 }
2501
2502 self.dcx()
2503 .struct_span_err(span, "this relaxed bound is not permitted here")
2504 .with_note(
2505 "in this context, relaxed bounds are only allowed on \
2506 type parameters defined on the closest item",
2507 )
2508 .emit();
2509 }
2510
2511 fn lower_mt(&mut self, mt: &MutTy, itctx: ImplTraitContext) -> hir::MutTy<'hir> {
2512 hir::MutTy { ty: self.lower_ty_alloc(&mt.ty, itctx), mutbl: mt.mutbl }
2513 }
2514
2515 x;#[instrument(level = "debug", skip(self), ret)]
2516 fn lower_param_bounds(
2517 &mut self,
2518 bounds: &[GenericBound],
2519 rbp: RelaxedBoundPolicy<'_>,
2520 itctx: ImplTraitContext,
2521 ) -> hir::GenericBounds<'hir> {
2522 self.arena.alloc_from_iter(self.lower_param_bounds_mut(bounds, rbp, itctx))
2523 }
2524
2525 fn lower_param_bounds_mut(
2526 &mut self,
2527 bounds: &[GenericBound],
2528 mut rbp: RelaxedBoundPolicy<'_>,
2529 itctx: ImplTraitContext,
2530 ) -> impl Iterator<Item = hir::GenericBound<'hir>> {
2531 bounds.iter().map(move |bound| self.lower_param_bound(bound, rbp.reborrow(), itctx))
2532 }
2533
2534 x;#[instrument(level = "debug", skip(self), ret)]
2535 fn lower_universal_param_and_bounds(
2536 &mut self,
2537 node_id: NodeId,
2538 span: Span,
2539 ident: Ident,
2540 bounds: &[GenericBound],
2541 ) -> (hir::GenericParam<'hir>, Option<hir::WherePredicate<'hir>>, hir::TyKind<'hir>) {
2542 let def_id = self.local_def_id(node_id);
2544 let span = self.lower_span(span);
2545
2546 let param = hir::GenericParam {
2548 hir_id: self.lower_node_id(node_id),
2549 def_id,
2550 name: ParamName::Plain(self.lower_ident(ident)),
2551 pure_wrt_drop: false,
2552 span,
2553 kind: hir::GenericParamKind::Type { default: None, synthetic: true },
2554 colon_span: None,
2555 source: hir::GenericParamSource::Generics,
2556 };
2557
2558 let preds = self.lower_generic_bound_predicate(
2559 ident,
2560 node_id,
2561 &GenericParamKind::Type { default: None },
2562 bounds,
2563 None,
2564 span,
2565 RelaxedBoundPolicy::Allowed(&mut Default::default()),
2566 ImplTraitContext::Universal,
2567 hir::PredicateOrigin::ImplTrait,
2568 );
2569
2570 let hir_id = self.next_id();
2571 let res = Res::Def(DefKind::TyParam, def_id.to_def_id());
2572 let ty = hir::TyKind::Path(hir::QPath::Resolved(
2573 None,
2574 self.arena.alloc(hir::Path {
2575 span,
2576 res,
2577 segments:
2578 arena_vec![self; hir::PathSegment::new(self.lower_ident(ident), hir_id, res)],
2579 }),
2580 ));
2581
2582 (param, preds, ty)
2583 }
2584
2585 fn lower_block_expr(&mut self, b: &Block) -> hir::Expr<'hir> {
2588 let block = self.lower_block(b, false);
2589 self.expr_block(block)
2590 }
2591
2592 fn lower_array_length_to_const_arg(&mut self, c: &AnonConst) -> &'hir hir::ConstArg<'hir> {
2593 match c.value.peel_parens().kind {
2596 ExprKind::Underscore => {
2597 let ct_kind = hir::ConstArgKind::Infer(());
2598 self.arena.alloc(hir::ConstArg {
2599 hir_id: self.lower_node_id(c.id),
2600 kind: ct_kind,
2601 span: self.lower_span(c.value.span),
2602 })
2603 }
2604 _ => self.lower_anon_const_to_const_arg_and_alloc(c),
2605 }
2606 }
2607
2608 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_const_path_to_const_arg",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2611u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("path")
}> =
::tracing::__macro_support::FieldName::new("path");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("res")
}> =
::tracing::__macro_support::FieldName::new("res");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("ty_id")
}> =
::tracing::__macro_support::FieldName::new("ty_id");
NAME.as_str()
},
{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("span")
}> =
::tracing::__macro_support::FieldName::new("span");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&path)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&res)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&ty_id)
as &dyn ::tracing::field::Value)),
(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&span)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: &'hir hir::ConstArg<'hir> =
loop {};
return __tracing_attr_fake_return;
}
{
let tcx = self.tcx;
let is_trivial_path =
path.is_potential_trivial_const_arg() &&
#[allow(non_exhaustive_omitted_patterns)] match res {
Res::Def(DefKind::ConstParam, _) => true,
_ => false,
};
let ct_kind =
if is_trivial_path ||
tcx.features().macroless_generic_const_args() {
let qpath =
self.lower_qpath(ty_id, &None, path, ParamMode::Explicit,
AllowReturnTypeNotation::No,
ImplTraitContext::Disallowed(ImplTraitPosition::Path),
None);
hir::ConstArgKind::Path(qpath)
} else {
let node_id = self.next_node_id();
let span = self.lower_span(span);
let def_id =
self.create_def(node_id, None, DefKind::AnonConst, span);
let hir_id = self.lower_node_id(node_id);
let path_expr =
Expr {
id: ty_id,
kind: ExprKind::Path(None, path.clone()),
span,
attrs: AttrVec::new(),
tokens: None,
};
let ct =
self.with_new_scopes(span,
|this|
{
self.arena.alloc(hir::AnonConst {
def_id,
hir_id,
body: this.lower_const_body(path_expr.span,
Some(&path_expr)),
span,
})
});
hir::ConstArgKind::Anon(ct)
};
self.arena.alloc(hir::ConstArg {
hir_id: self.next_id(),
kind: ct_kind,
span: self.lower_span(span),
})
}
}
}#[instrument(level = "debug", skip(self))]
2612 fn lower_const_path_to_const_arg(
2613 &mut self,
2614 path: &Path,
2615 res: Res<NodeId>,
2616 ty_id: NodeId,
2617 span: Span,
2618 ) -> &'hir hir::ConstArg<'hir> {
2619 let tcx = self.tcx;
2620
2621 let is_trivial_path = path.is_potential_trivial_const_arg()
2622 && matches!(res, Res::Def(DefKind::ConstParam, _));
2623 let ct_kind = if is_trivial_path || tcx.features().macroless_generic_const_args() {
2624 let qpath = self.lower_qpath(
2625 ty_id,
2626 &None,
2627 path,
2628 ParamMode::Explicit,
2629 AllowReturnTypeNotation::No,
2630 ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2632 None,
2633 );
2634 hir::ConstArgKind::Path(qpath)
2635 } else {
2636 let node_id = self.next_node_id();
2638 let span = self.lower_span(span);
2639
2640 let def_id = self.create_def(node_id, None, DefKind::AnonConst, span);
2645 let hir_id = self.lower_node_id(node_id);
2646
2647 let path_expr = Expr {
2648 id: ty_id,
2649 kind: ExprKind::Path(None, path.clone()),
2650 span,
2651 attrs: AttrVec::new(),
2652 tokens: None,
2653 };
2654
2655 let ct = self.with_new_scopes(span, |this| {
2656 self.arena.alloc(hir::AnonConst {
2657 def_id,
2658 hir_id,
2659 body: this.lower_const_body(path_expr.span, Some(&path_expr)),
2660 span,
2661 })
2662 });
2663 hir::ConstArgKind::Anon(ct)
2664 };
2665
2666 self.arena.alloc(hir::ConstArg {
2667 hir_id: self.next_id(),
2668 kind: ct_kind,
2669 span: self.lower_span(span),
2670 })
2671 }
2672
2673 fn lower_const_item_rhs(
2674 &mut self,
2675 body: &Option<Box<Expr>>,
2676 kind: ConstItemKind,
2677 span: Span,
2678 ) -> hir::ConstItemRhs<'hir> {
2679 match (body, kind) {
2680 (body, ConstItemKind::Body) => {
2681 hir::ConstItemRhs::Body(self.lower_const_body(span, body.as_deref()))
2682 }
2683 (Some(body), ConstItemKind::TypeConst) => {
2684 hir::ConstItemRhs::TypeConst(self.arena.alloc(
2685 match self.can_lower_expr_to_const_arg_direct(
2686 &body,
2687 DirectConstArgContext::MacrolessMinGenericConstArgs,
2688 ) {
2689 Ok(()) => self.lower_expr_to_const_arg_direct(&body, None),
2690 Err(err) => err.emit(self),
2691 },
2692 ))
2693 }
2694 (None, ConstItemKind::TypeConst) => {
2695 let const_arg = ConstArg {
2696 hir_id: self.next_id(),
2697 kind: hir::ConstArgKind::Error(
2698 self.dcx().span_delayed_bug(DUMMY_SP, "no block"),
2699 ),
2700 span: DUMMY_SP,
2701 };
2702 hir::ConstItemRhs::TypeConst(self.arena.alloc(const_arg))
2703 }
2704 }
2705 }
2706
2707 x;#[instrument(level = "debug", skip(self), ret)]
2708 fn can_lower_expr_to_const_arg_direct(
2709 &mut self,
2710 expr: &Expr,
2711 context: DirectConstArgContext,
2712 ) -> Result<(), UnrepresentableConstArgError> {
2713 use DirectConstArgContext::*;
2714 match (&expr.kind, context) {
2716 (
2717 ExprKind::Call(Expr { kind: ExprKind::Path(_, _), .. }, args),
2718 MacrolessMinGenericConstArgs,
2719 ) => {
2720 for arg in args {
2721 self.can_lower_expr_to_const_arg_direct(arg, context)?;
2722 }
2723 Ok(())
2724 }
2725 (ExprKind::Tup(exprs), MacrolessMinGenericConstArgs) => {
2726 for expr in exprs {
2727 self.can_lower_expr_to_const_arg_direct(expr, context)?;
2728 }
2729 Ok(())
2730 }
2731 (ExprKind::Path(_, _), MacrolessMinGenericConstArgs) => Ok(()),
2732 (ExprKind::Path(_, path), _) => {
2733 if path.is_potential_trivial_const_arg()
2734 && matches!(
2735 self.get_partial_res(expr.id)
2736 .and_then(|partial_res| partial_res.full_res()),
2737 Some(Res::Def(DefKind::ConstParam, _))
2738 )
2739 {
2740 Ok(())
2741 } else {
2742 Err(UnrepresentableConstArgError::new(expr))
2743 }
2744 }
2745 (ExprKind::Struct(se), MacrolessMinGenericConstArgs) => {
2746 for f in &se.fields {
2747 self.can_lower_expr_to_const_arg_direct(&f.expr, context)?;
2748 }
2749 Ok(())
2750 }
2751 (ExprKind::Array(elements), MacrolessMinGenericConstArgs) => {
2752 for element in elements {
2753 self.can_lower_expr_to_const_arg_direct(element, context)?;
2754 }
2755 Ok(())
2756 }
2757 (ExprKind::Underscore, MacrolessMinGenericConstArgs) => Ok(()),
2758 (ExprKind::Block(block, _), MacrolessMinGenericConstArgs)
2759 if let [stmt] = block.stmts.as_slice()
2760 && let StmtKind::Expr(expr) = &stmt.kind =>
2761 {
2762 self.can_lower_expr_to_const_arg_direct(expr, context)
2763 }
2764 (ExprKind::Lit(_), MacrolessMinGenericConstArgs) => Ok(()),
2765 (ExprKind::Unary(UnOp::Neg, inner_expr), MacrolessMinGenericConstArgs)
2766 if let ExprKind::Lit(_) = &inner_expr.kind =>
2767 {
2768 Ok(())
2769 }
2770 (ExprKind::ConstBlock(_), MacrolessMinGenericConstArgs) => Ok(()),
2771 (ExprKind::DirectConstArg(_), MacrolessMinGenericConstArgs | MinGenericConstArgs) => {
2772 Ok(())
2775 }
2776 _ => Err(UnrepresentableConstArgError::new(expr)),
2777 }
2778 }
2779
2780 x;#[instrument(level = "debug", skip(self), ret)]
2783 fn lower_expr_to_const_arg_direct(
2784 &mut self,
2785 expr: &Expr,
2786 id_override: Option<NodeId>,
2787 ) -> hir::ConstArg<'hir> {
2788 let span = self.lower_span(expr.span);
2789 let node_id = id_override.unwrap_or(expr.id);
2790 match &expr.kind {
2791 ExprKind::Call(func, args) if let ExprKind::Path(qself, path) = &func.kind => {
2792 let qpath = self.lower_qpath(
2793 func.id,
2794 qself,
2795 path,
2796 ParamMode::Explicit,
2797 AllowReturnTypeNotation::No,
2798 ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2799 None,
2800 );
2801
2802 let lowered_args = self.arena.alloc_from_iter(args.iter().map(|arg| {
2803 let const_arg = self.lower_expr_to_const_arg_direct(arg, None);
2804 &*self.arena.alloc(const_arg)
2805 }));
2806
2807 ConstArg {
2808 hir_id: self.lower_node_id(node_id),
2809 kind: hir::ConstArgKind::TupleCall(qpath, lowered_args),
2810 span,
2811 }
2812 }
2813 ExprKind::Tup(exprs) => {
2814 let exprs = self.arena.alloc_from_iter(exprs.iter().map(|expr| {
2815 let expr = self.lower_expr_to_const_arg_direct(expr, None);
2816 &*self.arena.alloc(expr)
2817 }));
2818
2819 ConstArg {
2820 hir_id: self.lower_node_id(node_id),
2821 kind: hir::ConstArgKind::Tup(exprs),
2822 span,
2823 }
2824 }
2825 ExprKind::Path(qself, path) => {
2826 let qpath = self.lower_qpath(
2827 expr.id,
2828 qself,
2829 path,
2830 ParamMode::Explicit,
2831 AllowReturnTypeNotation::No,
2832 ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2834 None,
2835 );
2836
2837 ConstArg {
2838 hir_id: self.lower_node_id(node_id),
2839 kind: hir::ConstArgKind::Path(qpath),
2840 span,
2841 }
2842 }
2843 ExprKind::Struct(se) => {
2844 let path = self.lower_qpath(
2845 expr.id,
2846 &se.qself,
2847 &se.path,
2848 ParamMode::Explicit,
2852 AllowReturnTypeNotation::No,
2853 ImplTraitContext::Disallowed(ImplTraitPosition::Path),
2854 None,
2855 );
2856
2857 let fields = self.arena.alloc_from_iter(se.fields.iter().map(|f| {
2858 let hir_id = self.lower_node_id(f.id);
2859 self.lower_attrs(hir_id, &f.attrs, f.span, Target::ExprField);
2863 let expr = self.lower_expr_to_const_arg_direct(&f.expr, None);
2864
2865 &*self.arena.alloc(hir::ConstArgExprField {
2866 hir_id,
2867 field: self.lower_ident(f.ident),
2868 expr: self.arena.alloc(expr),
2869 span: self.lower_span(f.span),
2870 })
2871 }));
2872
2873 ConstArg {
2874 hir_id: self.lower_node_id(node_id),
2875 kind: hir::ConstArgKind::Struct(path, fields),
2876 span,
2877 }
2878 }
2879 ExprKind::Array(elements) => {
2880 let lowered_elems = self.arena.alloc_from_iter(elements.iter().map(|element| {
2881 let const_arg = self.lower_expr_to_const_arg_direct(element, None);
2882 &*self.arena.alloc(const_arg)
2883 }));
2884 let array_expr = self.arena.alloc(hir::ConstArgArrayExpr {
2885 span: self.lower_span(expr.span),
2886 elems: lowered_elems,
2887 });
2888
2889 ConstArg {
2890 hir_id: self.lower_node_id(node_id),
2891 kind: hir::ConstArgKind::Array(array_expr),
2892 span,
2893 }
2894 }
2895 ExprKind::Underscore => ConstArg {
2896 hir_id: self.lower_node_id(node_id),
2897 kind: hir::ConstArgKind::Infer(()),
2898 span,
2899 },
2900 ExprKind::Block(block, _)
2901 if let [stmt] = block.stmts.as_slice()
2902 && let StmtKind::Expr(expr) = &stmt.kind =>
2903 {
2904 return self.lower_expr_to_const_arg_direct(expr, id_override);
2905 }
2906 ExprKind::Lit(literal) => {
2907 let span = self.lower_span(expr.span);
2908 let literal = self.lower_lit(literal, span);
2909
2910 ConstArg {
2911 hir_id: self.lower_node_id(node_id),
2912 kind: hir::ConstArgKind::Literal { lit: literal.node, negated: false },
2913 span,
2914 }
2915 }
2916 ExprKind::Unary(UnOp::Neg, inner_expr)
2917 if let ExprKind::Lit(literal) = &inner_expr.kind =>
2918 {
2919 let span = self.lower_span(expr.span);
2920 let literal = self.lower_lit(literal, span);
2921
2922 let kind = if !matches!(literal.node, LitKind::Int(..)) {
2923 let err =
2924 self.dcx().struct_span_err(expr.span, "negated literal must be an integer");
2925 hir::ConstArgKind::Error(err.emit())
2926 } else {
2927 hir::ConstArgKind::Literal { lit: literal.node, negated: true }
2928 };
2929 ConstArg { hir_id: self.lower_node_id(node_id), kind, span }
2930 }
2931 ExprKind::ConstBlock(anon_const) => {
2932 let def_id = self.local_def_id(anon_const.id);
2935 assert_eq!(DefKind::AnonConst, self.tcx.def_kind(def_id));
2936 let lowered_anon = self.lower_anon_const_to_anon_const(anon_const, span);
2937 ConstArg {
2938 hir_id: self.lower_node_id(node_id),
2939 kind: hir::ConstArgKind::Anon(lowered_anon),
2940 span,
2941 }
2942 }
2943 ExprKind::DirectConstArg(expr) => {
2944 match self.can_lower_expr_to_const_arg_direct(
2951 expr,
2952 DirectConstArgContext::MacrolessMinGenericConstArgs,
2953 ) {
2954 Ok(()) => self.lower_expr_to_const_arg_direct(expr, id_override),
2955 Err(err) => err.emit(self),
2956 }
2957 }
2958 _ => {
2959 span_bug!(
2960 expr.span,
2961 "lower_expr_to_const_arg_direct encountered an unlowerable expression, either \
2962 can_lower_expr_to_const_arg_direct returned Ok() on something it shouldn't \
2963 have, or you forgot to check can_lower_expr_to_const_arg_direct first"
2964 );
2965 }
2966 }
2967 }
2968
2969 fn lower_anon_const_to_const_arg_and_alloc(
2972 &mut self,
2973 anon: &AnonConst,
2974 ) -> &'hir hir::ConstArg<'hir> {
2975 self.arena.alloc(self.lower_anon_const_to_const_arg(anon))
2976 }
2977
2978 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("lower_anon_const_to_const_arg",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(2978u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("anon")
}> =
::tracing::__macro_support::FieldName::new("anon");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
meta.fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&anon)
as &dyn ::tracing::field::Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: hir::ConstArg<'hir> = loop {};
return __tracing_attr_fake_return;
}
{
let expr =
if self.tcx.features().macroless_generic_const_args() {
&anon.value
} else { anon.value.maybe_unwrap_block() };
let context =
if self.tcx.features().macroless_generic_const_args() {
DirectConstArgContext::MacrolessMinGenericConstArgs
} else if self.tcx.features().min_generic_const_args() {
DirectConstArgContext::MinGenericConstArgs
} else { DirectConstArgContext::Stable };
if self.can_lower_expr_to_const_arg_direct(expr, context).is_ok()
{
return self.lower_expr_to_const_arg_direct(expr,
Some(anon.id));
}
let lowered_anon =
self.lower_anon_const_to_anon_const(anon, anon.value.span);
ConstArg {
hir_id: self.next_id(),
kind: hir::ConstArgKind::Anon(lowered_anon),
span: self.lower_span(anon.value.span),
}
}
}
}#[instrument(level = "debug", skip(self))]
2979 fn lower_anon_const_to_const_arg(&mut self, anon: &AnonConst) -> hir::ConstArg<'hir> {
2980 let expr = if self.tcx.features().macroless_generic_const_args() {
2983 &anon.value
2984 } else {
2985 anon.value.maybe_unwrap_block()
2986 };
2987
2988 let context = if self.tcx.features().macroless_generic_const_args() {
2989 DirectConstArgContext::MacrolessMinGenericConstArgs
2990 } else if self.tcx.features().min_generic_const_args() {
2991 DirectConstArgContext::MinGenericConstArgs
2992 } else {
2993 DirectConstArgContext::Stable
2994 };
2995
2996 if self.can_lower_expr_to_const_arg_direct(expr, context).is_ok() {
2997 return self.lower_expr_to_const_arg_direct(expr, Some(anon.id));
2998 }
2999
3000 let lowered_anon = self.lower_anon_const_to_anon_const(anon, anon.value.span);
3001 ConstArg {
3002 hir_id: self.next_id(),
3003 kind: hir::ConstArgKind::Anon(lowered_anon),
3004 span: self.lower_span(anon.value.span),
3005 }
3006 }
3007
3008 fn lower_anon_const_to_anon_const(
3011 &mut self,
3012 c: &AnonConst,
3013 span: Span,
3014 ) -> &'hir hir::AnonConst {
3015 self.arena.alloc(self.with_new_scopes(c.value.span, |this| {
3016 let def_id = this.local_def_id(c.id);
3017 let hir_id = this.lower_node_id(c.id);
3018 hir::AnonConst {
3019 def_id,
3020 hir_id,
3021 body: this.lower_const_body(c.value.span, Some(&c.value)),
3022 span: this.lower_span(span),
3023 }
3024 }))
3025 }
3026
3027 fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
3028 match u {
3029 CompilerGenerated => hir::UnsafeSource::CompilerGenerated,
3030 UserProvided => hir::UnsafeSource::UserProvided,
3031 }
3032 }
3033
3034 fn lower_trait_bound_modifiers(
3035 &mut self,
3036 modifiers: TraitBoundModifiers,
3037 ) -> hir::TraitBoundModifiers {
3038 let constness = match modifiers.constness {
3039 BoundConstness::Never => BoundConstness::Never,
3040 BoundConstness::Always(span) => BoundConstness::Always(self.lower_span(span)),
3041 BoundConstness::Maybe(span) => BoundConstness::Maybe(self.lower_span(span)),
3042 };
3043 let polarity = match modifiers.polarity {
3044 BoundPolarity::Positive => BoundPolarity::Positive,
3045 BoundPolarity::Negative(span) => BoundPolarity::Negative(self.lower_span(span)),
3046 BoundPolarity::Maybe(span) => BoundPolarity::Maybe(self.lower_span(span)),
3047 };
3048 hir::TraitBoundModifiers { constness, polarity }
3049 }
3050
3051 fn stmt(&mut self, span: Span, kind: hir::StmtKind<'hir>) -> hir::Stmt<'hir> {
3054 hir::Stmt { span: self.lower_span(span), kind, hir_id: self.next_id() }
3055 }
3056
3057 fn stmt_expr(&mut self, span: Span, expr: hir::Expr<'hir>) -> hir::Stmt<'hir> {
3058 self.stmt(span, hir::StmtKind::Expr(self.arena.alloc(expr)))
3059 }
3060
3061 fn stmt_let_pat(
3062 &mut self,
3063 attrs: Option<&'hir [hir::Attribute]>,
3064 span: Span,
3065 init: Option<&'hir hir::Expr<'hir>>,
3066 pat: &'hir hir::Pat<'hir>,
3067 source: hir::LocalSource,
3068 ) -> hir::Stmt<'hir> {
3069 let hir_id = self.next_id();
3070 if let Some(a) = attrs {
3071 if !!a.is_empty() {
::core::panicking::panic("assertion failed: !a.is_empty()")
};assert!(!a.is_empty());
3072 self.attrs.insert(hir_id.local_id, a);
3073 }
3074 let local = hir::LetStmt {
3075 super_: None,
3076 hir_id,
3077 init,
3078 pat,
3079 els: None,
3080 source,
3081 span: self.lower_span(span),
3082 ty: None,
3083 };
3084 self.stmt(span, hir::StmtKind::Let(self.arena.alloc(local)))
3085 }
3086
3087 fn stmt_super_let_pat(
3088 &mut self,
3089 span: Span,
3090 pat: &'hir hir::Pat<'hir>,
3091 init: Option<&'hir hir::Expr<'hir>>,
3092 ) -> hir::Stmt<'hir> {
3093 let hir_id = self.next_id();
3094 let span = self.lower_span(span);
3095 let local = hir::LetStmt {
3096 super_: Some(span),
3097 hir_id,
3098 init,
3099 pat,
3100 els: None,
3101 source: hir::LocalSource::Normal,
3102 span,
3103 ty: None,
3104 };
3105 self.stmt(span, hir::StmtKind::Let(self.arena.alloc(local)))
3106 }
3107
3108 fn block_expr(&mut self, expr: &'hir hir::Expr<'hir>) -> &'hir hir::Block<'hir> {
3109 self.block_all(expr.span, &[], Some(expr))
3110 }
3111
3112 fn block_all(
3113 &mut self,
3114 span: Span,
3115 stmts: &'hir [hir::Stmt<'hir>],
3116 expr: Option<&'hir hir::Expr<'hir>>,
3117 ) -> &'hir hir::Block<'hir> {
3118 let blk = hir::Block {
3119 stmts,
3120 expr,
3121 hir_id: self.next_id(),
3122 rules: hir::BlockCheckMode::DefaultBlock,
3123 span: self.lower_span(span),
3124 targeted_by_break: false,
3125 };
3126 self.arena.alloc(blk)
3127 }
3128
3129 fn pat_cf_continue(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3130 let field = self.single_pat_field(span, pat);
3131 self.pat_lang_item_variant(span, LangItem::ControlFlowContinue, field)
3132 }
3133
3134 fn pat_cf_break(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3135 let field = self.single_pat_field(span, pat);
3136 self.pat_lang_item_variant(span, LangItem::ControlFlowBreak, field)
3137 }
3138
3139 fn pat_some(&mut self, span: Span, pat: &'hir hir::Pat<'hir>) -> &'hir hir::Pat<'hir> {
3140 let field = self.single_pat_field(span, pat);
3141 self.pat_lang_item_variant(span, LangItem::OptionSome, field)
3142 }
3143
3144 fn pat_none(&mut self, span: Span) -> &'hir hir::Pat<'hir> {
3145 self.pat_lang_item_variant(span, LangItem::OptionNone, &[])
3146 }
3147
3148 fn single_pat_field(
3149 &mut self,
3150 span: Span,
3151 pat: &'hir hir::Pat<'hir>,
3152 ) -> &'hir [hir::PatField<'hir>] {
3153 let field = hir::PatField {
3154 hir_id: self.next_id(),
3155 ident: Ident::new(sym::integer(0), self.lower_span(span)),
3156 is_shorthand: false,
3157 pat,
3158 span: self.lower_span(span),
3159 };
3160 self.arena.alloc_from_iter([field])arena_vec![self; field]
3161 }
3162
3163 fn pat_lang_item_variant(
3164 &mut self,
3165 span: Span,
3166 lang_item: LangItem,
3167 fields: &'hir [hir::PatField<'hir>],
3168 ) -> &'hir hir::Pat<'hir> {
3169 let path = self.make_lang_item_qpath(lang_item, self.lower_span(span), None);
3170 self.pat(span, hir::PatKind::Struct(path, fields, None))
3171 }
3172
3173 fn pat_ident(&mut self, span: Span, ident: Ident) -> (&'hir hir::Pat<'hir>, HirId) {
3174 self.pat_ident_binding_mode(span, ident, hir::BindingMode::NONE)
3175 }
3176
3177 fn pat_ident_mut(&mut self, span: Span, ident: Ident) -> (hir::Pat<'hir>, HirId) {
3178 self.pat_ident_binding_mode_mut(span, ident, hir::BindingMode::NONE)
3179 }
3180
3181 fn pat_ident_binding_mode(
3182 &mut self,
3183 span: Span,
3184 ident: Ident,
3185 bm: hir::BindingMode,
3186 ) -> (&'hir hir::Pat<'hir>, HirId) {
3187 let (pat, hir_id) = self.pat_ident_binding_mode_mut(span, ident, bm);
3188 (self.arena.alloc(pat), hir_id)
3189 }
3190
3191 fn pat_ident_binding_mode_mut(
3192 &mut self,
3193 span: Span,
3194 ident: Ident,
3195 bm: hir::BindingMode,
3196 ) -> (hir::Pat<'hir>, HirId) {
3197 let hir_id = self.next_id();
3198
3199 (
3200 hir::Pat {
3201 hir_id,
3202 kind: hir::PatKind::Binding(bm, hir_id, self.lower_ident(ident), None),
3203 span: self.lower_span(span),
3204 default_binding_modes: true,
3205 },
3206 hir_id,
3207 )
3208 }
3209
3210 fn pat(&mut self, span: Span, kind: hir::PatKind<'hir>) -> &'hir hir::Pat<'hir> {
3211 self.arena.alloc(hir::Pat {
3212 hir_id: self.next_id(),
3213 kind,
3214 span: self.lower_span(span),
3215 default_binding_modes: true,
3216 })
3217 }
3218
3219 fn pat_without_dbm(&mut self, span: Span, kind: hir::PatKind<'hir>) -> hir::Pat<'hir> {
3220 hir::Pat {
3221 hir_id: self.next_id(),
3222 kind,
3223 span: self.lower_span(span),
3224 default_binding_modes: false,
3225 }
3226 }
3227
3228 fn ty_path(&mut self, mut hir_id: HirId, span: Span, qpath: hir::QPath<'hir>) -> hir::Ty<'hir> {
3229 let kind = match qpath {
3230 hir::QPath::Resolved(None, path) => {
3231 match path.res {
3233 Res::Def(DefKind::Trait | DefKind::TraitAlias, _) => {
3234 let principal = hir::PolyTraitRef {
3235 bound_generic_params: &[],
3236 modifiers: hir::TraitBoundModifiers::NONE,
3237 trait_ref: hir::TraitRef { path, hir_ref_id: hir_id },
3238 span: self.lower_span(span),
3239 };
3240
3241 hir_id = self.next_id();
3244 hir::TyKind::TraitObject(
3245 self.arena.alloc_from_iter([principal])arena_vec![self; principal],
3246 TaggedRef::new(self.elided_dyn_bound(span), TraitObjectSyntax::None),
3247 )
3248 }
3249 _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)),
3250 }
3251 }
3252 _ => hir::TyKind::Path(qpath),
3253 };
3254
3255 hir::Ty { hir_id, kind, span: self.lower_span(span) }
3256 }
3257
3258 fn elided_dyn_bound(&mut self, span: Span) -> &'hir hir::Lifetime {
3263 let r = hir::Lifetime::new(
3264 self.next_id(),
3265 Ident::new(kw::UnderscoreLifetime, self.lower_span(span)),
3266 hir::LifetimeKind::ImplicitObjectLifetimeDefault,
3267 LifetimeSource::Other,
3268 LifetimeSyntax::Implicit,
3269 );
3270 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_ast_lowering/src/lib.rs:3270",
"rustc_ast_lowering", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_ast_lowering/src/lib.rs"),
::tracing_core::__macro_support::Option::Some(3270u32),
::tracing_core::__macro_support::Option::Some("rustc_ast_lowering"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("elided_dyn_bound: r={0:?}",
r) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("elided_dyn_bound: r={:?}", r);
3271 self.arena.alloc(r)
3272 }
3273}
3274
3275struct GenericArgsCtor<'hir> {
3277 args: SmallVec<[hir::GenericArg<'hir>; 4]>,
3278 constraints: &'hir [hir::AssocItemConstraint<'hir>],
3279 parenthesized: hir::GenericArgsParentheses,
3280 span: Span,
3281}
3282
3283impl<'hir> GenericArgsCtor<'hir> {
3284 fn is_empty(&self) -> bool {
3285 self.args.is_empty()
3286 && self.constraints.is_empty()
3287 && self.parenthesized == hir::GenericArgsParentheses::No
3288 }
3289
3290 fn into_generic_args(self, this: &LoweringContext<'_, 'hir>) -> &'hir hir::GenericArgs<'hir> {
3291 let ga = hir::GenericArgs {
3292 args: this.arena.alloc_from_iter(self.args),
3293 constraints: self.constraints,
3294 parenthesized: self.parenthesized,
3295 span_ext: this.lower_span(self.span),
3296 };
3297 this.arena.alloc(ga)
3298 }
3299}
3300
3301#[derive(#[automatically_derived]
impl ::core::marker::Copy for DirectConstArgContext { }Copy, #[automatically_derived]
impl ::core::clone::Clone for DirectConstArgContext {
#[inline]
fn clone(&self) -> DirectConstArgContext { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for DirectConstArgContext {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
DirectConstArgContext::Stable => "Stable",
DirectConstArgContext::MinGenericConstArgs =>
"MinGenericConstArgs",
DirectConstArgContext::MacrolessMinGenericConstArgs =>
"MacrolessMinGenericConstArgs",
})
}
}Debug)]
3302enum DirectConstArgContext {
3303 Stable,
3306 MinGenericConstArgs,
3308 MacrolessMinGenericConstArgs,
3314}
3315
3316#[derive(#[automatically_derived]
impl ::core::fmt::Debug for UnrepresentableConstArgError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UnrepresentableConstArgError", "span", &self.span,
"will_create_def_ids", &&self.will_create_def_ids)
}
}Debug)]
3317struct UnrepresentableConstArgError {
3318 span: Span,
3319 will_create_def_ids: bool,
3320}
3321
3322impl UnrepresentableConstArgError {
3323 fn new(expr: &Expr) -> Self {
3324 Self {
3325 span: expr.span,
3326 will_create_def_ids: expr::WillCreateDefIdsVisitor.visit_expr(expr).is_break(),
3327 }
3328 }
3329
3330 fn emit<'hir>(self, lowering_context: &mut LoweringContext<'_, 'hir>) -> ConstArg<'hir> {
3331 let msg = "complex const arguments must be placed inside of a `const` block";
3332 let e = if self.will_create_def_ids {
3333 lowering_context.dcx().struct_span_fatal(self.span, msg).emit()
3337 } else {
3338 lowering_context.dcx().struct_span_err(self.span, msg).emit()
3339 };
3340
3341 ConstArg {
3342 hir_id: lowering_context.next_id(),
3343 kind: hir::ConstArgKind::Error(e),
3344 span: self.span,
3345 }
3346 }
3347}