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