hir_def/
lang_item.rs

1//! Collects lang items: items marked with `#[lang = "..."]` attribute.
2//!
3//! This attribute to tell the compiler about semi built-in std library
4//! features, such as Fn family of traits.
5use hir_expand::name::Name;
6use intern::{Symbol, sym};
7use rustc_hash::FxHashMap;
8use triomphe::Arc;
9
10use crate::{
11    AdtId, AssocItemId, AttrDefId, Crate, EnumId, EnumVariantId, FunctionId, ImplId, ModuleDefId,
12    StaticId, StructId, TraitId, TypeAliasId, UnionId,
13    db::DefDatabase,
14    expr_store::path::Path,
15    nameres::{assoc::TraitItems, crate_def_map, crate_local_def_map},
16};
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
19pub enum LangItemTarget {
20    EnumId(EnumId),
21    Function(FunctionId),
22    ImplDef(ImplId),
23    Static(StaticId),
24    Struct(StructId),
25    Union(UnionId),
26    TypeAlias(TypeAliasId),
27    Trait(TraitId),
28    EnumVariant(EnumVariantId),
29}
30
31impl LangItemTarget {
32    pub fn as_enum(self) -> Option<EnumId> {
33        match self {
34            LangItemTarget::EnumId(id) => Some(id),
35            _ => None,
36        }
37    }
38
39    pub fn as_function(self) -> Option<FunctionId> {
40        match self {
41            LangItemTarget::Function(id) => Some(id),
42            _ => None,
43        }
44    }
45
46    pub fn as_impl_def(self) -> Option<ImplId> {
47        match self {
48            LangItemTarget::ImplDef(id) => Some(id),
49            _ => None,
50        }
51    }
52
53    pub fn as_static(self) -> Option<StaticId> {
54        match self {
55            LangItemTarget::Static(id) => Some(id),
56            _ => None,
57        }
58    }
59
60    pub fn as_struct(self) -> Option<StructId> {
61        match self {
62            LangItemTarget::Struct(id) => Some(id),
63            _ => None,
64        }
65    }
66
67    pub fn as_trait(self) -> Option<TraitId> {
68        match self {
69            LangItemTarget::Trait(id) => Some(id),
70            _ => None,
71        }
72    }
73
74    pub fn as_enum_variant(self) -> Option<EnumVariantId> {
75        match self {
76            LangItemTarget::EnumVariant(id) => Some(id),
77            _ => None,
78        }
79    }
80
81    pub fn as_type_alias(self) -> Option<TypeAliasId> {
82        match self {
83            LangItemTarget::TypeAlias(id) => Some(id),
84            _ => None,
85        }
86    }
87
88    pub fn as_adt(self) -> Option<AdtId> {
89        match self {
90            LangItemTarget::Union(it) => Some(it.into()),
91            LangItemTarget::EnumId(it) => Some(it.into()),
92            LangItemTarget::Struct(it) => Some(it.into()),
93            _ => None,
94        }
95    }
96}
97
98/// Salsa query. This will look for lang items in a specific crate.
99#[salsa_macros::tracked(returns(ref))]
100pub fn crate_lang_items(db: &dyn DefDatabase, krate: Crate) -> Option<Box<LangItems>> {
101    let _p = tracing::info_span!("crate_lang_items_query").entered();
102
103    let mut lang_items = LangItems::default();
104
105    let crate_def_map = crate_def_map(db, krate);
106
107    for (_, module_data) in crate_def_map.modules() {
108        for impl_def in module_data.scope.impls() {
109            lang_items.collect_lang_item(db, impl_def, LangItemTarget::ImplDef);
110            for &(_, assoc) in impl_def.impl_items(db).items.iter() {
111                match assoc {
112                    AssocItemId::FunctionId(f) => {
113                        lang_items.collect_lang_item(db, f, LangItemTarget::Function)
114                    }
115                    AssocItemId::TypeAliasId(t) => {
116                        lang_items.collect_lang_item(db, t, LangItemTarget::TypeAlias)
117                    }
118                    AssocItemId::ConstId(_) => (),
119                }
120            }
121        }
122
123        for def in module_data.scope.declarations() {
124            match def {
125                ModuleDefId::TraitId(trait_) => {
126                    lang_items.collect_lang_item(db, trait_, LangItemTarget::Trait);
127                    TraitItems::query(db, trait_).items.iter().for_each(|&(_, assoc_id)| {
128                        match assoc_id {
129                            AssocItemId::FunctionId(f) => {
130                                lang_items.collect_lang_item(db, f, LangItemTarget::Function);
131                            }
132                            AssocItemId::TypeAliasId(alias) => {
133                                lang_items.collect_lang_item(db, alias, LangItemTarget::TypeAlias)
134                            }
135                            AssocItemId::ConstId(_) => {}
136                        }
137                    });
138                }
139                ModuleDefId::AdtId(AdtId::EnumId(e)) => {
140                    lang_items.collect_lang_item(db, e, LangItemTarget::EnumId);
141                    e.enum_variants(db).variants.iter().for_each(|&(id, _, _)| {
142                        lang_items.collect_lang_item(db, id, LangItemTarget::EnumVariant);
143                    });
144                }
145                ModuleDefId::AdtId(AdtId::StructId(s)) => {
146                    lang_items.collect_lang_item(db, s, LangItemTarget::Struct);
147                }
148                ModuleDefId::AdtId(AdtId::UnionId(u)) => {
149                    lang_items.collect_lang_item(db, u, LangItemTarget::Union);
150                }
151                ModuleDefId::FunctionId(f) => {
152                    lang_items.collect_lang_item(db, f, LangItemTarget::Function);
153                }
154                ModuleDefId::StaticId(s) => {
155                    lang_items.collect_lang_item(db, s, LangItemTarget::Static);
156                }
157                ModuleDefId::TypeAliasId(t) => {
158                    lang_items.collect_lang_item(db, t, LangItemTarget::TypeAlias);
159                }
160                _ => {}
161            }
162        }
163    }
164
165    if lang_items.items.is_empty() { None } else { Some(Box::new(lang_items)) }
166}
167
168/// Salsa query. Look for a lang item, starting from the specified crate and recursively
169/// traversing its dependencies.
170#[salsa_macros::tracked]
171pub fn lang_item(
172    db: &dyn DefDatabase,
173    start_crate: Crate,
174    item: LangItem,
175) -> Option<LangItemTarget> {
176    let _p = tracing::info_span!("lang_item_query").entered();
177    if let Some(target) =
178        crate_lang_items(db, start_crate).as_ref().and_then(|it| it.items.get(&item).copied())
179    {
180        return Some(target);
181    }
182
183    // Our `CrateGraph` eagerly inserts sysroot dependencies like `core` or `std` into dependencies
184    // even if the target crate has `#![no_std]`, `#![no_core]` or shadowed sysroot dependencies
185    // like `dependencies.std.path = ".."`. So we use `extern_prelude()` instead of
186    // `CrateData.dependencies` here, which has already come through such sysroot complexities
187    // while nameres.
188    //
189    // See https://github.com/rust-lang/rust-analyzer/pull/20475 for details.
190    crate_local_def_map(db, start_crate).local(db).extern_prelude().find_map(|(_, (krate, _))| {
191        // Some crates declares themselves as extern crate like `extern crate self as core`.
192        // Ignore these to prevent cycles.
193        if krate.krate == start_crate { None } else { lang_item(db, krate.krate, item) }
194    })
195}
196
197#[derive(Default, Debug, Clone, PartialEq, Eq)]
198pub struct LangItems {
199    items: FxHashMap<LangItem, LangItemTarget>,
200}
201
202impl LangItems {
203    pub fn target(&self, item: LangItem) -> Option<LangItemTarget> {
204        self.items.get(&item).copied()
205    }
206
207    fn collect_lang_item<T>(
208        &mut self,
209        db: &dyn DefDatabase,
210        item: T,
211        constructor: fn(T) -> LangItemTarget,
212    ) where
213        T: Into<AttrDefId> + Copy,
214    {
215        let _p = tracing::info_span!("collect_lang_item").entered();
216        if let Some(lang_item) = lang_attr(db, item.into()) {
217            self.items.entry(lang_item).or_insert_with(|| constructor(item));
218        }
219    }
220}
221
222pub(crate) fn lang_attr(db: &dyn DefDatabase, item: AttrDefId) -> Option<LangItem> {
223    db.attrs(item).lang_item()
224}
225
226pub(crate) fn notable_traits_in_deps(db: &dyn DefDatabase, krate: Crate) -> Arc<[Arc<[TraitId]>]> {
227    let _p = tracing::info_span!("notable_traits_in_deps", ?krate).entered();
228    Arc::from_iter(
229        db.transitive_deps(krate).into_iter().filter_map(|krate| db.crate_notable_traits(krate)),
230    )
231}
232
233pub(crate) fn crate_notable_traits(db: &dyn DefDatabase, krate: Crate) -> Option<Arc<[TraitId]>> {
234    let _p = tracing::info_span!("crate_notable_traits", ?krate).entered();
235
236    let mut traits = Vec::new();
237
238    let crate_def_map = crate_def_map(db, krate);
239
240    for (_, module_data) in crate_def_map.modules() {
241        for def in module_data.scope.declarations() {
242            if let ModuleDefId::TraitId(trait_) = def
243                && db.attrs(trait_.into()).has_doc_notable_trait()
244            {
245                traits.push(trait_);
246            }
247        }
248    }
249
250    if traits.is_empty() { None } else { Some(traits.into_iter().collect()) }
251}
252
253pub enum GenericRequirement {
254    None,
255    Minimum(usize),
256    Exact(usize),
257}
258
259macro_rules! language_item_table {
260    (
261        $( $(#[$attr:meta])* $variant:ident, $module:ident :: $name:ident, $method:ident, $target:expr, $generics:expr; )*
262    ) => {
263
264        /// A representation of all the valid language items in Rust.
265        #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
266        pub enum LangItem {
267            $(
268                #[doc = concat!("The `", stringify!($name), "` lang item.")]
269                $(#[$attr])*
270                $variant,
271            )*
272        }
273
274        impl LangItem {
275            pub fn name(self) -> &'static str {
276                match self {
277                    $( LangItem::$variant => stringify!($name), )*
278                }
279            }
280
281            /// Opposite of [`LangItem::name`]
282            pub fn from_symbol(sym: &Symbol) -> Option<Self> {
283                match sym {
284                    $(sym if *sym == $module::$name => Some(LangItem::$variant), )*
285                    _ => None,
286                }
287            }
288        }
289    }
290}
291
292impl LangItem {
293    pub fn resolve_function(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<FunctionId> {
294        lang_item(db, start_crate, self).and_then(|t| t.as_function())
295    }
296
297    pub fn resolve_trait(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<TraitId> {
298        lang_item(db, start_crate, self).and_then(|t| t.as_trait())
299    }
300
301    pub fn resolve_adt(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<AdtId> {
302        lang_item(db, start_crate, self).and_then(|t| t.as_adt())
303    }
304
305    pub fn resolve_enum(self, db: &dyn DefDatabase, start_crate: Crate) -> Option<EnumId> {
306        lang_item(db, start_crate, self).and_then(|t| t.as_enum())
307    }
308
309    pub fn resolve_type_alias(
310        self,
311        db: &dyn DefDatabase,
312        start_crate: Crate,
313    ) -> Option<TypeAliasId> {
314        lang_item(db, start_crate, self).and_then(|t| t.as_type_alias())
315    }
316
317    /// Opposite of [`LangItem::name`]
318    pub fn from_name(name: &hir_expand::name::Name) -> Option<Self> {
319        Self::from_symbol(name.symbol())
320    }
321
322    pub fn path(&self, db: &dyn DefDatabase, start_crate: Crate) -> Option<Path> {
323        let t = lang_item(db, start_crate, *self)?;
324        Some(Path::LangItem(t, None))
325    }
326
327    pub fn ty_rel_path(&self, db: &dyn DefDatabase, start_crate: Crate, seg: Name) -> Option<Path> {
328        let t = lang_item(db, start_crate, *self)?;
329        Some(Path::LangItem(t, Some(seg)))
330    }
331}
332
333language_item_table! {
334//  Variant name,            Name,                     Getter method name,         Target                  Generic requirements;
335    Sized,                   sym::sized,               sized_trait,                Target::Trait,          GenericRequirement::Exact(0);
336    MetaSized,               sym::meta_sized,          sized_trait,                Target::Trait,          GenericRequirement::Exact(0);
337    PointeeSized,            sym::pointee_sized,       sized_trait,                Target::Trait,          GenericRequirement::Exact(0);
338    Unsize,                  sym::unsize,              unsize_trait,               Target::Trait,          GenericRequirement::Minimum(1);
339    /// Trait injected by `#[derive(PartialEq)]`, (i.e. "Partial EQ").
340    StructuralPeq,           sym::structural_peq,      structural_peq_trait,       Target::Trait,          GenericRequirement::None;
341    /// Trait injected by `#[derive(Eq)]`, (i.e. "Total EQ"; no, I will not apologize).
342    StructuralTeq,           sym::structural_teq,      structural_teq_trait,       Target::Trait,          GenericRequirement::None;
343    Copy,                    sym::copy,                copy_trait,                 Target::Trait,          GenericRequirement::Exact(0);
344    Clone,                   sym::clone,               clone_trait,                Target::Trait,          GenericRequirement::None;
345    Sync,                    sym::sync,                sync_trait,                 Target::Trait,          GenericRequirement::Exact(0);
346    DiscriminantKind,        sym::discriminant_kind,   discriminant_kind_trait,    Target::Trait,          GenericRequirement::None;
347    /// The associated item of the [`DiscriminantKind`] trait.
348    Discriminant,            sym::discriminant_type,   discriminant_type,          Target::AssocTy,        GenericRequirement::None;
349
350    PointeeTrait,            sym::pointee_trait,       pointee_trait,              Target::Trait,          GenericRequirement::None;
351    Metadata,                sym::metadata_type,       metadata_type,              Target::AssocTy,        GenericRequirement::None;
352    DynMetadata,             sym::dyn_metadata,        dyn_metadata,               Target::Struct,         GenericRequirement::None;
353
354    Freeze,                  sym::freeze,              freeze_trait,               Target::Trait,          GenericRequirement::Exact(0);
355
356    FnPtrTrait,              sym::fn_ptr_trait,        fn_ptr_trait,               Target::Trait,          GenericRequirement::Exact(0);
357    FnPtrAddr,               sym::fn_ptr_addr,         fn_ptr_addr,                Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
358
359    Drop,                    sym::drop,                drop_trait,                 Target::Trait,          GenericRequirement::None;
360    Destruct,                sym::destruct,            destruct_trait,             Target::Trait,          GenericRequirement::None;
361
362    CoerceUnsized,           sym::coerce_unsized,      coerce_unsized_trait,       Target::Trait,          GenericRequirement::Minimum(1);
363    DispatchFromDyn,         sym::dispatch_from_dyn,   dispatch_from_dyn_trait,    Target::Trait,          GenericRequirement::Minimum(1);
364
365    // language items relating to transmutability
366    TransmuteOpts,           sym::transmute_opts,      transmute_opts,             Target::Struct,         GenericRequirement::Exact(0);
367    TransmuteTrait,          sym::transmute_trait,     transmute_trait,            Target::Trait,          GenericRequirement::Exact(3);
368
369    Add,                     sym::add,                 add_trait,                  Target::Trait,          GenericRequirement::Exact(1);
370    Sub,                     sym::sub,                 sub_trait,                  Target::Trait,          GenericRequirement::Exact(1);
371    Mul,                     sym::mul,                 mul_trait,                  Target::Trait,          GenericRequirement::Exact(1);
372    Div,                     sym::div,                 div_trait,                  Target::Trait,          GenericRequirement::Exact(1);
373    Rem,                     sym::rem,                 rem_trait,                  Target::Trait,          GenericRequirement::Exact(1);
374    Neg,                     sym::neg,                 neg_trait,                  Target::Trait,          GenericRequirement::Exact(0);
375    Not,                     sym::not,                 not_trait,                  Target::Trait,          GenericRequirement::Exact(0);
376    BitXor,                  sym::bitxor,              bitxor_trait,               Target::Trait,          GenericRequirement::Exact(1);
377    BitAnd,                  sym::bitand,              bitand_trait,               Target::Trait,          GenericRequirement::Exact(1);
378    BitOr,                   sym::bitor,               bitor_trait,                Target::Trait,          GenericRequirement::Exact(1);
379    Shl,                     sym::shl,                 shl_trait,                  Target::Trait,          GenericRequirement::Exact(1);
380    Shr,                     sym::shr,                 shr_trait,                  Target::Trait,          GenericRequirement::Exact(1);
381    AddAssign,               sym::add_assign,          add_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
382    SubAssign,               sym::sub_assign,          sub_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
383    MulAssign,               sym::mul_assign,          mul_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
384    DivAssign,               sym::div_assign,          div_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
385    RemAssign,               sym::rem_assign,          rem_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
386    BitXorAssign,            sym::bitxor_assign,       bitxor_assign_trait,        Target::Trait,          GenericRequirement::Exact(1);
387    BitAndAssign,            sym::bitand_assign,       bitand_assign_trait,        Target::Trait,          GenericRequirement::Exact(1);
388    BitOrAssign,             sym::bitor_assign,        bitor_assign_trait,         Target::Trait,          GenericRequirement::Exact(1);
389    ShlAssign,               sym::shl_assign,          shl_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
390    ShrAssign,               sym::shr_assign,          shr_assign_trait,           Target::Trait,          GenericRequirement::Exact(1);
391    Index,                   sym::index,               index_trait,                Target::Trait,          GenericRequirement::Exact(1);
392    IndexMut,                sym::index_mut,           index_mut_trait,            Target::Trait,          GenericRequirement::Exact(1);
393
394    UnsafeCell,              sym::unsafe_cell,         unsafe_cell_type,           Target::Struct,         GenericRequirement::None;
395    UnsafePinned,            sym::unsafe_pinned,       unsafe_pinned_type,         Target::Struct,         GenericRequirement::None;
396    VaList,                  sym::va_list,             va_list,                    Target::Struct,         GenericRequirement::None;
397
398    Deref,                   sym::deref,               deref_trait,                Target::Trait,          GenericRequirement::Exact(0);
399    DerefMut,                sym::deref_mut,           deref_mut_trait,            Target::Trait,          GenericRequirement::Exact(0);
400    DerefTarget,             sym::deref_target,        deref_target,               Target::AssocTy,        GenericRequirement::None;
401    Receiver,                sym::receiver,            receiver_trait,             Target::Trait,          GenericRequirement::None;
402    ReceiverTarget,           sym::receiver_target,     receiver_target,            Target::AssocTy,        GenericRequirement::None;
403
404    Fn,                      sym::fn_,                 fn_trait,                   Target::Trait,          GenericRequirement::Exact(1);
405    FnMut,                   sym::fn_mut,              fn_mut_trait,               Target::Trait,          GenericRequirement::Exact(1);
406    FnOnce,                  sym::fn_once,             fn_once_trait,              Target::Trait,          GenericRequirement::Exact(1);
407    AsyncFn,                 sym::async_fn,            async_fn_trait,             Target::Trait,          GenericRequirement::Exact(1);
408    AsyncFnMut,              sym::async_fn_mut,        async_fn_mut_trait,         Target::Trait,          GenericRequirement::Exact(1);
409    AsyncFnOnce,             sym::async_fn_once,       async_fn_once_trait,        Target::Trait,          GenericRequirement::Exact(1);
410
411    CallRefFuture,           sym::call_ref_future,     call_ref_future_ty,         Target::AssocTy,        GenericRequirement::None;
412    CallOnceFuture,          sym::call_once_future,    call_once_future_ty,        Target::AssocTy,        GenericRequirement::None;
413    AsyncFnOnceOutput,       sym::async_fn_once_output, async_fn_once_output_ty,   Target::AssocTy,        GenericRequirement::None;
414
415    FnOnceOutput,            sym::fn_once_output,      fn_once_output,             Target::AssocTy,        GenericRequirement::None;
416
417    Future,                  sym::future_trait,        future_trait,               Target::Trait,          GenericRequirement::Exact(0);
418    CoroutineState,          sym::coroutine_state,     coroutine_state,            Target::Enum,           GenericRequirement::None;
419    Coroutine,               sym::coroutine,           coroutine_trait,            Target::Trait,          GenericRequirement::Minimum(1);
420    CoroutineReturn,         sym::coroutine_return,    coroutine_return_ty,        Target::AssocTy,        GenericRequirement::None;
421    CoroutineYield,          sym::coroutine_yield,     coroutine_yield_ty,         Target::AssocTy,        GenericRequirement::None;
422    Unpin,                   sym::unpin,               unpin_trait,                Target::Trait,          GenericRequirement::None;
423    Pin,                     sym::pin,                 pin_type,                   Target::Struct,         GenericRequirement::None;
424
425    PartialEq,               sym::eq,                  eq_trait,                   Target::Trait,          GenericRequirement::Exact(1);
426    PartialOrd,              sym::partial_ord,         partial_ord_trait,          Target::Trait,          GenericRequirement::Exact(1);
427    CVoid,                   sym::c_void,              c_void,                     Target::Enum,           GenericRequirement::None;
428
429    // A number of panic-related lang items. The `panic` item corresponds to divide-by-zero and
430    // various panic cases with `match`. The `panic_bounds_check` item is for indexing arrays.
431    //
432    // The `begin_unwind` lang item has a predefined symbol name and is sort of a "weak lang item"
433    // in the sense that a crate is not required to have it defined to use it, but a final product
434    // is required to define it somewhere. Additionally, there are restrictions on crates that use
435    // a weak lang item, but do not have it defined.
436    Panic,                   sym::panic,               panic_fn,                   Target::Fn,             GenericRequirement::Exact(0);
437    PanicNounwind,           sym::panic_nounwind,      panic_nounwind,             Target::Fn,             GenericRequirement::Exact(0);
438    PanicFmt,                sym::panic_fmt,           panic_fmt,                  Target::Fn,             GenericRequirement::None;
439    PanicDisplay,            sym::panic_display,       panic_display,              Target::Fn,             GenericRequirement::None;
440    ConstPanicFmt,           sym::const_panic_fmt,     const_panic_fmt,            Target::Fn,             GenericRequirement::None;
441    PanicBoundsCheck,        sym::panic_bounds_check,  panic_bounds_check_fn,      Target::Fn,             GenericRequirement::Exact(0);
442    PanicMisalignedPointerDereference,        sym::panic_misaligned_pointer_dereference,  panic_misaligned_pointer_dereference_fn,      Target::Fn,             GenericRequirement::Exact(0);
443    PanicInfo,               sym::panic_info,          panic_info,                 Target::Struct,         GenericRequirement::None;
444    PanicLocation,           sym::panic_location,      panic_location,             Target::Struct,         GenericRequirement::None;
445    PanicImpl,               sym::panic_impl,          panic_impl,                 Target::Fn,             GenericRequirement::None;
446    PanicCannotUnwind,       sym::panic_cannot_unwind, panic_cannot_unwind,        Target::Fn,             GenericRequirement::Exact(0);
447    PanicNullPointerDereference, sym::panic_null_pointer_dereference, panic_null_pointer_dereference, Target::Fn, GenericRequirement::None;
448    /// libstd panic entry point. Necessary for const eval to be able to catch it
449    BeginPanic,              sym::begin_panic,         begin_panic_fn,             Target::Fn,             GenericRequirement::None;
450
451    // Lang items needed for `format_args!()`.
452    FormatAlignment,         sym::format_alignment,    format_alignment,           Target::Enum,           GenericRequirement::None;
453    FormatArgument,          sym::format_argument,     format_argument,            Target::Struct,         GenericRequirement::None;
454    FormatArguments,         sym::format_arguments,    format_arguments,           Target::Struct,         GenericRequirement::None;
455    FormatCount,             sym::format_count,        format_count,               Target::Enum,           GenericRequirement::None;
456    FormatPlaceholder,       sym::format_placeholder,  format_placeholder,         Target::Struct,         GenericRequirement::None;
457    FormatUnsafeArg,         sym::format_unsafe_arg,   format_unsafe_arg,          Target::Struct,         GenericRequirement::None;
458
459    ExchangeMalloc,          sym::exchange_malloc,     exchange_malloc_fn,         Target::Fn,             GenericRequirement::None;
460    BoxFree,                 sym::box_free,            box_free_fn,                Target::Fn,             GenericRequirement::Minimum(1);
461    DropInPlace,             sym::drop_in_place,       drop_in_place_fn,           Target::Fn,             GenericRequirement::Minimum(1);
462    AllocLayout,             sym::alloc_layout,        alloc_layout,               Target::Struct,         GenericRequirement::None;
463
464    Start,                   sym::start,               start_fn,                   Target::Fn,             GenericRequirement::Exact(1);
465
466    EhPersonality,           sym::eh_personality,      eh_personality,             Target::Fn,             GenericRequirement::None;
467    EhCatchTypeinfo,         sym::eh_catch_typeinfo,   eh_catch_typeinfo,          Target::Static,         GenericRequirement::None;
468
469    OwnedBox,                sym::owned_box,           owned_box,                  Target::Struct,         GenericRequirement::Minimum(1);
470
471    PhantomData,             sym::phantom_data,        phantom_data,               Target::Struct,         GenericRequirement::Exact(1);
472
473    ManuallyDrop,            sym::manually_drop,       manually_drop,              Target::Struct,         GenericRequirement::None;
474
475    MaybeUninit,             sym::maybe_uninit,        maybe_uninit,               Target::Union,          GenericRequirement::None;
476
477    /// Align offset for stride != 1; must not panic.
478    AlignOffset,             sym::align_offset,        align_offset_fn,            Target::Fn,             GenericRequirement::None;
479
480    Termination,             sym::termination,         termination,                Target::Trait,          GenericRequirement::None;
481
482    Try,                     sym::Try,                 try_trait,                  Target::Trait,          GenericRequirement::None;
483
484    Tuple,                   sym::tuple_trait,         tuple_trait,                Target::Trait,          GenericRequirement::Exact(0);
485
486    SliceLen,                sym::slice_len_fn,        slice_len_fn,               Target::Method(MethodKind::Inherent), GenericRequirement::None;
487
488    // Language items from AST lowering
489    TryTraitFromResidual,    sym::from_residual,       from_residual_fn,           Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
490    TryTraitFromOutput,      sym::from_output,         from_output_fn,             Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
491    TryTraitBranch,          sym::branch,              branch_fn,                  Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
492    TryTraitFromYeet,        sym::from_yeet,           from_yeet_fn,               Target::Fn,             GenericRequirement::None;
493
494    PointerLike,             sym::pointer_like,        pointer_like,               Target::Trait,          GenericRequirement::Exact(0);
495
496    ConstParamTy,            sym::const_param_ty,      const_param_ty_trait,       Target::Trait,          GenericRequirement::Exact(0);
497
498    Poll,                    sym::Poll,                poll,                       Target::Enum,           GenericRequirement::None;
499    PollReady,               sym::Ready,               poll_ready_variant,         Target::Variant,        GenericRequirement::None;
500    PollPending,             sym::Pending,             poll_pending_variant,       Target::Variant,        GenericRequirement::None;
501
502    // FIXME(swatinem): the following lang items are used for async lowering and
503    // should become obsolete eventually.
504    ResumeTy,                sym::ResumeTy,            resume_ty,                  Target::Struct,         GenericRequirement::None;
505    GetContext,              sym::get_context,         get_context_fn,             Target::Fn,             GenericRequirement::None;
506
507    Context,                 sym::Context,             context,                    Target::Struct,         GenericRequirement::None;
508    FuturePoll,              sym::poll,                future_poll_fn,             Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
509    FutureOutput,            sym::future_output,       future_output,              Target::TypeAlias,      GenericRequirement::None;
510
511    Option,                  sym::Option,              option_type,                Target::Enum,           GenericRequirement::None;
512    OptionSome,              sym::Some,                option_some_variant,        Target::Variant,        GenericRequirement::None;
513    OptionNone,              sym::None,                option_none_variant,        Target::Variant,        GenericRequirement::None;
514
515    ResultOk,                sym::Ok,                  result_ok_variant,          Target::Variant,        GenericRequirement::None;
516    ResultErr,               sym::Err,                 result_err_variant,         Target::Variant,        GenericRequirement::None;
517
518    ControlFlowContinue,     sym::Continue,            cf_continue_variant,        Target::Variant,        GenericRequirement::None;
519    ControlFlowBreak,        sym::Break,               cf_break_variant,           Target::Variant,        GenericRequirement::None;
520
521    IntoFutureIntoFuture,    sym::into_future,         into_future_fn,             Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
522    IntoIterIntoIter,        sym::into_iter,           into_iter_fn,               Target::Method(MethodKind::Trait { body: false }), GenericRequirement::None;
523    IteratorNext,            sym::next,                next_fn,                    Target::Method(MethodKind::Trait { body: false}), GenericRequirement::None;
524    Iterator,                sym::iterator,            iterator,                   Target::Trait,           GenericRequirement::None;
525
526    PinNewUnchecked,         sym::new_unchecked,       new_unchecked_fn,           Target::Method(MethodKind::Inherent), GenericRequirement::None;
527
528    RangeFrom,               sym::RangeFrom,           range_from_struct,          Target::Struct,         GenericRequirement::None;
529    RangeFull,               sym::RangeFull,           range_full_struct,          Target::Struct,         GenericRequirement::None;
530    RangeInclusiveStruct,    sym::RangeInclusive,      range_inclusive_struct,     Target::Struct,         GenericRequirement::None;
531    RangeInclusiveNew,       sym::range_inclusive_new, range_inclusive_new_method, Target::Method(MethodKind::Inherent), GenericRequirement::None;
532    Range,                   sym::Range,               range_struct,               Target::Struct,         GenericRequirement::None;
533    RangeToInclusive,        sym::RangeToInclusive,    range_to_inclusive_struct,  Target::Struct,         GenericRequirement::None;
534    RangeTo,                 sym::RangeTo,             range_to_struct,            Target::Struct,         GenericRequirement::None;
535
536    String,                  sym::String,              string,                     Target::Struct,         GenericRequirement::None;
537    CStr,                    sym::CStr,                c_str,                      Target::Struct,         GenericRequirement::None;
538    Ordering,                sym::Ordering,            ordering,                   Target::Enum,           GenericRequirement::None;
539}