Skip to main content

rustc_span/
symbol.rs

1//! An "interner" is a data structure that associates values with usize tags and
2//! allows bidirectional lookup; i.e., given a value, one can easily find the
3//! type, and vice versa.
4
5use std::hash::{Hash, Hasher};
6use std::{fmt, str};
7
8use rustc_arena::DroplessArena;
9use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
10use rustc_data_structures::stable_hasher::{
11    HashStable, StableCompare, StableHasher, ToStableHashKey,
12};
13use rustc_data_structures::sync::Lock;
14use rustc_macros::{Decodable, Encodable, HashStable_Generic, symbols};
15
16use crate::edit_distance::find_best_match_for_name;
17use crate::{DUMMY_SP, Edition, Span, with_session_globals};
18
19#[cfg(test)]
20mod tests;
21
22// The proc macro code for this is in `compiler/rustc_macros/src/symbols.rs`.
23impl Interner {
    #[doc =
    r" Creates an `Interner` with the predefined symbols from the `symbols!` macro and"]
    #[doc = r" any extra symbols provided by external drivers such as Clippy"]
    pub(crate) fn with_extra_symbols(extra_symbols: &[&'static str]) -> Self {
        Interner::prefill(&["$crate", "{{root}}", "_", "as", "break", "const",
                        "continue", "crate", "else", "enum", "extern", "false",
                        "fn", "for", "if", "impl", "in", "let", "loop", "match",
                        "mod", "move", "mut", "pub", "ref", "return", "self",
                        "Self", "static", "struct", "super", "trait", "true",
                        "type", "unsafe", "use", "where", "while", "abstract",
                        "become", "box", "do", "final", "macro", "override", "priv",
                        "typeof", "unsized", "virtual", "yield", "async", "await",
                        "dyn", "gen", "try", "'static", "'_", "auto", "builtin",
                        "catch", "contract_ensures", "contract_requires", "default",
                        "macro_rules", "raw", "reuse", "safe", "union", "yeet",
                        "Abi", "AcqRel", "Acquire", "Any", "Arc", "ArcWeak",
                        "Argument", "Array", "ArrayIntoIter", "AsMut", "AsRef",
                        "AssertParamIsClone", "AssertParamIsCopy",
                        "AssertParamIsEq", "AsyncGenFinished", "AsyncGenPending",
                        "AsyncGenReady", "AtomicBool", "AtomicI8", "AtomicI16",
                        "AtomicI32", "AtomicI64", "AtomicI128", "AtomicIsize",
                        "AtomicPtr", "AtomicU8", "AtomicU16", "AtomicU32",
                        "AtomicU64", "AtomicU128", "AtomicUsize", "AutoTrait",
                        "BTreeEntry", "BTreeMap", "BTreeSet", "BinaryHeap", "Bool",
                        "Borrow", "BorrowMut", "Break", "BuildHasher", "C", "CStr",
                        "C-unwind", "CallOnceFuture", "CallRefFuture", "Capture",
                        "Cell", "Center", "Char", "Child", "Cleanup", "Clone",
                        "CoercePointee", "CoercePointeeValidated", "CoerceUnsized",
                        "Command", "Const", "ConstParamTy", "ConstParamTy_",
                        "Context", "Continue", "ControlFlow", "Copy", "Cow",
                        "Debug", "DebugStruct", "Decodable", "Decoder", "Default",
                        "Deref", "DiagMessage", "Diagnostic", "DirBuilder",
                        "DispatchFromDyn", "Display", "DoubleEndedIterator",
                        "Duration", "DynTrait", "Encodable", "Encoder", "Enum",
                        "Enumerate", "Eq", "Equal", "Err", "Error", "File",
                        "FileType", "Float", "FmtArgumentsNew", "FmtWrite", "Fn",
                        "FnMut", "FnOnce", "Formatter", "Forward", "From",
                        "FromIterator", "FromResidual", "FsOpenOptions",
                        "FsPermissions", "FusedIterator", "Future", "GlobalAlloc",
                        "Hash", "HashMap", "HashMapEntry", "HashSet", "Hasher",
                        "Implied", "InCleanup", "IndexOutput", "Input", "Instant",
                        "Int", "Into", "IntoFuture", "IntoIterator",
                        "IntoIteratorItem", "IoBufRead", "IoLines", "IoRead",
                        "IoSeek", "IoWrite", "IpAddr", "Ipv4Addr", "Ipv6Addr",
                        "IrTyKind", "Is", "Item", "ItemContext", "IterEmpty",
                        "IterOnce", "IterPeekable", "Iterator", "IteratorItem",
                        "IteratorMap", "Layout", "Left", "Lifetime", "LinkedList",
                        "LintDiagnostic", "LintPass", "LocalKey", "Mutex",
                        "MutexGuard", "N", "NonNull", "NonZero", "None", "Normal",
                        "Ok", "Option", "Ord", "Ordering", "OsStr", "OsString",
                        "Other", "Output", "Param", "ParamSet", "PartialEq",
                        "PartialOrd", "Path", "PathBuf", "Pending",
                        "PinCoerceUnsized", "PinDerefMutHelper", "Pointer", "Poll",
                        "ProcMacro", "ProceduralMasqueradeDummyType", "Range",
                        "RangeBounds", "RangeCopy", "RangeFrom", "RangeFromCopy",
                        "RangeFull", "RangeInclusive", "RangeInclusiveCopy",
                        "RangeMax", "RangeMin", "RangeSub", "RangeTo",
                        "RangeToInclusive", "RangeToInclusiveCopy", "Rc", "RcWeak",
                        "Ready", "Receiver", "RefCell", "RefCellRef",
                        "RefCellRefMut", "Reference", "Relaxed", "Release",
                        "Result", "ResumeTy", "Return", "Reverse", "Right", "Rust",
                        "RustaceansAreAwesome", "RwLock", "RwLockReadGuard",
                        "RwLockWriteGuard", "Saturating", "SeekFrom", "SelfTy",
                        "Send", "SeqCst", "Sized", "Slice", "SliceIndex",
                        "SliceIter", "Some", "SpanCtxt", "Stdin", "Str", "String",
                        "Struct", "StructuralPartialEq", "Subdiagnostic",
                        "SymbolIntern", "Sync", "SyncUnsafeCell", "T", "Target",
                        "This", "ToOwned", "ToString", "TokenStream", "Trait",
                        "TrivialClone", "Try", "TryCaptureGeneric",
                        "TryCapturePrintable", "TryFrom", "TryInto", "Tuple", "Ty",
                        "TyCtxt", "TyKind", "Type", "Union", "Unknown", "Unsize",
                        "UnsizedConstParamTy", "Upvars", "Vec", "VecDeque", "Waker",
                        "Wrapper", "Wrapping", "Yield", "_DECLS", "__D", "__H",
                        "__S", "__T", "__awaitee", "__try_var", "_t",
                        "_task_context", "a32", "aarch64", "aarch64_target_feature",
                        "aarch64_unstable_target_feature",
                        "aarch64_ver_target_feature", "abi", "abi_amdgpu_kernel",
                        "abi_avr_interrupt", "abi_c_cmse_nonsecure_call",
                        "abi_cmse_nonsecure_call", "abi_custom", "abi_efiapi",
                        "abi_gpu_kernel", "abi_msp430_interrupt", "abi_ptx",
                        "abi_riscv_interrupt", "abi_sysv64", "abi_thiscall",
                        "abi_unadjusted", "abi_vectorcall", "abi_x86_interrupt",
                        "abort", "add", "add_assign", "add_with_overflow",
                        "address", "adt_const_params", "advanced_slice_patterns",
                        "adx_target_feature", "aes", "aggregate_raw_ptr", "alias",
                        "align", "align_of", "align_of_val", "alignment", "all",
                        "alloc", "alloc_error_handler", "alloc_layout",
                        "alloc_zeroed", "allocator", "allocator_api",
                        "allocator_internals", "allow", "allow_fail",
                        "allow_internal_unsafe", "allow_internal_unstable",
                        "altivec", "alu32", "always", "amdgpu",
                        "amdgpu_dispatch_ptr", "analysis", "and", "and_then",
                        "anon", "anon_adt", "anon_assoc",
                        "anonymous_lifetime_in_impl_trait", "any",
                        "append_const_msg", "apx_target_feature",
                        "arbitrary_enum_discriminant", "arbitrary_self_types",
                        "arbitrary_self_types_pointers", "areg", "args",
                        "arith_offset", "arm", "arm64ec", "arm::a32", "arm::t32",
                        "arm_target_feature", "array", "as-needed", "as_ptr",
                        "as_ref", "as_str", "asm", "asm_cfg", "asm_const",
                        "asm_experimental_arch", "asm_experimental_reg", "asm_goto",
                        "asm_goto_with_outputs", "asm_sym", "asm_unwind", "assert",
                        "assert_eq", "assert_eq_macro", "assert_inhabited",
                        "assert_macro", "assert_mem_uninitialized_valid",
                        "assert_ne_macro", "assert_receiver_is_total_eq",
                        "assert_zero_valid", "asserting",
                        "associated_const_equality", "associated_consts",
                        "associated_type_bounds", "associated_type_defaults",
                        "associated_types", "assume", "assume_init", "*",
                        "async_await", "async_call", "async_call_mut",
                        "async_call_once", "async_closure", "async_drop",
                        "async_drop_in_place", "async_fn", "async_fn_in_dyn_trait",
                        "async_fn_in_trait", "async_fn_kind_helper",
                        "async_fn_kind_upvars", "async_fn_mut", "async_fn_once",
                        "async_fn_once_output", "async_fn_track_caller",
                        "async_fn_traits", "async_for_loop", "async_gen_internals",
                        "async_iterator", "async_iterator_poll_next",
                        "async_trait_bounds", "atomic", "atomic_and",
                        "atomic_cxchg", "atomic_cxchgweak", "atomic_fence",
                        "atomic_load", "atomic_max", "atomic_min", "atomic_mod",
                        "atomic_nand", "atomic_or", "atomic_singlethreadfence",
                        "atomic_store", "atomic_umax", "atomic_umin", "atomic_xadd",
                        "atomic_xchg", "atomic_xor", "atomic_xsub", "atomics",
                        "att_syntax", "attr", "attr_literals", "attribute",
                        "attributes", "audit_that", "augmented_assignments",
                        "auto_cfg", "auto_traits", "autodiff", "autodiff_forward",
                        "autodiff_reverse", "automatically_derived",
                        "available_externally", "avr", "avr_target_feature", "avx",
                        "avx10_target_feature", "avx512_target_feature", "avx512bw",
                        "avx512f", "await_macro", "bang", "begin_panic", "bench",
                        "bevy_ecs", "bikeshed", "bikeshed_guaranteed_no_drop",
                        "bin", "binaryheap_iter", "bind_by_move_pattern_guards",
                        "bindings_after_at", "bitand", "bitand_assign", "bitor",
                        "bitor_assign", "bitreverse", "bits", "bitxor",
                        "bitxor_assign", "black_box", "block", "blocking", "bool",
                        "bool_then", "borrowck_graphviz_format",
                        "borrowck_graphviz_postflow", "box_new", "box_patterns",
                        "box_syntax", "boxed_slice", "bpf", "bpf_target_feature",
                        "braced_empty_structs", "branch", "breakpoint", "bridge",
                        "bswap", "btreemap_contains_key", "btreemap_insert",
                        "btreeset_iter", "built", "builtin_syntax", "bundle", "c",
                        "c_dash_variadic", "c_str", "c_str_literals", "c_unwind",
                        "c_variadic", "c_variadic_naked_functions", "c_void",
                        "call", "call_mut", "call_once", "call_once_future",
                        "call_ref_future", "caller", "caller_location",
                        "capture_disjoint_fields", "carrying_mul_add",
                        "catch_unwind", "cause", "cdylib", "ceilf16", "ceilf32",
                        "ceilf64", "ceilf128", "cfg", "cfg_accessible", "cfg_attr",
                        "cfg_attr_multi", "<cfg_attr_trace>",
                        "cfg_boolean_literals", "cfg_contract_checks",
                        "cfg_doctest", "cfg_emscripten_wasm_eh", "cfg_eval",
                        "cfg_fmt_debug", "cfg_overflow_checks", "cfg_panic",
                        "cfg_relocation_model", "cfg_sanitize", "cfg_sanitizer_cfi",
                        "cfg_select", "cfg_target_abi", "cfg_target_compact",
                        "cfg_target_feature", "cfg_target_has_atomic",
                        "cfg_target_has_atomic_equal_alignment",
                        "cfg_target_has_reliable_f16_f128",
                        "cfg_target_thread_local", "cfg_target_vendor",
                        "<cfg_trace>", "cfg_ub_checks", "cfg_version", "cfi",
                        "cfi_encoding", "char", "char_is_ascii", "char_to_digit",
                        "child_id", "child_kill", "client", "clippy", "clobber_abi",
                        "clone", "clone_closures", "clone_fn", "clone_from",
                        "closure", "closure_lifetime_binder",
                        "closure_to_fn_coercion", "closure_track_caller", "cmp",
                        "cmp_max", "cmp_min", "cmp_ord_max", "cmp_ord_min",
                        "cmp_partialeq_eq", "cmp_partialeq_ne",
                        "cmp_partialord_cmp", "cmp_partialord_ge",
                        "cmp_partialord_gt", "cmp_partialord_le",
                        "cmp_partialord_lt", "cmpxchg16b_target_feature",
                        "cmse_nonsecure_entry", "coerce_pointee_validated",
                        "coerce_shared", "coerce_unsized", "cold", "cold_path",
                        "collapse_debuginfo", "column", "common", "compare_bytes",
                        "compare_exchange", "compare_exchange_weak",
                        "compile_error", "compiler", "compiler_builtins",
                        "compiler_copy", "compiler_fence", "compiler_move",
                        "concat", "concat_bytes", "concat_idents",
                        "conservative_impl_trait", "console", "const_allocate",
                        "const_async_blocks", "const_block_items", "const_closures",
                        "const_compare_raw_pointers", "const_constructor",
                        "const_continue", "const_deallocate", "const_destruct",
                        "const_eval_limit", "const_eval_select",
                        "const_evaluatable_checked", "const_extern_fn", "const_fn",
                        "const_fn_floating_point_arithmetic",
                        "const_fn_fn_ptr_basics", "const_fn_trait_bound",
                        "const_fn_transmute", "const_fn_union", "const_fn_unsize",
                        "const_for", "const_format_args", "const_generics",
                        "const_generics_defaults", "const_if_match",
                        "const_impl_trait", "const_in_array_repeat_expressions",
                        "const_indexing", "const_let", "const_loop",
                        "const_make_global", "const_mut_refs", "const_panic",
                        "const_panic_fmt", "const_param_ty",
                        "const_precise_live_drops", "const_ptr_cast",
                        "const_raw_ptr_deref", "const_raw_ptr_to_usize_cast",
                        "const_refs_to_cell", "const_refs_to_static",
                        "const_trait_bound_opt_out", "const_trait_impl",
                        "const_try", "<const_ty>", "constant", "constructor",
                        "contract_build_check_ensures", "contract_check_ensures",
                        "contract_check_requires", "contract_checks", "contracts",
                        "contracts_ensures", "contracts_internals",
                        "contracts_requires", "convert", "convert_identity", "copy",
                        "copy_closures", "copy_nonoverlapping", "copysignf16",
                        "copysignf32", "copysignf64", "copysignf128", "core",
                        "core_panic", "core_panic_2015_macro",
                        "core_panic_2021_macro", "core_panic_macro", "coroutine",
                        "coroutine_clone", "coroutine_resume", "coroutine_return",
                        "coroutine_state", "coroutine_yield", "coroutines",
                        "cosf16", "cosf32", "cosf64", "cosf128", "count",
                        "coverage", "coverage_attribute", "cr", "crate_in_paths",
                        "crate_local", "crate_name", "crate_type",
                        "crate_visibility_modifier", "crt-static", "csky",
                        "csky_target_feature", "cstr_type", "cstring_as_c_str",
                        "cstring_type", "ctlz", "ctlz_nonzero", "ctpop", "ctr",
                        "cttz", "cttz_nonzero", "custom_attribute",
                        "custom_code_classes_in_docs", "custom_derive",
                        "custom_inner_attributes", "custom_mir",
                        "custom_test_frameworks", "d", "d32", "dbg_macro",
                        "dead_code", "dealloc", "debug", "debug_assert_eq_macro",
                        "debug_assert_macro", "debug_assert_ne_macro",
                        "debug_assertions", "debug_struct",
                        "debug_struct_fields_finish", "debug_tuple",
                        "debug_tuple_fields_finish", "debugger_visualizer",
                        "decl_macro", "declare_lint_pass", "decode", "decorated",
                        "default_alloc_error_handler", "default_field_values",
                        "default_fn", "default_lib_allocator",
                        "default_method_body_is_const", "default_trait1",
                        "default_trait2", "default_trait3", "default_trait4",
                        "default_type_parameter_fallback", "default_type_params",
                        "define_opaque", "delayed_bug_from_inside_query", "deny",
                        "deprecated", "deprecated_safe", "deprecated_suggestion",
                        "deref", "deref_method", "deref_mut", "deref_mut_method",
                        "deref_patterns", "deref_pure", "deref_target", "derive",
                        "derive_coerce_pointee", "derive_const", "118304",
                        "derive_default_enum", "derive_from",
                        "derive_smart_pointer", "destruct",
                        "destructuring_assignment", "diagnostic",
                        "diagnostic_namespace", "diagnostic_on_const", "dialect",
                        "direct", "discriminant_kind", "discriminant_type",
                        "discriminant_value", "disjoint_bitor", "dispatch_from_dyn",
                        "div", "div_assign", "diverging_block_default", "dl",
                        "do_not_recommend", "doc", "doc_alias", "doc_auto_cfg",
                        "doc_cfg", "doc_cfg_hide", "doc_keyword", "doc_masked",
                        "doc_notable_trait", "doc_primitive", "doc_spotlight",
                        "doctest", "..", "dotdot_in_tuple_patterns",
                        "dotdoteq_in_patterns", "dreg", "dreg_low8", "dreg_low16",
                        "drop", "drop_in_place", "drop_types_in_const",
                        "dropck_eyepatch", "dropck_parametricity", "<!dummy!>",
                        "dummy_cgu_name", "dylib", "dyn_compatible_for_dispatch",
                        "dyn_metadata", "dyn_star", "dyn_trait", "dynamic-no-pic",
                        "e", "edition_panic", "effective_target_features",
                        "effects", "eh_catch_typeinfo", "eh_personality", "eii",
                        "eii_declaration", "eii_impl", "eii_internals",
                        "eii_shared_macro", "element_ty", "emit", "emit_enum",
                        "emit_enum_variant", "emit_enum_variant_arg", "emit_struct",
                        "emit_struct_field", "", "emscripten_wasm_eh", "enable",
                        "encode", "end", "entry_nops", "enumerate_method", "env",
                        "eprint_macro", "eprintln_macro", "eq", "ergonomic_clones",
                        "ermsb_target_feature", "exact_div", "except",
                        "exception-handling", "exchange_malloc",
                        "exclusive_range_pattern", "exhaustive_integer_patterns",
                        "exhaustive_patterns", "existential_type", "exp2f16",
                        "exp2f32", "exp2f64", "exp2f128", "expect", "expected",
                        "expf16", "expf32", "expf64", "expf128",
                        "explicit_extern_abis",
                        "explicit_generic_args_with_impl_trait",
                        "explicit_tail_calls", "export_name", "export_stable",
                        "export-symbols", "expr", "expr_2021",
                        "expr_fragment_specifier_2024",
                        "extended_key_value_attributes",
                        "extended_varargs_abi_support", "extern_absolute_paths",
                        "extern_crate_item_prelude", "extern_crate_self",
                        "extern_in_paths", "extern_item_impls", "extern_prelude",
                        "extern_system_varargs", "extern_types", "extern_weak",
                        "external", "external_doc", "f", "f16", "f16_consts_mod",
                        "f16_epsilon", "f16_nan", "f16c_target_feature", "f32",
                        "f32_consts_mod", "f32_epsilon", "f32_legacy_const_digits",
                        "f32_legacy_const_epsilon", "f32_legacy_const_infinity",
                        "f32_legacy_const_mantissa_dig", "f32_legacy_const_max",
                        "f32_legacy_const_max_10_exp", "f32_legacy_const_max_exp",
                        "f32_legacy_const_min", "f32_legacy_const_min_10_exp",
                        "f32_legacy_const_min_exp", "f32_legacy_const_min_positive",
                        "f32_legacy_const_nan", "f32_legacy_const_neg_infinity",
                        "f32_legacy_const_radix", "f32_nan", "f64",
                        "f64_consts_mod", "f64_epsilon", "f64_legacy_const_digits",
                        "f64_legacy_const_epsilon", "f64_legacy_const_infinity",
                        "f64_legacy_const_mantissa_dig", "f64_legacy_const_max",
                        "f64_legacy_const_max_10_exp", "f64_legacy_const_max_exp",
                        "f64_legacy_const_min", "f64_legacy_const_min_10_exp",
                        "f64_legacy_const_min_exp", "f64_legacy_const_min_positive",
                        "f64_legacy_const_nan", "f64_legacy_const_neg_infinity",
                        "f64_legacy_const_radix", "f64_nan", "f128",
                        "f128_consts_mod", "f128_epsilon", "f128_nan", "fabsf16",
                        "fabsf32", "fabsf64", "fabsf128", "fadd_algebraic",
                        "fadd_fast", "fake_variadic", "fallback", "fdiv_algebraic",
                        "fdiv_fast", "feature", "fence", "🦀", "fetch_update",
                        "ffi", "ffi_const", "ffi_pure", "ffi_returns_twice",
                        "field", "field_init_shorthand", "fields", "file",
                        "file_options", "flags", "float", "float_to_int_unchecked",
                        "floorf16", "floorf32", "floorf64", "floorf128", "fmaf16",
                        "fmaf32", "fmaf64", "fmaf128", "fmt", "fmt_debug",
                        "fmul_algebraic", "fmul_fast", "fmuladdf16", "fmuladdf32",
                        "fmuladdf64", "fmuladdf128", "fn_align", "fn_body",
                        "fn_delegation", "fn_must_use", "fn_mut", "fn_once",
                        "fn_once_output", "fn_ptr_addr", "fn_ptr_trait", "forbid",
                        "force_target_feature", "forget", "format", "format_args",
                        "format_args_capture", "format_args_macro",
                        "format_args_nl", "format_argument", "format_arguments",
                        "format_macro", "framework", "freeze", "freeze_impls",
                        "freg", "frem_algebraic", "frem_fast", "from",
                        "from_desugaring", "from_fn", "from_iter", "from_iter_fn",
                        "from_output", "from_residual", "from_size_align_unchecked",
                        "from_str", "from_str_method", "from_str_nonconst",
                        "from_u16", "from_usize", "from_yeet", "frontmatter",
                        "fs_create_dir", "fsub_algebraic", "fsub_fast", "full",
                        "fundamental", "fused_iterator", "future",
                        "future_drop_poll", "future_output", "future_trait", "fxsr",
                        "gdb_script_file", "ge", "gen_blocks", "gen_future",
                        "generator_clone", "generators", "generic_arg_infer",
                        "generic_assert", "generic_associated_types",
                        "generic_associated_types_extended", "generic_const_exprs",
                        "generic_const_items", "generic_const_parameter_types",
                        "generic_param_attrs", "generic_pattern_types", "generics",
                        "get_context", "global_alloc_ty", "global_allocator",
                        "global_asm", "global_registration", "globs", "gt",
                        "guard_patterns", "half_open_range_patterns",
                        "half_open_range_patterns_in_slices", "hash",
                        "hashmap_contains_key", "hashmap_drain_ty",
                        "hashmap_insert", "hashmap_iter_mut_ty", "hashmap_iter_ty",
                        "hashmap_keys_ty", "hashmap_values_mut_ty",
                        "hashmap_values_ty", "hashset_drain_ty", "hashset_iter",
                        "hashset_iter_ty", "hexagon", "hexagon_target_feature",
                        "hidden", "hide", "hint", "homogeneous_aggregate", "host",
                        "html_favicon_url", "html_logo_url", "html_no_source",
                        "html_playground_url", "html_root_url", "hwaddress", "i",
                        "i8", "i8_legacy_const_max", "i8_legacy_const_min",
                        "i8_legacy_fn_max_value", "i8_legacy_fn_min_value",
                        "i8_legacy_mod", "i16", "i16_legacy_const_max",
                        "i16_legacy_const_min", "i16_legacy_fn_max_value",
                        "i16_legacy_fn_min_value", "i16_legacy_mod", "i32",
                        "i32_legacy_const_max", "i32_legacy_const_min",
                        "i32_legacy_fn_max_value", "i32_legacy_fn_min_value",
                        "i32_legacy_mod", "i64", "i64_legacy_const_max",
                        "i64_legacy_const_min", "i64_legacy_fn_max_value",
                        "i64_legacy_fn_min_value", "i64_legacy_mod", "i128",
                        "i128_legacy_const_max", "i128_legacy_const_min",
                        "i128_legacy_fn_max_value", "i128_legacy_fn_min_value",
                        "i128_legacy_mod", "i128_type", "ident", "if_let",
                        "if_let_guard", "if_let_rescope", "if_while_or_patterns",
                        "ignore", "immediate-abort", "impl_header_lifetime_elision",
                        "impl_lint_pass", "impl_trait_in_assoc_type",
                        "impl_trait_in_bindings", "impl_trait_in_fn_trait_return",
                        "impl_trait_projections", "implement_via_object",
                        "implied_by", "import", "import_name_type",
                        "import_shadowing", "import_trait_associated_functions",
                        "imported_main", "in_band_lifetimes", "include",
                        "include_bytes", "include_bytes_macro", "include_str",
                        "include_str_macro", "inclusive_range_syntax", "index",
                        "index_mut", "infer_outlives_requirements",
                        "infer_static_outlives_requirements",
                        "inherent_associated_types", "inherit", "initial",
                        "inlateout", "inline", "inline_const", "inline_const_pat",
                        "inout", "instant_now", "instruction_set", "integer",
                        "integral", "internal", "internal_features",
                        "into_async_iter_into_iter", "into_future", "into_iter",
                        "into_try_type", "intra_doc_pointers", "intrinsics",
                        "intrinsics_unaligned_volatile_load",
                        "intrinsics_unaligned_volatile_store", "io_error_new",
                        "io_errorkind", "io_stderr", "io_stdout",
                        "irrefutable_let_patterns", "is", "is_auto",
                        "is_val_statically_known", "isa_attribute", "isize",
                        "isize_legacy_const_max", "isize_legacy_const_min",
                        "isize_legacy_fn_max_value", "isize_legacy_fn_min_value",
                        "isize_legacy_mod", "issue", "issue_5723_bootstrap",
                        "issue_tracker_base_url", "item", "item_like_imports",
                        "iter", "iter_cloned", "iter_copied", "iter_filter",
                        "iter_mut", "iter_repeat", "iterator",
                        "iterator_collect_fn", "kcfi", "kernel_address",
                        "keylocker_x86", "keyword", "kind", "kreg", "kreg0",
                        "label", "label_break_value", "lahfsahf_target_feature",
                        "lang", "lang_items", "large_assignments", "last",
                        "lateout", "lazy_normalization_consts", "lazy_type_alias",
                        "le", "legacy_receiver", "len", "let_chains", "let_else",
                        "lhs", "lib", "libc", "lifetime",
                        "lifetime_capture_rules_2024", "lifetimes", "likely",
                        "line", "link", "link_arg_attribute", "link_args",
                        "link_cfg", "link-arg", "link_llvm_intrinsics", "link_name",
                        "link_ordinal", "link_section", "linkage", "linker",
                        "linker_messages", "linkonce", "linkonce_odr",
                        "lint_reasons", "literal", "load", "loaded_from_disk",
                        "local", "local_inner_macros", "log2f16", "log2f32",
                        "log2f64", "log2f128", "log10f16", "log10f32", "log10f64",
                        "log10f128", "log_syntax", "logf16", "logf32", "logf64",
                        "logf128", "loongarch32", "loongarch64",
                        "loongarch_target_feature", "loop_break_value",
                        "loop_match", "lr", "lt", "m68k", "m68k_target_feature",
                        "macro_at_most_once_rep", "macro_attr",
                        "macro_attributes_in_derive_output", "macro_concat",
                        "macro_derive", "macro_escape", "macro_export",
                        "macro_lifetime_matcher", "macro_literal_matcher",
                        "macro_metavar_expr", "macro_metavar_expr_concat",
                        "macro_reexport", "macro_use", "macro_vis_matcher",
                        "macros_in_extern", "main", "managed_boxes",
                        "manually_drop", "map", "map_err", "marker",
                        "marker_trait_attr", "masked", "match_beginning_vert",
                        "match_default_bindings", "matches_macro", "maximumf16",
                        "maximumf32", "maximumf64", "maximumf128", "maxnumf16",
                        "maxnumf32", "maxnumf64", "maxnumf128", "may_dangle",
                        "may_unwind", "maybe_uninit", "maybe_uninit_uninit",
                        "maybe_uninit_zeroed", "mem_align_const", "mem_align_of",
                        "mem_discriminant", "mem_drop", "mem_forget", "mem_replace",
                        "mem_size_const", "mem_size_of", "mem_size_of_val",
                        "mem_swap", "mem_uninitialized", "mem_variant_count",
                        "mem_zeroed", "member_constraints", "memory", "memtag",
                        "message", "meta", "meta_sized", "metadata_type",
                        "mgca_type_const_syntax", "min_const_fn",
                        "min_const_generics", "min_const_unsafe_fn",
                        "min_exhaustive_patterns", "min_generic_const_args",
                        "min_specialization", "min_type_alias_impl_trait",
                        "minimumf16", "minimumf32", "minimumf64", "minimumf128",
                        "minnumf16", "minnumf32", "minnumf64", "minnumf128", "mips",
                        "mips32r6", "mips64", "mips64r6", "mips_target_feature",
                        "mir_assume", "mir_basic_block", "mir_call",
                        "mir_cast_ptr_to_ptr", "mir_cast_transmute",
                        "mir_cast_unsize", "mir_checked", "mir_debuginfo",
                        "mir_deinit", "mir_discriminant", "mir_drop", "mir_field",
                        "mir_goto", "mir_len", "mir_make_place", "mir_move",
                        "mir_offset", "mir_ptr_metadata", "mir_retag", "mir_return",
                        "mir_return_to", "mir_set_discriminant", "mir_static",
                        "mir_static_mut", "mir_storage_dead", "mir_storage_live",
                        "mir_tail_call", "mir_unreachable", "mir_unwind_cleanup",
                        "mir_unwind_continue", "mir_unwind_resume",
                        "mir_unwind_terminate", "mir_unwind_terminate_reason",
                        "mir_unwind_unreachable", "mir_variant", "miri", "mmx_reg",
                        "modifiers", "module", "module_path", "more_maybe_bounds",
                        "more_qualified_paths", "more_struct_aliases",
                        "movbe_target_feature", "move_ref_pattern",
                        "move_size_limit", "movrs_target_feature", "msp430", "mul",
                        "mul_assign", "mul_with_overflow",
                        "multiple_supertrait_upcastable", "must_not_suspend",
                        "must_use", "mut_preserve_binding_mode_2024", "mut_ref",
                        "mutable", "naked", "naked_asm", "naked_functions",
                        "naked_functions_rustic_abi",
                        "naked_functions_target_feature", "name", "names",
                        "native_link_modifiers", "native_link_modifiers_as_needed",
                        "native_link_modifiers_bundle",
                        "native_link_modifiers_verbatim",
                        "native_link_modifiers_whole_archive", "natvis_file", "ne",
                        "needs_allocator", "needs_drop", "needs_panic_runtime",
                        "neg", "negate_unsigned", "negative_bounds",
                        "negative_impls", "neon", "nested", "never",
                        "never_patterns", "never_type", "never_type_fallback",
                        "new", "new_binary", "new_const", "new_debug",
                        "new_debug_noop", "new_display", "new_lower_exp",
                        "new_lower_hex", "new_octal", "new_pointer", "new_range",
                        "new_unchecked", "new_upper_exp", "new_upper_hex", "new_v1",
                        "new_v1_formatted", "next", "niko", "nll", "no",
                        "no_builtins", "no_core", "no_coverage", "no_crate_inject",
                        "no_debug", "no_default_passes", "no_implicit_prelude",
                        "no_inline", "no_link", "no_main", "no_mangle",
                        "no_sanitize", "no_stack_check", "no_std", "nomem",
                        "non_ascii_idents", "non_exhaustive",
                        "non_exhaustive_omitted_patterns_lint",
                        "non_lifetime_binders", "non_modrs_mods", "nonblocking",
                        "none", "nontemporal_store", "noop_method_borrow",
                        "noop_method_clone", "noop_method_deref", "noprefix",
                        "noreturn", "nostack", "not", "notable_trait", "note",
                        "null", "nvptx64", "nvptx_target_feature",
                        "object_safe_for_dispatch", "of", "off", "offload",
                        "offset", "offset_of", "offset_of_enum", "offset_of_nested",
                        "offset_of_slice", "ok_or_else", "old_name",
                        "omit_gdb_pretty_printer_section", "on", "on_const",
                        "on_unimplemented", "opaque", "opaque_generic_const_args",
                        "<opaque>", "open_options_new", "ops", "opt_out_copy",
                        "optimize", "optimize_attribute", "optimized",
                        "optin_builtin_traits", "option", "option_env",
                        "option_expect", "option_unwrap", "options", "or",
                        "or_patterns", "ord_cmp_method", "os_str_to_os_string",
                        "os_string_as_os_str", "other", "out", "overflow_checks",
                        "overlapping_marker_traits", "owned_box", "packed",
                        "packed_bundled_libs", "panic", "panic_2015", "panic_2021",
                        "panic_abort", "panic_any", "panic_bounds_check",
                        "panic_cannot_unwind", "panic_const_add_overflow",
                        "panic_const_async_fn_resumed",
                        "panic_const_async_fn_resumed_drop",
                        "panic_const_async_fn_resumed_panic",
                        "panic_const_async_gen_fn_resumed",
                        "panic_const_async_gen_fn_resumed_drop",
                        "panic_const_async_gen_fn_resumed_panic",
                        "panic_const_coroutine_resumed",
                        "panic_const_coroutine_resumed_drop",
                        "panic_const_coroutine_resumed_panic",
                        "panic_const_div_by_zero", "panic_const_div_overflow",
                        "panic_const_gen_fn_none", "panic_const_gen_fn_none_drop",
                        "panic_const_gen_fn_none_panic", "panic_const_mul_overflow",
                        "panic_const_neg_overflow", "panic_const_rem_by_zero",
                        "panic_const_rem_overflow", "panic_const_shl_overflow",
                        "panic_const_shr_overflow", "panic_const_sub_overflow",
                        "panic_display", "panic_fmt", "panic_handler", "panic_impl",
                        "panic_implementation", "panic_in_cleanup", "panic_info",
                        "panic_invalid_enum_construction", "panic_location",
                        "panic_misaligned_pointer_dereference", "panic_nounwind",
                        "panic_null_pointer_dereference", "panic_runtime",
                        "panic_str_2015", "panic_unwind", "panicking",
                        "param_attrs", "parent_label", "partial_cmp", "partial_ord",
                        "passes", "pat", "pat_param", "patchable_function_entry",
                        "path", "path_main_separator", "path_to_pathbuf",
                        "pathbuf_as_path", "pattern_complexity_limit",
                        "pattern_parentheses", "pattern_type",
                        "pattern_type_range_trait", "pattern_types",
                        "permissions_from_mode", "phantom_data", "phase", "pic",
                        "pie", "pin", "pin_ergonomics", "pin_macro", "pin_v2",
                        "platform_intrinsics", "plugin", "plugin_registrar",
                        "plugins", "pointee", "pointee_sized", "pointee_trait",
                        "pointer", "poll", "poll_next", "position", "post-cleanup",
                        "post-lto", "postfix_match", "powerpc", "powerpc64",
                        "powerpc_target_feature", "powf16", "powf32", "powf64",
                        "powf128", "powif16", "powif32", "powif64", "powif128",
                        "pre-lto", "precise_capturing",
                        "precise_capturing_in_traits",
                        "precise_pointer_size_matching", "precision", "predicates",
                        "pref_align_of", "prefetch_read_data",
                        "prefetch_read_instruction", "prefetch_write_data",
                        "prefetch_write_instruction", "prefix_nops", "preg",
                        "prelude", "prelude_import", "preserves_flags",
                        "prfchw_target_feature", "print_macro", "println_macro",
                        "proc-macro", "proc_macro", "proc_macro_attribute",
                        "proc_macro_derive", "proc_macro_expr", "proc_macro_gen",
                        "proc_macro_hygiene", "proc_macro_internals",
                        "proc_macro_mod", "proc_macro_non_items",
                        "proc_macro_path_invoc", "process_abort", "process_exit",
                        "profiler_builtins", "profiler_runtime", "ptr", "ptr_cast",
                        "ptr_cast_const", "ptr_cast_mut", "ptr_const_is_null",
                        "ptr_copy", "ptr_copy_nonoverlapping", "ptr_eq",
                        "ptr_from_ref", "ptr_guaranteed_cmp", "ptr_is_null",
                        "ptr_mask", "ptr_metadata", "ptr_null", "ptr_null_mut",
                        "ptr_offset_from", "ptr_offset_from_unsigned", "ptr_read",
                        "ptr_read_unaligned", "ptr_read_volatile", "ptr_replace",
                        "ptr_slice_from_raw_parts", "ptr_slice_from_raw_parts_mut",
                        "ptr_swap", "ptr_swap_nonoverlapping",
                        "ptr_without_provenance", "ptr_without_provenance_mut",
                        "ptr_write", "ptr_write_bytes", "ptr_write_unaligned",
                        "ptr_write_volatile", "pub_macro_rules", "pub_restricted",
                        "public", "pure", "pushpop_unsafe", "qreg", "qreg_low4",
                        "qreg_low8", "quad_precision_float", "question_mark",
                        "quote", "range_inclusive_new", "range_step", "raw-dylib",
                        "raw_dylib", "raw_dylib_elf", "raw_eq", "raw_identifiers",
                        "raw_ref_op", "re_rebalance_coherence", "read_enum",
                        "read_enum_variant", "read_enum_variant_arg", "read_struct",
                        "read_struct_field", "read_via_copy", "readonly", "realloc",
                        "realtime", "reason", "reborrow", "receiver",
                        "receiver_target", "recursion_limit",
                        "reexport_test_harness_main", "ref_pat_eat_one_layer_2024",
                        "ref_pat_eat_one_layer_2024_structural",
                        "ref_pat_everywhere", "ref_unwind_safe_trait", "reference",
                        "reflect", "reg", "reg16", "reg32", "reg64", "reg_abcd",
                        "reg_addr", "reg_byte", "reg_data", "reg_iw", "reg_nonzero",
                        "reg_pair", "reg_ptr", "reg_upper", "register_attr",
                        "register_tool", "relaxed_adts", "relaxed_struct_unsize",
                        "relocation_model", "rem", "rem_assign", "repr", "repr128",
                        "repr_align", "repr_align_enum", "repr_packed", "repr_simd",
                        "repr_transparent", "require", "reserve-x18", "residual",
                        "result", "result_ffi_guarantees", "result_ok_method",
                        "resume", "return_position_impl_trait_in_trait",
                        "return_type_notation", "riscv32", "riscv64",
                        "riscv_target_feature", "rlib", "ropi", "ropi-rwpi",
                        "rotate_left", "rotate_right", "round_ties_even_f16",
                        "round_ties_even_f32", "round_ties_even_f64",
                        "round_ties_even_f128", "roundf16", "roundf32", "roundf64",
                        "roundf128", "rt", "rtm_target_feature", "runtime", "rust",
                        "rust_2015", "rust_2018", "rust_2018_preview", "rust_2021",
                        "rust_2024", "rust_analyzer", "rust_begin_unwind",
                        "rust_cold_cc", "rust_eh_catch_typeinfo",
                        "rust_eh_personality", "rust_future", "rust_logo",
                        "rust_out", "rust_preserve_none_cc", "rustc", "rustc_abi",
                        "rustc_align", "rustc_align_static", "rustc_allocator",
                        "rustc_allocator_zeroed", "rustc_allocator_zeroed_variant",
                        "rustc_allow_const_fn_unstable",
                        "rustc_allow_incoherent_impl",
                        "rustc_allowed_through_unstable_modules", "rustc_as_ptr",
                        "rustc_attrs", "rustc_autodiff", "rustc_builtin_macro",
                        "rustc_capture_analysis", "rustc_clean",
                        "rustc_coherence_is_core", "rustc_coinductive",
                        "rustc_confusables", "rustc_const_stable",
                        "rustc_const_stable_indirect", "rustc_const_unstable",
                        "rustc_conversion_suggestion", "rustc_deallocator",
                        "rustc_def_path", "rustc_default_body_unstable",
                        "rustc_delayed_bug_from_inside_query",
                        "rustc_deny_explicit_impl", "rustc_deprecated_safe_2024",
                        "rustc_diagnostic_item", "rustc_diagnostic_macros",
                        "rustc_do_not_const_check", "rustc_doc_primitive",
                        "rustc_driver", "rustc_dummy", "rustc_dump_def_parents",
                        "rustc_dump_item_bounds", "rustc_dump_predicates",
                        "rustc_dump_user_args", "rustc_dump_vtable",
                        "rustc_dyn_incompatible_trait",
                        "rustc_effective_visibility", "rustc_eii_foreign_item",
                        "rustc_evaluate_where_clauses", "rustc_expected_cgu_reuse",
                        "rustc_force_inline", "rustc_has_incoherent_inherent_impls",
                        "rustc_hidden_type_of_opaques", "rustc_if_this_changed",
                        "rustc_inherit_overflow_checks", "rustc_insignificant_dtor",
                        "rustc_intrinsic", "rustc_intrinsic_const_stable_indirect",
                        "rustc_layout", "rustc_layout_scalar_valid_range_end",
                        "rustc_layout_scalar_valid_range_start",
                        "rustc_legacy_const_generics",
                        "rustc_lint_opt_deny_field_access", "rustc_lint_opt_ty",
                        "rustc_lint_query_instability",
                        "rustc_lint_untracked_query_information",
                        "rustc_macro_transparency", "rustc_main", "rustc_mir",
                        "rustc_must_implement_one_of",
                        "rustc_never_returns_null_ptr", "rustc_never_type_options",
                        "rustc_no_implicit_autorefs", "rustc_no_implicit_bounds",
                        "rustc_no_mir_inline", "rustc_non_const_trait_method",
                        "rustc_nonnull_optimization_guaranteed", "rustc_nounwind",
                        "rustc_objc_class", "rustc_objc_selector",
                        "rustc_object_lifetime_default", "rustc_offload_kernel",
                        "rustc_on_unimplemented", "rustc_outlives",
                        "rustc_paren_sugar", "rustc_partition_codegened",
                        "rustc_partition_reused", "rustc_pass_by_value",
                        "rustc_pass_indirectly_in_non_rustic_abis", "rustc_peek",
                        "rustc_peek_liveness", "rustc_peek_maybe_init",
                        "rustc_peek_maybe_uninit", "rustc_preserve_ub_checks",
                        "rustc_private", "rustc_proc_macro_decls",
                        "rustc_promotable", "rustc_pub_transparent",
                        "rustc_reallocator", "rustc_regions",
                        "rustc_reservation_impl", "rustc_scalable_vector",
                        "rustc_serialize",
                        "rustc_should_not_be_called_on_const_items",
                        "rustc_simd_monomorphize_lane_limit",
                        "rustc_skip_during_method_dispatch",
                        "rustc_specialization_trait", "rustc_std_internal_symbol",
                        "rustc_strict_coherence", "rustc_symbol_name",
                        "rustc_test_marker", "rustc_then_this_would_need",
                        "rustc_trivial_field_reads",
                        "rustc_unsafe_specialization_marker", "rustc_variance",
                        "rustc_variance_of_opaques", "rustdoc", "rustdoc_internals",
                        "rustdoc_missing_doc_code_examples", "rustfmt",
                        "rvalue_static_promotion", "rwpi", "s", "s390x",
                        "s390x_target_feature", "s390x_target_feature_vector",
                        "safety", "sanitize", "sanitizer_cfi_generalize_pointers",
                        "sanitizer_cfi_normalize_integers", "sanitizer_runtime",
                        "saturating_add", "saturating_div", "saturating_sub",
                        "sdylib", "search_unbox", "select_unpredictable",
                        "self_in_typedefs", "self_struct_ctor", "semiopaque",
                        "sha2", "sha3", "sha512_sm_x86", "shadow_call_stack",
                        "shallow", "shl", "shl_assign", "shorter_tail_lifetimes",
                        "should_panic", "show", "shr", "shr_assign", "sig_dfl",
                        "sig_ign", "signed", "simd", "simd_add", "simd_and",
                        "simd_arith_offset", "simd_as", "simd_bitmask",
                        "simd_bitreverse", "simd_bswap", "simd_cast",
                        "simd_cast_ptr", "simd_ceil", "simd_ctlz", "simd_ctpop",
                        "simd_cttz", "simd_div", "simd_eq",
                        "simd_expose_provenance", "simd_extract",
                        "simd_extract_dyn", "simd_fabs", "simd_fcos", "simd_fexp",
                        "simd_fexp2", "simd_ffi", "simd_flog", "simd_flog2",
                        "simd_flog10", "simd_floor", "simd_fma", "simd_fmax",
                        "simd_fmin", "simd_fsin", "simd_fsqrt", "simd_funnel_shl",
                        "simd_funnel_shr", "simd_gather", "simd_ge", "simd_gt",
                        "simd_insert", "simd_insert_dyn", "simd_le", "simd_lt",
                        "simd_masked_load", "simd_masked_store", "simd_mul",
                        "simd_ne", "simd_neg", "simd_or", "simd_reduce_add_ordered",
                        "simd_reduce_add_unordered", "simd_reduce_all",
                        "simd_reduce_and", "simd_reduce_any", "simd_reduce_max",
                        "simd_reduce_min", "simd_reduce_mul_ordered",
                        "simd_reduce_mul_unordered", "simd_reduce_or",
                        "simd_reduce_xor", "simd_relaxed_fma", "simd_rem",
                        "simd_round", "simd_round_ties_even", "simd_saturating_add",
                        "simd_saturating_sub", "simd_scatter", "simd_select",
                        "simd_select_bitmask", "simd_shl", "simd_shr",
                        "simd_shuffle", "simd_shuffle_const_generic", "simd_splat",
                        "simd_sub", "simd_trunc", "simd_with_exposed_provenance",
                        "simd_xor", "since", "sinf16", "sinf32", "sinf64",
                        "sinf128", "size", "size_of", "size_of_val", "sized",
                        "sized_hierarchy", "skip", "slice", "slice_from_raw_parts",
                        "slice_from_raw_parts_mut", "slice_from_ref",
                        "slice_get_unchecked", "slice_into_vec", "slice_iter",
                        "slice_len_fn", "slice_patterns", "slicing_syntax", "soft",
                        "sparc", "sparc64", "sparc_target_feature", "spe_acc",
                        "specialization", "speed", "spirv", "spotlight", "sqrtf16",
                        "sqrtf32", "sqrtf64", "sqrtf128", "sreg", "sreg_low16",
                        "sse", "sse2", "sse4a_target_feature", "stable",
                        "staged_api", "start", "state", "static_align",
                        "static_in_const", "static_nobundle", "static_recursion",
                        "staticlib", "std", "std_lib_injection", "std_panic",
                        "std_panic_2015_macro", "std_panic_macro", "stmt",
                        "stmt_expr_attributes", "stop_after_dataflow", "store",
                        "str", "str_chars", "str_ends_with", "str_from_utf8",
                        "str_from_utf8_mut", "str_from_utf8_unchecked",
                        "str_from_utf8_unchecked_mut", "str_inherent_from_utf8",
                        "str_inherent_from_utf8_mut",
                        "str_inherent_from_utf8_unchecked",
                        "str_inherent_from_utf8_unchecked_mut", "str_len",
                        "str_split_whitespace", "str_starts_with", "str_trim",
                        "str_trim_end", "str_trim_start", "strict_provenance_lints",
                        "string_as_mut_str", "string_as_str",
                        "string_deref_patterns", "string_from_utf8",
                        "string_insert_str", "string_new", "string_push_str",
                        "stringify", "struct_field_attributes", "struct_inherit",
                        "struct_variant", "structural_match", "structural_peq",
                        "sub", "sub_assign", "sub_with_overflow", "suggestion",
                        "super_let", "supertrait_item_shadowing", "sym", "sync",
                        "synthetic", "sys_mutex_lock", "sys_mutex_try_lock",
                        "sys_mutex_unlock", "t32", "target", "target_abi",
                        "target_arch", "target_endian", "target_env",
                        "target_family", "target_feature", "target_feature_11",
                        "target_feature_inline_always", "target_has_atomic",
                        "target_has_atomic_equal_alignment",
                        "target_has_atomic_load_store", "target_has_reliable_f16",
                        "target_has_reliable_f16_math", "target_has_reliable_f128",
                        "target_has_reliable_f128_math", "target_os",
                        "target_pointer_width", "target_thread_local",
                        "target_vendor", "tbm_target_feature", "termination",
                        "termination_trait", "termination_trait_test", "test",
                        "test_2018_feature", "test_accepted_feature", "test_case",
                        "test_removed_feature", "test_runner", "test_unstable_lint",
                        "thread", "thread_local", "thread_local_macro",
                        "three_way_compare", "thumb2", "thumb-mode", "tmm_reg",
                        "to_owned_method", "to_string", "to_string_method",
                        "to_vec", "todo_macro", "tool_attributes", "tool_lints",
                        "trace_macros", "track_caller", "trait_alias", "trait_ty",
                        "trait_upcasting", "transmute", "transmute_generic_consts",
                        "transmute_opts", "transmute_trait", "transmute_unchecked",
                        "transparent", "transparent_enums", "transparent_unions",
                        "trivial_bounds", "trivial_clone", "truncf16", "truncf32",
                        "truncf64", "truncf128", "try_blocks",
                        "try_blocks_heterogeneous", "try_capture", "try_from",
                        "try_from_fn", "try_into", "try_trait_v2",
                        "try_trait_v2_residual", "try_update", "tt", "tuple",
                        "tuple_indexing", "tuple_trait", "two_phase", "ty",
                        "type_alias_enum_variants", "type_alias_impl_trait",
                        "type_ascribe", "type_ascription",
                        "type_changing_struct_update", "type_id", "type_id_eq",
                        "type_info", "type_ir", "type_ir_infer_ctxt_like",
                        "type_ir_inherent", "type_ir_interner", "type_length_limit",
                        "type_macros", "type_name", "type_of", "type_privacy_lints",
                        "typed_swap_nonoverlapping", "u8", "u8_legacy_const_max",
                        "u8_legacy_const_min", "u8_legacy_fn_max_value",
                        "u8_legacy_fn_min_value", "u8_legacy_mod", "u16",
                        "u16_legacy_const_max", "u16_legacy_const_min",
                        "u16_legacy_fn_max_value", "u16_legacy_fn_min_value",
                        "u16_legacy_mod", "u32", "u32_legacy_const_max",
                        "u32_legacy_const_min", "u32_legacy_fn_max_value",
                        "u32_legacy_fn_min_value", "u32_legacy_mod", "u64",
                        "u64_legacy_const_max", "u64_legacy_const_min",
                        "u64_legacy_fn_max_value", "u64_legacy_fn_min_value",
                        "u64_legacy_mod", "u128", "u128_legacy_const_max",
                        "u128_legacy_const_min", "u128_legacy_fn_max_value",
                        "u128_legacy_fn_min_value", "u128_legacy_mod", "ub_checks",
                        "unaligned_volatile_load", "unaligned_volatile_store",
                        "unboxed_closures", "unchecked_add", "unchecked_div",
                        "unchecked_funnel_shl", "unchecked_funnel_shr",
                        "unchecked_mul", "unchecked_rem", "unchecked_shl",
                        "unchecked_shr", "unchecked_sub", "undecorated",
                        "underscore_const_names", "underscore_imports",
                        "underscore_lifetimes", "uniform_paths",
                        "unimplemented_macro", "unit", "universal_impl_trait",
                        "unix", "unlikely", "unmarked_api", "unnamed_fields",
                        "unpin", "unqualified_local_imports", "unreachable",
                        "unreachable_2015", "unreachable_2015_macro",
                        "unreachable_2021", "unreachable_code",
                        "unreachable_display", "unreachable_macro",
                        "unrestricted_attribute_tokens", "unsafe_attributes",
                        "unsafe_binders", "unsafe_block_in_unsafe_fn",
                        "unsafe_cell", "unsafe_cell_raw_get", "unsafe_eii",
                        "unsafe_extern_blocks", "unsafe_fields",
                        "unsafe_no_drop_flag", "unsafe_pinned", "unsafe_unpin",
                        "unsize", "unsized_const_param_ty", "unsized_const_params",
                        "unsized_fn_params", "unsized_locals",
                        "unsized_tuple_coercion", "unstable",
                        "unstable_feature_bound",
                        "this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead?",
                        "untagged_unions", "unused_imports", "unwind",
                        "unwind_attributes", "unwind_safe_trait", "unwrap",
                        "unwrap_binder", "unwrap_or", "update", "use_cloned",
                        "use_extern_macros", "use_nested_groups", "used",
                        "used_with_arg", "using", "usize", "usize_legacy_const_max",
                        "usize_legacy_const_min", "usize_legacy_fn_max_value",
                        "usize_legacy_fn_min_value", "usize_legacy_mod", "v1",
                        "v8plus", "va_arg", "va_copy", "va_end", "va_list",
                        "va_start", "val", "validity", "value", "values", "var",
                        "variant_count", "variants", "vec", "vec_as_mut_slice",
                        "vec_as_slice", "vec_from_elem", "vec_is_empty",
                        "vec_macro", "vec_new", "vec_pop", "vec_reserve",
                        "vec_with_capacity", "vecdeque_iter", "vecdeque_reserve",
                        "vector", "verbatim", "version", "vfp2", "vis",
                        "visible_private_types", "volatile", "volatile_copy_memory",
                        "volatile_copy_nonoverlapping_memory", "volatile_load",
                        "volatile_set_memory", "volatile_store", "vreg",
                        "vreg_low16", "vsreg", "vsx", "vtable_align", "vtable_for",
                        "vtable_size", "warn", "wasip2", "wasm32", "wasm64",
                        "wasm_abi", "wasm_import_module", "wasm_target_feature",
                        "weak", "weak_odr", "where_clause_attrs", "while_let",
                        "whole-archive", "width", "windows", "windows_subsystem",
                        "with_negative_coherence", "wrap_binder", "wrapping_add",
                        "wrapping_div", "wrapping_mul", "wrapping_rem",
                        "wrapping_rem_euclid", "wrapping_sub", "wreg",
                        "write_bytes", "write_fmt", "write_macro", "write_str",
                        "write_via_move", "writeln_macro", "x86", "x86_64",
                        "x86_amx_intrinsics", "x87_reg", "x87_target_feature",
                        "xer", "xmm_reg", "xop_target_feature", "xtensa",
                        "yeet_desugar_details", "yeet_expr", "yes", "yield_expr",
                        "ymm_reg", "yreg", "zca", "zfh", "zfhmin", "zmm_reg",
                        "ztso", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
                        "1.95.0-nightly"], extra_symbols)
    }
}symbols! {
24    // This list includes things that are definitely keywords (e.g. `if`), a
25    // few things that are definitely not keywords (e.g. `{{root}}`) and things
26    // where there is disagreement between people and/or documents (such as the
27    // Rust Reference) about whether it is a keyword (e.g. `_`).
28    //
29    // If you modify this list, adjust any relevant `Symbol::{is,can_be}_*`
30    // predicates and `used_keywords`. Also consider adding new keywords to the
31    // `ui/parser/raw/raw-idents.rs` test.
32    Keywords {
33        // Special reserved identifiers used internally for unnamed method
34        // parameters, crate root module, etc.
35        // Matching predicates: `is_special`/`is_reserved`
36        //
37        // tidy-alphabetical-start
38        DollarCrate:        "$crate",
39        PathRoot:           "{{root}}",
40        Underscore:         "_",
41        // tidy-alphabetical-end
42
43        // Keywords that are used in stable Rust.
44        // Matching predicates: `is_used_keyword_always`/`is_reserved`
45        // tidy-alphabetical-start
46        As:                 "as",
47        Break:              "break",
48        Const:              "const",
49        Continue:           "continue",
50        Crate:              "crate",
51        Else:               "else",
52        Enum:               "enum",
53        Extern:             "extern",
54        False:              "false",
55        Fn:                 "fn",
56        For:                "for",
57        If:                 "if",
58        Impl:               "impl",
59        In:                 "in",
60        Let:                "let",
61        Loop:               "loop",
62        Match:              "match",
63        Mod:                "mod",
64        Move:               "move",
65        Mut:                "mut",
66        Pub:                "pub",
67        Ref:                "ref",
68        Return:             "return",
69        SelfLower:          "self",
70        SelfUpper:          "Self",
71        Static:             "static",
72        Struct:             "struct",
73        Super:              "super",
74        Trait:              "trait",
75        True:               "true",
76        Type:               "type",
77        Unsafe:             "unsafe",
78        Use:                "use",
79        Where:              "where",
80        While:              "while",
81        // tidy-alphabetical-end
82
83        // Keywords that are used in unstable Rust or reserved for future use.
84        // Matching predicates: `is_unused_keyword_always`/`is_reserved`
85        // tidy-alphabetical-start
86        Abstract:           "abstract",
87        Become:             "become",
88        Box:                "box",
89        Do:                 "do",
90        Final:              "final",
91        Macro:              "macro",
92        Override:           "override",
93        Priv:               "priv",
94        Typeof:             "typeof",
95        Unsized:            "unsized",
96        Virtual:            "virtual",
97        Yield:              "yield",
98        // tidy-alphabetical-end
99
100        // Edition-specific keywords that are used in stable Rust.
101        // Matching predicates: `is_used_keyword_conditional`/`is_reserved` (if
102        // the edition suffices)
103        // tidy-alphabetical-start
104        Async:              "async", // >= 2018 Edition only
105        Await:              "await", // >= 2018 Edition only
106        Dyn:                "dyn", // >= 2018 Edition only
107        // tidy-alphabetical-end
108
109        // Edition-specific keywords that are used in unstable Rust or reserved for future use.
110        // Matching predicates: `is_unused_keyword_conditional`/`is_reserved` (if
111        // the edition suffices)
112        // tidy-alphabetical-start
113        Gen:                "gen", // >= 2024 Edition only
114        Try:                "try", // >= 2018 Edition only
115        // tidy-alphabetical-end
116
117        // "Lifetime keywords": regular keywords with a leading `'`.
118        // Matching predicates: none
119        // tidy-alphabetical-start
120        StaticLifetime:     "'static",
121        UnderscoreLifetime: "'_",
122        // tidy-alphabetical-end
123
124        // Weak keywords, have special meaning only in specific contexts.
125        // Matching predicates: `is_weak`
126        // tidy-alphabetical-start
127        Auto:               "auto",
128        Builtin:            "builtin",
129        Catch:              "catch",
130        ContractEnsures:    "contract_ensures",
131        ContractRequires:   "contract_requires",
132        Default:            "default",
133        MacroRules:         "macro_rules",
134        Raw:                "raw",
135        Reuse:              "reuse",
136        Safe:               "safe",
137        Union:              "union",
138        Yeet:               "yeet",
139        // tidy-alphabetical-end
140    }
141
142    // Pre-interned symbols that can be referred to with `rustc_span::sym::*`.
143    //
144    // The symbol is the stringified identifier unless otherwise specified, in
145    // which case the name should mention the non-identifier punctuation.
146    // E.g. `sym::proc_dash_macro` represents "proc-macro", and it shouldn't be
147    // called `sym::proc_macro` because then it's easy to mistakenly think it
148    // represents "proc_macro".
149    //
150    // As well as the symbols listed, there are symbols for the strings
151    // "0", "1", ..., "9", which are accessible via `sym::integer`.
152    //
153    // There is currently no checking that all symbols are used; that would be
154    // nice to have.
155    Symbols {
156        // tidy-alphabetical-start
157        Abi,
158        AcqRel,
159        Acquire,
160        Any,
161        Arc,
162        ArcWeak,
163        Argument,
164        Array,
165        ArrayIntoIter,
166        AsMut,
167        AsRef,
168        AssertParamIsClone,
169        AssertParamIsCopy,
170        AssertParamIsEq,
171        AsyncGenFinished,
172        AsyncGenPending,
173        AsyncGenReady,
174        AtomicBool,
175        AtomicI8,
176        AtomicI16,
177        AtomicI32,
178        AtomicI64,
179        AtomicI128,
180        AtomicIsize,
181        AtomicPtr,
182        AtomicU8,
183        AtomicU16,
184        AtomicU32,
185        AtomicU64,
186        AtomicU128,
187        AtomicUsize,
188        AutoTrait,
189        BTreeEntry,
190        BTreeMap,
191        BTreeSet,
192        BinaryHeap,
193        Bool,
194        Borrow,
195        BorrowMut,
196        Break,
197        BuildHasher,
198        C,
199        CStr,
200        C_dash_unwind: "C-unwind",
201        CallOnceFuture,
202        CallRefFuture,
203        Capture,
204        Cell,
205        Center,
206        Char,
207        Child,
208        Cleanup,
209        Clone,
210        CoercePointee,
211        CoercePointeeValidated,
212        CoerceUnsized,
213        Command,
214        Const,
215        ConstParamTy,
216        ConstParamTy_,
217        Context,
218        Continue,
219        ControlFlow,
220        Copy,
221        Cow,
222        Debug,
223        DebugStruct,
224        Decodable,
225        Decoder,
226        Default,
227        Deref,
228        DiagMessage,
229        Diagnostic,
230        DirBuilder,
231        DispatchFromDyn,
232        Display,
233        DoubleEndedIterator,
234        Duration,
235        DynTrait,
236        Encodable,
237        Encoder,
238        Enum,
239        Enumerate,
240        Eq,
241        Equal,
242        Err,
243        Error,
244        File,
245        FileType,
246        Float,
247        FmtArgumentsNew,
248        FmtWrite,
249        Fn,
250        FnMut,
251        FnOnce,
252        Formatter,
253        Forward,
254        From,
255        FromIterator,
256        FromResidual,
257        FsOpenOptions,
258        FsPermissions,
259        FusedIterator,
260        Future,
261        GlobalAlloc,
262        Hash,
263        HashMap,
264        HashMapEntry,
265        HashSet,
266        Hasher,
267        Implied,
268        InCleanup,
269        IndexOutput,
270        Input,
271        Instant,
272        Int,
273        Into,
274        IntoFuture,
275        IntoIterator,
276        IntoIteratorItem,
277        IoBufRead,
278        IoLines,
279        IoRead,
280        IoSeek,
281        IoWrite,
282        IpAddr,
283        Ipv4Addr,
284        Ipv6Addr,
285        IrTyKind,
286        Is,
287        Item,
288        ItemContext,
289        IterEmpty,
290        IterOnce,
291        IterPeekable,
292        Iterator,
293        IteratorItem,
294        IteratorMap,
295        Layout,
296        Left,
297        Lifetime,
298        LinkedList,
299        LintDiagnostic,
300        LintPass,
301        LocalKey,
302        Mutex,
303        MutexGuard,
304        N,
305        NonNull,
306        NonZero,
307        None,
308        Normal,
309        Ok,
310        Option,
311        Ord,
312        Ordering,
313        OsStr,
314        OsString,
315        Other,
316        Output,
317        Param,
318        ParamSet,
319        PartialEq,
320        PartialOrd,
321        Path,
322        PathBuf,
323        Pending,
324        PinCoerceUnsized,
325        PinDerefMutHelper,
326        Pointer,
327        Poll,
328        ProcMacro,
329        ProceduralMasqueradeDummyType,
330        Range,
331        RangeBounds,
332        RangeCopy,
333        RangeFrom,
334        RangeFromCopy,
335        RangeFull,
336        RangeInclusive,
337        RangeInclusiveCopy,
338        RangeMax,
339        RangeMin,
340        RangeSub,
341        RangeTo,
342        RangeToInclusive,
343        RangeToInclusiveCopy,
344        Rc,
345        RcWeak,
346        Ready,
347        Receiver,
348        RefCell,
349        RefCellRef,
350        RefCellRefMut,
351        Reference,
352        Relaxed,
353        Release,
354        Result,
355        ResumeTy,
356        Return,
357        Reverse,
358        Right,
359        Rust,
360        RustaceansAreAwesome,
361        RwLock,
362        RwLockReadGuard,
363        RwLockWriteGuard,
364        Saturating,
365        SeekFrom,
366        SelfTy,
367        Send,
368        SeqCst,
369        Sized,
370        Slice,
371        SliceIndex,
372        SliceIter,
373        Some,
374        SpanCtxt,
375        Stdin,
376        Str,
377        String,
378        Struct,
379        StructuralPartialEq,
380        Subdiagnostic,
381        SymbolIntern,
382        Sync,
383        SyncUnsafeCell,
384        T,
385        Target,
386        This,
387        ToOwned,
388        ToString,
389        TokenStream,
390        Trait,
391        TrivialClone,
392        Try,
393        TryCaptureGeneric,
394        TryCapturePrintable,
395        TryFrom,
396        TryInto,
397        Tuple,
398        Ty,
399        TyCtxt,
400        TyKind,
401        Type,
402        Union,
403        Unknown,
404        Unsize,
405        UnsizedConstParamTy,
406        Upvars,
407        Vec,
408        VecDeque,
409        Waker,
410        Wrapper,
411        Wrapping,
412        Yield,
413        _DECLS,
414        __D,
415        __H,
416        __S,
417        __T,
418        __awaitee,
419        __try_var,
420        _t,
421        _task_context,
422        a32,
423        aarch64,
424        aarch64_target_feature,
425        aarch64_unstable_target_feature,
426        aarch64_ver_target_feature,
427        abi,
428        abi_amdgpu_kernel,
429        abi_avr_interrupt,
430        abi_c_cmse_nonsecure_call,
431        abi_cmse_nonsecure_call,
432        abi_custom,
433        abi_efiapi,
434        abi_gpu_kernel,
435        abi_msp430_interrupt,
436        abi_ptx,
437        abi_riscv_interrupt,
438        abi_sysv64,
439        abi_thiscall,
440        abi_unadjusted,
441        abi_vectorcall,
442        abi_x86_interrupt,
443        abort,
444        add,
445        add_assign,
446        add_with_overflow,
447        address,
448        adt_const_params,
449        advanced_slice_patterns,
450        adx_target_feature,
451        aes,
452        aggregate_raw_ptr,
453        alias,
454        align,
455        align_of,
456        align_of_val,
457        alignment,
458        all,
459        alloc,
460        alloc_error_handler,
461        alloc_layout,
462        alloc_zeroed,
463        allocator,
464        allocator_api,
465        allocator_internals,
466        allow,
467        allow_fail,
468        allow_internal_unsafe,
469        allow_internal_unstable,
470        altivec,
471        alu32,
472        always,
473        amdgpu,
474        amdgpu_dispatch_ptr,
475        analysis,
476        and,
477        and_then,
478        anon,
479        anon_adt,
480        anon_assoc,
481        anonymous_lifetime_in_impl_trait,
482        any,
483        append_const_msg,
484        apx_target_feature,
485        arbitrary_enum_discriminant,
486        arbitrary_self_types,
487        arbitrary_self_types_pointers,
488        areg,
489        args,
490        arith_offset,
491        arm,
492        arm64ec,
493        arm_a32: "arm::a32",
494        arm_t32: "arm::t32",
495        arm_target_feature,
496        array,
497        as_dash_needed: "as-needed",
498        as_ptr,
499        as_ref,
500        as_str,
501        asm,
502        asm_cfg,
503        asm_const,
504        asm_experimental_arch,
505        asm_experimental_reg,
506        asm_goto,
507        asm_goto_with_outputs,
508        asm_sym,
509        asm_unwind,
510        assert,
511        assert_eq,
512        assert_eq_macro,
513        assert_inhabited,
514        assert_macro,
515        assert_mem_uninitialized_valid,
516        assert_ne_macro,
517        assert_receiver_is_total_eq,
518        assert_zero_valid,
519        asserting,
520        associated_const_equality,
521        associated_consts,
522        associated_type_bounds,
523        associated_type_defaults,
524        associated_types,
525        assume,
526        assume_init,
527        asterisk: "*",
528        async_await,
529        async_call,
530        async_call_mut,
531        async_call_once,
532        async_closure,
533        async_drop,
534        async_drop_in_place,
535        async_fn,
536        async_fn_in_dyn_trait,
537        async_fn_in_trait,
538        async_fn_kind_helper,
539        async_fn_kind_upvars,
540        async_fn_mut,
541        async_fn_once,
542        async_fn_once_output,
543        async_fn_track_caller,
544        async_fn_traits,
545        async_for_loop,
546        async_gen_internals,
547        async_iterator,
548        async_iterator_poll_next,
549        async_trait_bounds,
550        atomic,
551        atomic_and,
552        atomic_cxchg,
553        atomic_cxchgweak,
554        atomic_fence,
555        atomic_load,
556        atomic_max,
557        atomic_min,
558        atomic_mod,
559        atomic_nand,
560        atomic_or,
561        atomic_singlethreadfence,
562        atomic_store,
563        atomic_umax,
564        atomic_umin,
565        atomic_xadd,
566        atomic_xchg,
567        atomic_xor,
568        atomic_xsub,
569        atomics,
570        att_syntax,
571        attr,
572        attr_literals,
573        attribute,
574        attributes,
575        audit_that,
576        augmented_assignments,
577        auto_cfg,
578        auto_traits,
579        autodiff,
580        autodiff_forward,
581        autodiff_reverse,
582        automatically_derived,
583        available_externally,
584        avr,
585        avr_target_feature,
586        avx,
587        avx10_target_feature,
588        avx512_target_feature,
589        avx512bw,
590        avx512f,
591        await_macro,
592        bang,
593        begin_panic,
594        bench,
595        bevy_ecs,
596        bikeshed,
597        bikeshed_guaranteed_no_drop,
598        bin,
599        binaryheap_iter,
600        bind_by_move_pattern_guards,
601        bindings_after_at,
602        bitand,
603        bitand_assign,
604        bitor,
605        bitor_assign,
606        bitreverse,
607        bits,
608        bitxor,
609        bitxor_assign,
610        black_box,
611        block,
612        blocking,
613        bool,
614        bool_then,
615        borrowck_graphviz_format,
616        borrowck_graphviz_postflow,
617        box_new,
618        box_patterns,
619        box_syntax,
620        boxed_slice,
621        bpf,
622        bpf_target_feature,
623        braced_empty_structs,
624        branch,
625        breakpoint,
626        bridge,
627        bswap,
628        btreemap_contains_key,
629        btreemap_insert,
630        btreeset_iter,
631        built,
632        builtin_syntax,
633        bundle,
634        c,
635        c_dash_variadic,
636        c_str,
637        c_str_literals,
638        c_unwind,
639        c_variadic,
640        c_variadic_naked_functions,
641        c_void,
642        call,
643        call_mut,
644        call_once,
645        call_once_future,
646        call_ref_future,
647        caller,
648        caller_location,
649        capture_disjoint_fields,
650        carrying_mul_add,
651        catch_unwind,
652        cause,
653        cdylib,
654        ceilf16,
655        ceilf32,
656        ceilf64,
657        ceilf128,
658        cfg,
659        cfg_accessible,
660        cfg_attr,
661        cfg_attr_multi,
662        cfg_attr_trace: "<cfg_attr_trace>", // must not be a valid identifier
663        cfg_boolean_literals,
664        cfg_contract_checks,
665        cfg_doctest,
666        cfg_emscripten_wasm_eh,
667        cfg_eval,
668        cfg_fmt_debug,
669        cfg_overflow_checks,
670        cfg_panic,
671        cfg_relocation_model,
672        cfg_sanitize,
673        cfg_sanitizer_cfi,
674        cfg_select,
675        cfg_target_abi,
676        cfg_target_compact,
677        cfg_target_feature,
678        cfg_target_has_atomic,
679        cfg_target_has_atomic_equal_alignment,
680        cfg_target_has_reliable_f16_f128,
681        cfg_target_thread_local,
682        cfg_target_vendor,
683        cfg_trace: "<cfg_trace>", // must not be a valid identifier
684        cfg_ub_checks,
685        cfg_version,
686        cfi,
687        cfi_encoding,
688        char,
689        char_is_ascii,
690        char_to_digit,
691        child_id,
692        child_kill,
693        client,
694        clippy,
695        clobber_abi,
696        clone,
697        clone_closures,
698        clone_fn,
699        clone_from,
700        closure,
701        closure_lifetime_binder,
702        closure_to_fn_coercion,
703        closure_track_caller,
704        cmp,
705        cmp_max,
706        cmp_min,
707        cmp_ord_max,
708        cmp_ord_min,
709        cmp_partialeq_eq,
710        cmp_partialeq_ne,
711        cmp_partialord_cmp,
712        cmp_partialord_ge,
713        cmp_partialord_gt,
714        cmp_partialord_le,
715        cmp_partialord_lt,
716        cmpxchg16b_target_feature,
717        cmse_nonsecure_entry,
718        coerce_pointee_validated,
719        coerce_shared,
720        coerce_unsized,
721        cold,
722        cold_path,
723        collapse_debuginfo,
724        column,
725        common,
726        compare_bytes,
727        compare_exchange,
728        compare_exchange_weak,
729        compile_error,
730        compiler,
731        compiler_builtins,
732        compiler_copy,
733        compiler_fence,
734        compiler_move,
735        concat,
736        concat_bytes,
737        concat_idents,
738        conservative_impl_trait,
739        console,
740        const_allocate,
741        const_async_blocks,
742        const_block_items,
743        const_closures,
744        const_compare_raw_pointers,
745        const_constructor,
746        const_continue,
747        const_deallocate,
748        const_destruct,
749        const_eval_limit,
750        const_eval_select,
751        const_evaluatable_checked,
752        const_extern_fn,
753        const_fn,
754        const_fn_floating_point_arithmetic,
755        const_fn_fn_ptr_basics,
756        const_fn_trait_bound,
757        const_fn_transmute,
758        const_fn_union,
759        const_fn_unsize,
760        const_for,
761        const_format_args,
762        const_generics,
763        const_generics_defaults,
764        const_if_match,
765        const_impl_trait,
766        const_in_array_repeat_expressions,
767        const_indexing,
768        const_let,
769        const_loop,
770        const_make_global,
771        const_mut_refs,
772        const_panic,
773        const_panic_fmt,
774        const_param_ty,
775        const_precise_live_drops,
776        const_ptr_cast,
777        const_raw_ptr_deref,
778        const_raw_ptr_to_usize_cast,
779        const_refs_to_cell,
780        const_refs_to_static,
781        const_trait_bound_opt_out,
782        const_trait_impl,
783        const_try,
784        const_ty_placeholder: "<const_ty>",
785        constant,
786        constructor,
787        contract_build_check_ensures,
788        contract_check_ensures,
789        contract_check_requires,
790        contract_checks,
791        contracts,
792        contracts_ensures,
793        contracts_internals,
794        contracts_requires,
795        convert,
796        convert_identity,
797        copy,
798        copy_closures,
799        copy_nonoverlapping,
800        copysignf16,
801        copysignf32,
802        copysignf64,
803        copysignf128,
804        core,
805        core_panic,
806        core_panic_2015_macro,
807        core_panic_2021_macro,
808        core_panic_macro,
809        coroutine,
810        coroutine_clone,
811        coroutine_resume,
812        coroutine_return,
813        coroutine_state,
814        coroutine_yield,
815        coroutines,
816        cosf16,
817        cosf32,
818        cosf64,
819        cosf128,
820        count,
821        coverage,
822        coverage_attribute,
823        cr,
824        crate_in_paths,
825        crate_local,
826        crate_name,
827        crate_type,
828        crate_visibility_modifier,
829        crt_dash_static: "crt-static",
830        csky,
831        csky_target_feature,
832        cstr_type,
833        cstring_as_c_str,
834        cstring_type,
835        ctlz,
836        ctlz_nonzero,
837        ctpop,
838        ctr,
839        cttz,
840        cttz_nonzero,
841        custom_attribute,
842        custom_code_classes_in_docs,
843        custom_derive,
844        custom_inner_attributes,
845        custom_mir,
846        custom_test_frameworks,
847        d,
848        d32,
849        dbg_macro,
850        dead_code,
851        dealloc,
852        debug,
853        debug_assert_eq_macro,
854        debug_assert_macro,
855        debug_assert_ne_macro,
856        debug_assertions,
857        debug_struct,
858        debug_struct_fields_finish,
859        debug_tuple,
860        debug_tuple_fields_finish,
861        debugger_visualizer,
862        decl_macro,
863        declare_lint_pass,
864        decode,
865        decorated,
866        default_alloc_error_handler,
867        default_field_values,
868        default_fn,
869        default_lib_allocator,
870        default_method_body_is_const,
871        // --------------------------
872        // Lang items which are used only for experiments with auto traits with default bounds.
873        // These lang items are not actually defined in core/std. Experiment is a part of
874        // `MCP: Low level components for async drop`(https://github.com/rust-lang/compiler-team/issues/727)
875        default_trait1,
876        default_trait2,
877        default_trait3,
878        default_trait4,
879        // --------------------------
880        default_type_parameter_fallback,
881        default_type_params,
882        define_opaque,
883        delayed_bug_from_inside_query,
884        deny,
885        deprecated,
886        deprecated_safe,
887        deprecated_suggestion,
888        deref,
889        deref_method,
890        deref_mut,
891        deref_mut_method,
892        deref_patterns,
893        deref_pure,
894        deref_target,
895        derive,
896        derive_coerce_pointee,
897        derive_const,
898        derive_const_issue: "118304",
899        derive_default_enum,
900        derive_from,
901        derive_smart_pointer,
902        destruct,
903        destructuring_assignment,
904        diagnostic,
905        diagnostic_namespace,
906        diagnostic_on_const,
907        dialect,
908        direct,
909        discriminant_kind,
910        discriminant_type,
911        discriminant_value,
912        disjoint_bitor,
913        dispatch_from_dyn,
914        div,
915        div_assign,
916        diverging_block_default,
917        dl,
918        do_not_recommend,
919        doc,
920        doc_alias,
921        doc_auto_cfg,
922        doc_cfg,
923        doc_cfg_hide,
924        doc_keyword,
925        doc_masked,
926        doc_notable_trait,
927        doc_primitive,
928        doc_spotlight,
929        doctest,
930        dotdot: "..",
931        dotdot_in_tuple_patterns,
932        dotdoteq_in_patterns,
933        dreg,
934        dreg_low8,
935        dreg_low16,
936        drop,
937        drop_in_place,
938        drop_types_in_const,
939        dropck_eyepatch,
940        dropck_parametricity,
941        dummy: "<!dummy!>", // use this instead of `sym::empty` for symbols that won't be used
942        dummy_cgu_name,
943        dylib,
944        dyn_compatible_for_dispatch,
945        dyn_metadata,
946        dyn_star,
947        dyn_trait,
948        dynamic_no_pic: "dynamic-no-pic",
949        e,
950        edition_panic,
951        effective_target_features,
952        effects,
953        eh_catch_typeinfo,
954        eh_personality,
955        eii,
956        eii_declaration,
957        eii_impl,
958        eii_internals,
959        eii_shared_macro,
960        element_ty,
961        emit,
962        emit_enum,
963        emit_enum_variant,
964        emit_enum_variant_arg,
965        emit_struct,
966        emit_struct_field,
967        // Notes about `sym::empty`:
968        // - It should only be used when it genuinely means "empty symbol". Use
969        //   `Option<Symbol>` when "no symbol" is a possibility.
970        // - For dummy symbols that are never used and absolutely must be
971        //   present, it's better to use `sym::dummy` than `sym::empty`, because
972        //   it's clearer that it's intended as a dummy value, and more likely
973        //   to be detected if it accidentally does get used.
974        empty: "",
975        emscripten_wasm_eh,
976        enable,
977        encode,
978        end,
979        entry_nops,
980        enumerate_method,
981        env,
982        env_CFG_RELEASE: env!("CFG_RELEASE"),
983        eprint_macro,
984        eprintln_macro,
985        eq,
986        ergonomic_clones,
987        ermsb_target_feature,
988        exact_div,
989        except,
990        exception_handling: "exception-handling",
991        exchange_malloc,
992        exclusive_range_pattern,
993        exhaustive_integer_patterns,
994        exhaustive_patterns,
995        existential_type,
996        exp2f16,
997        exp2f32,
998        exp2f64,
999        exp2f128,
1000        expect,
1001        expected,
1002        expf16,
1003        expf32,
1004        expf64,
1005        expf128,
1006        explicit_extern_abis,
1007        explicit_generic_args_with_impl_trait,
1008        explicit_tail_calls,
1009        export_name,
1010        export_stable,
1011        export_symbols: "export-symbols",
1012        expr,
1013        expr_2021,
1014        expr_fragment_specifier_2024,
1015        extended_key_value_attributes,
1016        extended_varargs_abi_support,
1017        extern_absolute_paths,
1018        extern_crate_item_prelude,
1019        extern_crate_self,
1020        extern_in_paths,
1021        extern_item_impls,
1022        extern_prelude,
1023        extern_system_varargs,
1024        extern_types,
1025        extern_weak,
1026        external,
1027        external_doc,
1028        f,
1029        f16,
1030        f16_consts_mod,
1031        f16_epsilon,
1032        f16_nan,
1033        f16c_target_feature,
1034        f32,
1035        f32_consts_mod,
1036        f32_epsilon,
1037        f32_legacy_const_digits,
1038        f32_legacy_const_epsilon,
1039        f32_legacy_const_infinity,
1040        f32_legacy_const_mantissa_dig,
1041        f32_legacy_const_max,
1042        f32_legacy_const_max_10_exp,
1043        f32_legacy_const_max_exp,
1044        f32_legacy_const_min,
1045        f32_legacy_const_min_10_exp,
1046        f32_legacy_const_min_exp,
1047        f32_legacy_const_min_positive,
1048        f32_legacy_const_nan,
1049        f32_legacy_const_neg_infinity,
1050        f32_legacy_const_radix,
1051        f32_nan,
1052        f64,
1053        f64_consts_mod,
1054        f64_epsilon,
1055        f64_legacy_const_digits,
1056        f64_legacy_const_epsilon,
1057        f64_legacy_const_infinity,
1058        f64_legacy_const_mantissa_dig,
1059        f64_legacy_const_max,
1060        f64_legacy_const_max_10_exp,
1061        f64_legacy_const_max_exp,
1062        f64_legacy_const_min,
1063        f64_legacy_const_min_10_exp,
1064        f64_legacy_const_min_exp,
1065        f64_legacy_const_min_positive,
1066        f64_legacy_const_nan,
1067        f64_legacy_const_neg_infinity,
1068        f64_legacy_const_radix,
1069        f64_nan,
1070        f128,
1071        f128_consts_mod,
1072        f128_epsilon,
1073        f128_nan,
1074        fabsf16,
1075        fabsf32,
1076        fabsf64,
1077        fabsf128,
1078        fadd_algebraic,
1079        fadd_fast,
1080        fake_variadic,
1081        fallback,
1082        fdiv_algebraic,
1083        fdiv_fast,
1084        feature,
1085        fence,
1086        ferris: "🦀",
1087        fetch_update,
1088        ffi,
1089        ffi_const,
1090        ffi_pure,
1091        ffi_returns_twice,
1092        field,
1093        field_init_shorthand,
1094        fields,
1095        file,
1096        file_options,
1097        flags,
1098        float,
1099        float_to_int_unchecked,
1100        floorf16,
1101        floorf32,
1102        floorf64,
1103        floorf128,
1104        fmaf16,
1105        fmaf32,
1106        fmaf64,
1107        fmaf128,
1108        fmt,
1109        fmt_debug,
1110        fmul_algebraic,
1111        fmul_fast,
1112        fmuladdf16,
1113        fmuladdf32,
1114        fmuladdf64,
1115        fmuladdf128,
1116        fn_align,
1117        fn_body,
1118        fn_delegation,
1119        fn_must_use,
1120        fn_mut,
1121        fn_once,
1122        fn_once_output,
1123        fn_ptr_addr,
1124        fn_ptr_trait,
1125        forbid,
1126        force_target_feature,
1127        forget,
1128        format,
1129        format_args,
1130        format_args_capture,
1131        format_args_macro,
1132        format_args_nl,
1133        format_argument,
1134        format_arguments,
1135        format_macro,
1136        framework,
1137        freeze,
1138        freeze_impls,
1139        freg,
1140        frem_algebraic,
1141        frem_fast,
1142        from,
1143        from_desugaring,
1144        from_fn,
1145        from_iter,
1146        from_iter_fn,
1147        from_output,
1148        from_residual,
1149        from_size_align_unchecked,
1150        from_str,
1151        from_str_method,
1152        from_str_nonconst,
1153        from_u16,
1154        from_usize,
1155        from_yeet,
1156        frontmatter,
1157        fs_create_dir,
1158        fsub_algebraic,
1159        fsub_fast,
1160        full,
1161        fundamental,
1162        fused_iterator,
1163        future,
1164        future_drop_poll,
1165        future_output,
1166        future_trait,
1167        fxsr,
1168        gdb_script_file,
1169        ge,
1170        gen_blocks,
1171        gen_future,
1172        generator_clone,
1173        generators,
1174        generic_arg_infer,
1175        generic_assert,
1176        generic_associated_types,
1177        generic_associated_types_extended,
1178        generic_const_exprs,
1179        generic_const_items,
1180        generic_const_parameter_types,
1181        generic_param_attrs,
1182        generic_pattern_types,
1183        generics,
1184        get_context,
1185        global_alloc_ty,
1186        global_allocator,
1187        global_asm,
1188        global_registration,
1189        globs,
1190        gt,
1191        guard_patterns,
1192        half_open_range_patterns,
1193        half_open_range_patterns_in_slices,
1194        hash,
1195        hashmap_contains_key,
1196        hashmap_drain_ty,
1197        hashmap_insert,
1198        hashmap_iter_mut_ty,
1199        hashmap_iter_ty,
1200        hashmap_keys_ty,
1201        hashmap_values_mut_ty,
1202        hashmap_values_ty,
1203        hashset_drain_ty,
1204        hashset_iter,
1205        hashset_iter_ty,
1206        hexagon,
1207        hexagon_target_feature,
1208        hidden,
1209        hide,
1210        hint,
1211        homogeneous_aggregate,
1212        host,
1213        html_favicon_url,
1214        html_logo_url,
1215        html_no_source,
1216        html_playground_url,
1217        html_root_url,
1218        hwaddress,
1219        i,
1220        i8,
1221        i8_legacy_const_max,
1222        i8_legacy_const_min,
1223        i8_legacy_fn_max_value,
1224        i8_legacy_fn_min_value,
1225        i8_legacy_mod,
1226        i16,
1227        i16_legacy_const_max,
1228        i16_legacy_const_min,
1229        i16_legacy_fn_max_value,
1230        i16_legacy_fn_min_value,
1231        i16_legacy_mod,
1232        i32,
1233        i32_legacy_const_max,
1234        i32_legacy_const_min,
1235        i32_legacy_fn_max_value,
1236        i32_legacy_fn_min_value,
1237        i32_legacy_mod,
1238        i64,
1239        i64_legacy_const_max,
1240        i64_legacy_const_min,
1241        i64_legacy_fn_max_value,
1242        i64_legacy_fn_min_value,
1243        i64_legacy_mod,
1244        i128,
1245        i128_legacy_const_max,
1246        i128_legacy_const_min,
1247        i128_legacy_fn_max_value,
1248        i128_legacy_fn_min_value,
1249        i128_legacy_mod,
1250        i128_type,
1251        ident,
1252        if_let,
1253        if_let_guard,
1254        if_let_rescope,
1255        if_while_or_patterns,
1256        ignore,
1257        immediate_abort: "immediate-abort",
1258        impl_header_lifetime_elision,
1259        impl_lint_pass,
1260        impl_trait_in_assoc_type,
1261        impl_trait_in_bindings,
1262        impl_trait_in_fn_trait_return,
1263        impl_trait_projections,
1264        implement_via_object,
1265        implied_by,
1266        import,
1267        import_name_type,
1268        import_shadowing,
1269        import_trait_associated_functions,
1270        imported_main,
1271        in_band_lifetimes,
1272        include,
1273        include_bytes,
1274        include_bytes_macro,
1275        include_str,
1276        include_str_macro,
1277        inclusive_range_syntax,
1278        index,
1279        index_mut,
1280        infer_outlives_requirements,
1281        infer_static_outlives_requirements,
1282        inherent_associated_types,
1283        inherit,
1284        initial,
1285        inlateout,
1286        inline,
1287        inline_const,
1288        inline_const_pat,
1289        inout,
1290        instant_now,
1291        instruction_set,
1292        integer_: "integer", // underscore to avoid clashing with the function `sym::integer` below
1293        integral,
1294        internal,
1295        internal_features,
1296        into_async_iter_into_iter,
1297        into_future,
1298        into_iter,
1299        into_try_type,
1300        intra_doc_pointers,
1301        intrinsics,
1302        intrinsics_unaligned_volatile_load,
1303        intrinsics_unaligned_volatile_store,
1304        io_error_new,
1305        io_errorkind,
1306        io_stderr,
1307        io_stdout,
1308        irrefutable_let_patterns,
1309        is,
1310        is_auto,
1311        is_val_statically_known,
1312        isa_attribute,
1313        isize,
1314        isize_legacy_const_max,
1315        isize_legacy_const_min,
1316        isize_legacy_fn_max_value,
1317        isize_legacy_fn_min_value,
1318        isize_legacy_mod,
1319        issue,
1320        issue_5723_bootstrap,
1321        issue_tracker_base_url,
1322        item,
1323        item_like_imports,
1324        iter,
1325        iter_cloned,
1326        iter_copied,
1327        iter_filter,
1328        iter_mut,
1329        iter_repeat,
1330        iterator,
1331        iterator_collect_fn,
1332        kcfi,
1333        kernel_address,
1334        keylocker_x86,
1335        keyword,
1336        kind,
1337        kreg,
1338        kreg0,
1339        label,
1340        label_break_value,
1341        lahfsahf_target_feature,
1342        lang,
1343        lang_items,
1344        large_assignments,
1345        last,
1346        lateout,
1347        lazy_normalization_consts,
1348        lazy_type_alias,
1349        le,
1350        legacy_receiver,
1351        len,
1352        let_chains,
1353        let_else,
1354        lhs,
1355        lib,
1356        libc,
1357        lifetime,
1358        lifetime_capture_rules_2024,
1359        lifetimes,
1360        likely,
1361        line,
1362        link,
1363        link_arg_attribute,
1364        link_args,
1365        link_cfg,
1366        link_dash_arg: "link-arg",
1367        link_llvm_intrinsics,
1368        link_name,
1369        link_ordinal,
1370        link_section,
1371        linkage,
1372        linker,
1373        linker_messages,
1374        linkonce,
1375        linkonce_odr,
1376        lint_reasons,
1377        literal,
1378        load,
1379        loaded_from_disk,
1380        local,
1381        local_inner_macros,
1382        log2f16,
1383        log2f32,
1384        log2f64,
1385        log2f128,
1386        log10f16,
1387        log10f32,
1388        log10f64,
1389        log10f128,
1390        log_syntax,
1391        logf16,
1392        logf32,
1393        logf64,
1394        logf128,
1395        loongarch32,
1396        loongarch64,
1397        loongarch_target_feature,
1398        loop_break_value,
1399        loop_match,
1400        lr,
1401        lt,
1402        m68k,
1403        m68k_target_feature,
1404        macro_at_most_once_rep,
1405        macro_attr,
1406        macro_attributes_in_derive_output,
1407        macro_concat,
1408        macro_derive,
1409        macro_escape,
1410        macro_export,
1411        macro_lifetime_matcher,
1412        macro_literal_matcher,
1413        macro_metavar_expr,
1414        macro_metavar_expr_concat,
1415        macro_reexport,
1416        macro_use,
1417        macro_vis_matcher,
1418        macros_in_extern,
1419        main,
1420        managed_boxes,
1421        manually_drop,
1422        map,
1423        map_err,
1424        marker,
1425        marker_trait_attr,
1426        masked,
1427        match_beginning_vert,
1428        match_default_bindings,
1429        matches_macro,
1430        maximumf16,
1431        maximumf32,
1432        maximumf64,
1433        maximumf128,
1434        maxnumf16,
1435        maxnumf32,
1436        maxnumf64,
1437        maxnumf128,
1438        may_dangle,
1439        may_unwind,
1440        maybe_uninit,
1441        maybe_uninit_uninit,
1442        maybe_uninit_zeroed,
1443        mem_align_const,
1444        mem_align_of,
1445        mem_discriminant,
1446        mem_drop,
1447        mem_forget,
1448        mem_replace,
1449        mem_size_const,
1450        mem_size_of,
1451        mem_size_of_val,
1452        mem_swap,
1453        mem_uninitialized,
1454        mem_variant_count,
1455        mem_zeroed,
1456        member_constraints,
1457        memory,
1458        memtag,
1459        message,
1460        meta,
1461        meta_sized,
1462        metadata_type,
1463        mgca_type_const_syntax,
1464        min_const_fn,
1465        min_const_generics,
1466        min_const_unsafe_fn,
1467        min_exhaustive_patterns,
1468        min_generic_const_args,
1469        min_specialization,
1470        min_type_alias_impl_trait,
1471        minimumf16,
1472        minimumf32,
1473        minimumf64,
1474        minimumf128,
1475        minnumf16,
1476        minnumf32,
1477        minnumf64,
1478        minnumf128,
1479        mips,
1480        mips32r6,
1481        mips64,
1482        mips64r6,
1483        mips_target_feature,
1484        mir_assume,
1485        mir_basic_block,
1486        mir_call,
1487        mir_cast_ptr_to_ptr,
1488        mir_cast_transmute,
1489        mir_cast_unsize,
1490        mir_checked,
1491        mir_debuginfo,
1492        mir_deinit,
1493        mir_discriminant,
1494        mir_drop,
1495        mir_field,
1496        mir_goto,
1497        mir_len,
1498        mir_make_place,
1499        mir_move,
1500        mir_offset,
1501        mir_ptr_metadata,
1502        mir_retag,
1503        mir_return,
1504        mir_return_to,
1505        mir_set_discriminant,
1506        mir_static,
1507        mir_static_mut,
1508        mir_storage_dead,
1509        mir_storage_live,
1510        mir_tail_call,
1511        mir_unreachable,
1512        mir_unwind_cleanup,
1513        mir_unwind_continue,
1514        mir_unwind_resume,
1515        mir_unwind_terminate,
1516        mir_unwind_terminate_reason,
1517        mir_unwind_unreachable,
1518        mir_variant,
1519        miri,
1520        mmx_reg,
1521        modifiers,
1522        module,
1523        module_path,
1524        more_maybe_bounds,
1525        more_qualified_paths,
1526        more_struct_aliases,
1527        movbe_target_feature,
1528        move_ref_pattern,
1529        move_size_limit,
1530        movrs_target_feature,
1531        msp430,
1532        mul,
1533        mul_assign,
1534        mul_with_overflow,
1535        multiple_supertrait_upcastable,
1536        must_not_suspend,
1537        must_use,
1538        mut_preserve_binding_mode_2024,
1539        mut_ref,
1540        mutable,
1541        naked,
1542        naked_asm,
1543        naked_functions,
1544        naked_functions_rustic_abi,
1545        naked_functions_target_feature,
1546        name,
1547        names,
1548        native_link_modifiers,
1549        native_link_modifiers_as_needed,
1550        native_link_modifiers_bundle,
1551        native_link_modifiers_verbatim,
1552        native_link_modifiers_whole_archive,
1553        natvis_file,
1554        ne,
1555        needs_allocator,
1556        needs_drop,
1557        needs_panic_runtime,
1558        neg,
1559        negate_unsigned,
1560        negative_bounds,
1561        negative_impls,
1562        neon,
1563        nested,
1564        never,
1565        never_patterns,
1566        never_type,
1567        never_type_fallback,
1568        new,
1569        new_binary,
1570        new_const,
1571        new_debug,
1572        new_debug_noop,
1573        new_display,
1574        new_lower_exp,
1575        new_lower_hex,
1576        new_octal,
1577        new_pointer,
1578        new_range,
1579        new_unchecked,
1580        new_upper_exp,
1581        new_upper_hex,
1582        new_v1,
1583        new_v1_formatted,
1584        next,
1585        niko,
1586        nll,
1587        no,
1588        no_builtins,
1589        no_core,
1590        no_coverage,
1591        no_crate_inject,
1592        no_debug,
1593        no_default_passes,
1594        no_implicit_prelude,
1595        no_inline,
1596        no_link,
1597        no_main,
1598        no_mangle,
1599        no_sanitize,
1600        no_stack_check,
1601        no_std,
1602        nomem,
1603        non_ascii_idents,
1604        non_exhaustive,
1605        non_exhaustive_omitted_patterns_lint,
1606        non_lifetime_binders,
1607        non_modrs_mods,
1608        nonblocking,
1609        none,
1610        nontemporal_store,
1611        noop_method_borrow,
1612        noop_method_clone,
1613        noop_method_deref,
1614        noprefix,
1615        noreturn,
1616        nostack,
1617        not,
1618        notable_trait,
1619        note,
1620        null,
1621        nvptx64,
1622        nvptx_target_feature,
1623        object_safe_for_dispatch,
1624        of,
1625        off,
1626        offload,
1627        offset,
1628        offset_of,
1629        offset_of_enum,
1630        offset_of_nested,
1631        offset_of_slice,
1632        ok_or_else,
1633        old_name,
1634        omit_gdb_pretty_printer_section,
1635        on,
1636        on_const,
1637        on_unimplemented,
1638        opaque,
1639        opaque_generic_const_args,
1640        opaque_module_name_placeholder: "<opaque>",
1641        open_options_new,
1642        ops,
1643        opt_out_copy,
1644        optimize,
1645        optimize_attribute,
1646        optimized,
1647        optin_builtin_traits,
1648        option,
1649        option_env,
1650        option_expect,
1651        option_unwrap,
1652        options,
1653        or,
1654        or_patterns,
1655        ord_cmp_method,
1656        os_str_to_os_string,
1657        os_string_as_os_str,
1658        other,
1659        out,
1660        overflow_checks,
1661        overlapping_marker_traits,
1662        owned_box,
1663        packed,
1664        packed_bundled_libs,
1665        panic,
1666        panic_2015,
1667        panic_2021,
1668        panic_abort,
1669        panic_any,
1670        panic_bounds_check,
1671        panic_cannot_unwind,
1672        panic_const_add_overflow,
1673        panic_const_async_fn_resumed,
1674        panic_const_async_fn_resumed_drop,
1675        panic_const_async_fn_resumed_panic,
1676        panic_const_async_gen_fn_resumed,
1677        panic_const_async_gen_fn_resumed_drop,
1678        panic_const_async_gen_fn_resumed_panic,
1679        panic_const_coroutine_resumed,
1680        panic_const_coroutine_resumed_drop,
1681        panic_const_coroutine_resumed_panic,
1682        panic_const_div_by_zero,
1683        panic_const_div_overflow,
1684        panic_const_gen_fn_none,
1685        panic_const_gen_fn_none_drop,
1686        panic_const_gen_fn_none_panic,
1687        panic_const_mul_overflow,
1688        panic_const_neg_overflow,
1689        panic_const_rem_by_zero,
1690        panic_const_rem_overflow,
1691        panic_const_shl_overflow,
1692        panic_const_shr_overflow,
1693        panic_const_sub_overflow,
1694        panic_display,
1695        panic_fmt,
1696        panic_handler,
1697        panic_impl,
1698        panic_implementation,
1699        panic_in_cleanup,
1700        panic_info,
1701        panic_invalid_enum_construction,
1702        panic_location,
1703        panic_misaligned_pointer_dereference,
1704        panic_nounwind,
1705        panic_null_pointer_dereference,
1706        panic_runtime,
1707        panic_str_2015,
1708        panic_unwind,
1709        panicking,
1710        param_attrs,
1711        parent_label,
1712        partial_cmp,
1713        partial_ord,
1714        passes,
1715        pat,
1716        pat_param,
1717        patchable_function_entry,
1718        path,
1719        path_main_separator,
1720        path_to_pathbuf,
1721        pathbuf_as_path,
1722        pattern_complexity_limit,
1723        pattern_parentheses,
1724        pattern_type,
1725        pattern_type_range_trait,
1726        pattern_types,
1727        permissions_from_mode,
1728        phantom_data,
1729        phase,
1730        pic,
1731        pie,
1732        pin,
1733        pin_ergonomics,
1734        pin_macro,
1735        pin_v2,
1736        platform_intrinsics,
1737        plugin,
1738        plugin_registrar,
1739        plugins,
1740        pointee,
1741        pointee_sized,
1742        pointee_trait,
1743        pointer,
1744        poll,
1745        poll_next,
1746        position,
1747        post_cleanup: "post-cleanup",
1748        post_dash_lto: "post-lto",
1749        postfix_match,
1750        powerpc,
1751        powerpc64,
1752        powerpc_target_feature,
1753        powf16,
1754        powf32,
1755        powf64,
1756        powf128,
1757        powif16,
1758        powif32,
1759        powif64,
1760        powif128,
1761        pre_dash_lto: "pre-lto",
1762        precise_capturing,
1763        precise_capturing_in_traits,
1764        precise_pointer_size_matching,
1765        precision,
1766        predicates,
1767        pref_align_of,
1768        prefetch_read_data,
1769        prefetch_read_instruction,
1770        prefetch_write_data,
1771        prefetch_write_instruction,
1772        prefix_nops,
1773        preg,
1774        prelude,
1775        prelude_import,
1776        preserves_flags,
1777        prfchw_target_feature,
1778        print_macro,
1779        println_macro,
1780        proc_dash_macro: "proc-macro",
1781        proc_macro,
1782        proc_macro_attribute,
1783        proc_macro_derive,
1784        proc_macro_expr,
1785        proc_macro_gen,
1786        proc_macro_hygiene,
1787        proc_macro_internals,
1788        proc_macro_mod,
1789        proc_macro_non_items,
1790        proc_macro_path_invoc,
1791        process_abort,
1792        process_exit,
1793        profiler_builtins,
1794        profiler_runtime,
1795        ptr,
1796        ptr_cast,
1797        ptr_cast_const,
1798        ptr_cast_mut,
1799        ptr_const_is_null,
1800        ptr_copy,
1801        ptr_copy_nonoverlapping,
1802        ptr_eq,
1803        ptr_from_ref,
1804        ptr_guaranteed_cmp,
1805        ptr_is_null,
1806        ptr_mask,
1807        ptr_metadata,
1808        ptr_null,
1809        ptr_null_mut,
1810        ptr_offset_from,
1811        ptr_offset_from_unsigned,
1812        ptr_read,
1813        ptr_read_unaligned,
1814        ptr_read_volatile,
1815        ptr_replace,
1816        ptr_slice_from_raw_parts,
1817        ptr_slice_from_raw_parts_mut,
1818        ptr_swap,
1819        ptr_swap_nonoverlapping,
1820        ptr_without_provenance,
1821        ptr_without_provenance_mut,
1822        ptr_write,
1823        ptr_write_bytes,
1824        ptr_write_unaligned,
1825        ptr_write_volatile,
1826        pub_macro_rules,
1827        pub_restricted,
1828        public,
1829        pure,
1830        pushpop_unsafe,
1831        qreg,
1832        qreg_low4,
1833        qreg_low8,
1834        quad_precision_float,
1835        question_mark,
1836        quote,
1837        range_inclusive_new,
1838        range_step,
1839        raw_dash_dylib: "raw-dylib",
1840        raw_dylib,
1841        raw_dylib_elf,
1842        raw_eq,
1843        raw_identifiers,
1844        raw_ref_op,
1845        re_rebalance_coherence,
1846        read_enum,
1847        read_enum_variant,
1848        read_enum_variant_arg,
1849        read_struct,
1850        read_struct_field,
1851        read_via_copy,
1852        readonly,
1853        realloc,
1854        realtime,
1855        reason,
1856        reborrow,
1857        receiver,
1858        receiver_target,
1859        recursion_limit,
1860        reexport_test_harness_main,
1861        ref_pat_eat_one_layer_2024,
1862        ref_pat_eat_one_layer_2024_structural,
1863        ref_pat_everywhere,
1864        ref_unwind_safe_trait,
1865        reference,
1866        reflect,
1867        reg,
1868        reg16,
1869        reg32,
1870        reg64,
1871        reg_abcd,
1872        reg_addr,
1873        reg_byte,
1874        reg_data,
1875        reg_iw,
1876        reg_nonzero,
1877        reg_pair,
1878        reg_ptr,
1879        reg_upper,
1880        register_attr,
1881        register_tool,
1882        relaxed_adts,
1883        relaxed_struct_unsize,
1884        relocation_model,
1885        rem,
1886        rem_assign,
1887        repr,
1888        repr128,
1889        repr_align,
1890        repr_align_enum,
1891        repr_packed,
1892        repr_simd,
1893        repr_transparent,
1894        require,
1895        reserve_x18: "reserve-x18",
1896        residual,
1897        result,
1898        result_ffi_guarantees,
1899        result_ok_method,
1900        resume,
1901        return_position_impl_trait_in_trait,
1902        return_type_notation,
1903        riscv32,
1904        riscv64,
1905        riscv_target_feature,
1906        rlib,
1907        ropi,
1908        ropi_rwpi: "ropi-rwpi",
1909        rotate_left,
1910        rotate_right,
1911        round_ties_even_f16,
1912        round_ties_even_f32,
1913        round_ties_even_f64,
1914        round_ties_even_f128,
1915        roundf16,
1916        roundf32,
1917        roundf64,
1918        roundf128,
1919        rt,
1920        rtm_target_feature,
1921        runtime,
1922        rust,
1923        rust_2015,
1924        rust_2018,
1925        rust_2018_preview,
1926        rust_2021,
1927        rust_2024,
1928        rust_analyzer,
1929        rust_begin_unwind,
1930        rust_cold_cc,
1931        rust_eh_catch_typeinfo,
1932        rust_eh_personality,
1933        rust_future,
1934        rust_logo,
1935        rust_out,
1936        rust_preserve_none_cc,
1937        rustc,
1938        rustc_abi,
1939        // FIXME(#82232, #143834): temporary name to mitigate `#[align]` nameres ambiguity
1940        rustc_align,
1941        rustc_align_static,
1942        rustc_allocator,
1943        rustc_allocator_zeroed,
1944        rustc_allocator_zeroed_variant,
1945        rustc_allow_const_fn_unstable,
1946        rustc_allow_incoherent_impl,
1947        rustc_allowed_through_unstable_modules,
1948        rustc_as_ptr,
1949        rustc_attrs,
1950        rustc_autodiff,
1951        rustc_builtin_macro,
1952        rustc_capture_analysis,
1953        rustc_clean,
1954        rustc_coherence_is_core,
1955        rustc_coinductive,
1956        rustc_confusables,
1957        rustc_const_stable,
1958        rustc_const_stable_indirect,
1959        rustc_const_unstable,
1960        rustc_conversion_suggestion,
1961        rustc_deallocator,
1962        rustc_def_path,
1963        rustc_default_body_unstable,
1964        rustc_delayed_bug_from_inside_query,
1965        rustc_deny_explicit_impl,
1966        rustc_deprecated_safe_2024,
1967        rustc_diagnostic_item,
1968        rustc_diagnostic_macros,
1969        rustc_do_not_const_check,
1970        rustc_doc_primitive,
1971        rustc_driver,
1972        rustc_dummy,
1973        rustc_dump_def_parents,
1974        rustc_dump_item_bounds,
1975        rustc_dump_predicates,
1976        rustc_dump_user_args,
1977        rustc_dump_vtable,
1978        rustc_dyn_incompatible_trait,
1979        rustc_effective_visibility,
1980        rustc_eii_foreign_item,
1981        rustc_evaluate_where_clauses,
1982        rustc_expected_cgu_reuse,
1983        rustc_force_inline,
1984        rustc_has_incoherent_inherent_impls,
1985        rustc_hidden_type_of_opaques,
1986        rustc_if_this_changed,
1987        rustc_inherit_overflow_checks,
1988        rustc_insignificant_dtor,
1989        rustc_intrinsic,
1990        rustc_intrinsic_const_stable_indirect,
1991        rustc_layout,
1992        rustc_layout_scalar_valid_range_end,
1993        rustc_layout_scalar_valid_range_start,
1994        rustc_legacy_const_generics,
1995        rustc_lint_opt_deny_field_access,
1996        rustc_lint_opt_ty,
1997        rustc_lint_query_instability,
1998        rustc_lint_untracked_query_information,
1999        rustc_macro_transparency,
2000        rustc_main,
2001        rustc_mir,
2002        rustc_must_implement_one_of,
2003        rustc_never_returns_null_ptr,
2004        rustc_never_type_options,
2005        rustc_no_implicit_autorefs,
2006        rustc_no_implicit_bounds,
2007        rustc_no_mir_inline,
2008        rustc_non_const_trait_method,
2009        rustc_nonnull_optimization_guaranteed,
2010        rustc_nounwind,
2011        rustc_objc_class,
2012        rustc_objc_selector,
2013        rustc_object_lifetime_default,
2014        rustc_offload_kernel,
2015        rustc_on_unimplemented,
2016        rustc_outlives,
2017        rustc_paren_sugar,
2018        rustc_partition_codegened,
2019        rustc_partition_reused,
2020        rustc_pass_by_value,
2021        rustc_pass_indirectly_in_non_rustic_abis,
2022        rustc_peek,
2023        rustc_peek_liveness,
2024        rustc_peek_maybe_init,
2025        rustc_peek_maybe_uninit,
2026        rustc_preserve_ub_checks,
2027        rustc_private,
2028        rustc_proc_macro_decls,
2029        rustc_promotable,
2030        rustc_pub_transparent,
2031        rustc_reallocator,
2032        rustc_regions,
2033        rustc_reservation_impl,
2034        rustc_scalable_vector,
2035        rustc_serialize,
2036        rustc_should_not_be_called_on_const_items,
2037        rustc_simd_monomorphize_lane_limit,
2038        rustc_skip_during_method_dispatch,
2039        rustc_specialization_trait,
2040        rustc_std_internal_symbol,
2041        rustc_strict_coherence,
2042        rustc_symbol_name,
2043        rustc_test_marker,
2044        rustc_then_this_would_need,
2045        rustc_trivial_field_reads,
2046        rustc_unsafe_specialization_marker,
2047        rustc_variance,
2048        rustc_variance_of_opaques,
2049        rustdoc,
2050        rustdoc_internals,
2051        rustdoc_missing_doc_code_examples,
2052        rustfmt,
2053        rvalue_static_promotion,
2054        rwpi,
2055        s,
2056        s390x,
2057        s390x_target_feature,
2058        s390x_target_feature_vector,
2059        safety,
2060        sanitize,
2061        sanitizer_cfi_generalize_pointers,
2062        sanitizer_cfi_normalize_integers,
2063        sanitizer_runtime,
2064        saturating_add,
2065        saturating_div,
2066        saturating_sub,
2067        sdylib,
2068        search_unbox,
2069        select_unpredictable,
2070        self_in_typedefs,
2071        self_struct_ctor,
2072        semiopaque,
2073        sha2,
2074        sha3,
2075        sha512_sm_x86,
2076        shadow_call_stack,
2077        shallow,
2078        shl,
2079        shl_assign,
2080        shorter_tail_lifetimes,
2081        should_panic,
2082        show,
2083        shr,
2084        shr_assign,
2085        sig_dfl,
2086        sig_ign,
2087        signed,
2088        simd,
2089        simd_add,
2090        simd_and,
2091        simd_arith_offset,
2092        simd_as,
2093        simd_bitmask,
2094        simd_bitreverse,
2095        simd_bswap,
2096        simd_cast,
2097        simd_cast_ptr,
2098        simd_ceil,
2099        simd_ctlz,
2100        simd_ctpop,
2101        simd_cttz,
2102        simd_div,
2103        simd_eq,
2104        simd_expose_provenance,
2105        simd_extract,
2106        simd_extract_dyn,
2107        simd_fabs,
2108        simd_fcos,
2109        simd_fexp,
2110        simd_fexp2,
2111        simd_ffi,
2112        simd_flog,
2113        simd_flog2,
2114        simd_flog10,
2115        simd_floor,
2116        simd_fma,
2117        simd_fmax,
2118        simd_fmin,
2119        simd_fsin,
2120        simd_fsqrt,
2121        simd_funnel_shl,
2122        simd_funnel_shr,
2123        simd_gather,
2124        simd_ge,
2125        simd_gt,
2126        simd_insert,
2127        simd_insert_dyn,
2128        simd_le,
2129        simd_lt,
2130        simd_masked_load,
2131        simd_masked_store,
2132        simd_mul,
2133        simd_ne,
2134        simd_neg,
2135        simd_or,
2136        simd_reduce_add_ordered,
2137        simd_reduce_add_unordered,
2138        simd_reduce_all,
2139        simd_reduce_and,
2140        simd_reduce_any,
2141        simd_reduce_max,
2142        simd_reduce_min,
2143        simd_reduce_mul_ordered,
2144        simd_reduce_mul_unordered,
2145        simd_reduce_or,
2146        simd_reduce_xor,
2147        simd_relaxed_fma,
2148        simd_rem,
2149        simd_round,
2150        simd_round_ties_even,
2151        simd_saturating_add,
2152        simd_saturating_sub,
2153        simd_scatter,
2154        simd_select,
2155        simd_select_bitmask,
2156        simd_shl,
2157        simd_shr,
2158        simd_shuffle,
2159        simd_shuffle_const_generic,
2160        simd_splat,
2161        simd_sub,
2162        simd_trunc,
2163        simd_with_exposed_provenance,
2164        simd_xor,
2165        since,
2166        sinf16,
2167        sinf32,
2168        sinf64,
2169        sinf128,
2170        size,
2171        size_of,
2172        size_of_val,
2173        sized,
2174        sized_hierarchy,
2175        skip,
2176        slice,
2177        slice_from_raw_parts,
2178        slice_from_raw_parts_mut,
2179        slice_from_ref,
2180        slice_get_unchecked,
2181        slice_into_vec,
2182        slice_iter,
2183        slice_len_fn,
2184        slice_patterns,
2185        slicing_syntax,
2186        soft,
2187        sparc,
2188        sparc64,
2189        sparc_target_feature,
2190        spe_acc,
2191        specialization,
2192        speed,
2193        spirv,
2194        spotlight,
2195        sqrtf16,
2196        sqrtf32,
2197        sqrtf64,
2198        sqrtf128,
2199        sreg,
2200        sreg_low16,
2201        sse,
2202        sse2,
2203        sse4a_target_feature,
2204        stable,
2205        staged_api,
2206        start,
2207        state,
2208        static_align,
2209        static_in_const,
2210        static_nobundle,
2211        static_recursion,
2212        staticlib,
2213        std,
2214        std_lib_injection,
2215        std_panic,
2216        std_panic_2015_macro,
2217        std_panic_macro,
2218        stmt,
2219        stmt_expr_attributes,
2220        stop_after_dataflow,
2221        store,
2222        str,
2223        str_chars,
2224        str_ends_with,
2225        str_from_utf8,
2226        str_from_utf8_mut,
2227        str_from_utf8_unchecked,
2228        str_from_utf8_unchecked_mut,
2229        str_inherent_from_utf8,
2230        str_inherent_from_utf8_mut,
2231        str_inherent_from_utf8_unchecked,
2232        str_inherent_from_utf8_unchecked_mut,
2233        str_len,
2234        str_split_whitespace,
2235        str_starts_with,
2236        str_trim,
2237        str_trim_end,
2238        str_trim_start,
2239        strict_provenance_lints,
2240        string_as_mut_str,
2241        string_as_str,
2242        string_deref_patterns,
2243        string_from_utf8,
2244        string_insert_str,
2245        string_new,
2246        string_push_str,
2247        stringify,
2248        struct_field_attributes,
2249        struct_inherit,
2250        struct_variant,
2251        structural_match,
2252        structural_peq,
2253        sub,
2254        sub_assign,
2255        sub_with_overflow,
2256        suggestion,
2257        super_let,
2258        supertrait_item_shadowing,
2259        sym,
2260        sync,
2261        synthetic,
2262        sys_mutex_lock,
2263        sys_mutex_try_lock,
2264        sys_mutex_unlock,
2265        t32,
2266        target,
2267        target_abi,
2268        target_arch,
2269        target_endian,
2270        target_env,
2271        target_family,
2272        target_feature,
2273        target_feature_11,
2274        target_feature_inline_always,
2275        target_has_atomic,
2276        target_has_atomic_equal_alignment,
2277        target_has_atomic_load_store,
2278        target_has_reliable_f16,
2279        target_has_reliable_f16_math,
2280        target_has_reliable_f128,
2281        target_has_reliable_f128_math,
2282        target_os,
2283        target_pointer_width,
2284        target_thread_local,
2285        target_vendor,
2286        tbm_target_feature,
2287        termination,
2288        termination_trait,
2289        termination_trait_test,
2290        test,
2291        test_2018_feature,
2292        test_accepted_feature,
2293        test_case,
2294        test_removed_feature,
2295        test_runner,
2296        test_unstable_lint,
2297        thread,
2298        thread_local,
2299        thread_local_macro,
2300        three_way_compare,
2301        thumb2,
2302        thumb_mode: "thumb-mode",
2303        tmm_reg,
2304        to_owned_method,
2305        to_string,
2306        to_string_method,
2307        to_vec,
2308        todo_macro,
2309        tool_attributes,
2310        tool_lints,
2311        trace_macros,
2312        track_caller,
2313        trait_alias,
2314        trait_ty,
2315        trait_upcasting,
2316        transmute,
2317        transmute_generic_consts,
2318        transmute_opts,
2319        transmute_trait,
2320        transmute_unchecked,
2321        transparent,
2322        transparent_enums,
2323        transparent_unions,
2324        trivial_bounds,
2325        trivial_clone,
2326        truncf16,
2327        truncf32,
2328        truncf64,
2329        truncf128,
2330        try_blocks,
2331        try_blocks_heterogeneous,
2332        try_capture,
2333        try_from,
2334        try_from_fn,
2335        try_into,
2336        try_trait_v2,
2337        try_trait_v2_residual,
2338        try_update,
2339        tt,
2340        tuple,
2341        tuple_indexing,
2342        tuple_trait,
2343        two_phase,
2344        ty,
2345        type_alias_enum_variants,
2346        type_alias_impl_trait,
2347        type_ascribe,
2348        type_ascription,
2349        type_changing_struct_update,
2350        type_id,
2351        type_id_eq,
2352        type_info,
2353        type_ir,
2354        type_ir_infer_ctxt_like,
2355        type_ir_inherent,
2356        type_ir_interner,
2357        type_length_limit,
2358        type_macros,
2359        type_name,
2360        type_of,
2361        type_privacy_lints,
2362        typed_swap_nonoverlapping,
2363        u8,
2364        u8_legacy_const_max,
2365        u8_legacy_const_min,
2366        u8_legacy_fn_max_value,
2367        u8_legacy_fn_min_value,
2368        u8_legacy_mod,
2369        u16,
2370        u16_legacy_const_max,
2371        u16_legacy_const_min,
2372        u16_legacy_fn_max_value,
2373        u16_legacy_fn_min_value,
2374        u16_legacy_mod,
2375        u32,
2376        u32_legacy_const_max,
2377        u32_legacy_const_min,
2378        u32_legacy_fn_max_value,
2379        u32_legacy_fn_min_value,
2380        u32_legacy_mod,
2381        u64,
2382        u64_legacy_const_max,
2383        u64_legacy_const_min,
2384        u64_legacy_fn_max_value,
2385        u64_legacy_fn_min_value,
2386        u64_legacy_mod,
2387        u128,
2388        u128_legacy_const_max,
2389        u128_legacy_const_min,
2390        u128_legacy_fn_max_value,
2391        u128_legacy_fn_min_value,
2392        u128_legacy_mod,
2393        ub_checks,
2394        unaligned_volatile_load,
2395        unaligned_volatile_store,
2396        unboxed_closures,
2397        unchecked_add,
2398        unchecked_div,
2399        unchecked_funnel_shl,
2400        unchecked_funnel_shr,
2401        unchecked_mul,
2402        unchecked_rem,
2403        unchecked_shl,
2404        unchecked_shr,
2405        unchecked_sub,
2406        undecorated,
2407        underscore_const_names,
2408        underscore_imports,
2409        underscore_lifetimes,
2410        uniform_paths,
2411        unimplemented_macro,
2412        unit,
2413        universal_impl_trait,
2414        unix,
2415        unlikely,
2416        unmarked_api,
2417        unnamed_fields,
2418        unpin,
2419        unqualified_local_imports,
2420        unreachable,
2421        unreachable_2015,
2422        unreachable_2015_macro,
2423        unreachable_2021,
2424        unreachable_code,
2425        unreachable_display,
2426        unreachable_macro,
2427        unrestricted_attribute_tokens,
2428        unsafe_attributes,
2429        unsafe_binders,
2430        unsafe_block_in_unsafe_fn,
2431        unsafe_cell,
2432        unsafe_cell_raw_get,
2433        unsafe_eii,
2434        unsafe_extern_blocks,
2435        unsafe_fields,
2436        unsafe_no_drop_flag,
2437        unsafe_pinned,
2438        unsafe_unpin,
2439        unsize,
2440        unsized_const_param_ty,
2441        unsized_const_params,
2442        unsized_fn_params,
2443        unsized_locals,
2444        unsized_tuple_coercion,
2445        unstable,
2446        unstable_feature_bound,
2447        unstable_location_reason_default: "this crate is being loaded from the sysroot, an \
2448                          unstable location; did you mean to load this crate \
2449                          from crates.io via `Cargo.toml` instead?",
2450        untagged_unions,
2451        unused_imports,
2452        unwind,
2453        unwind_attributes,
2454        unwind_safe_trait,
2455        unwrap,
2456        unwrap_binder,
2457        unwrap_or,
2458        update,
2459        use_cloned,
2460        use_extern_macros,
2461        use_nested_groups,
2462        used,
2463        used_with_arg,
2464        using,
2465        usize,
2466        usize_legacy_const_max,
2467        usize_legacy_const_min,
2468        usize_legacy_fn_max_value,
2469        usize_legacy_fn_min_value,
2470        usize_legacy_mod,
2471        v1,
2472        v8plus,
2473        va_arg,
2474        va_copy,
2475        va_end,
2476        va_list,
2477        va_start,
2478        val,
2479        validity,
2480        value,
2481        values,
2482        var,
2483        variant_count,
2484        variants,
2485        vec,
2486        vec_as_mut_slice,
2487        vec_as_slice,
2488        vec_from_elem,
2489        vec_is_empty,
2490        vec_macro,
2491        vec_new,
2492        vec_pop,
2493        vec_reserve,
2494        vec_with_capacity,
2495        vecdeque_iter,
2496        vecdeque_reserve,
2497        vector,
2498        verbatim,
2499        version,
2500        vfp2,
2501        vis,
2502        visible_private_types,
2503        volatile,
2504        volatile_copy_memory,
2505        volatile_copy_nonoverlapping_memory,
2506        volatile_load,
2507        volatile_set_memory,
2508        volatile_store,
2509        vreg,
2510        vreg_low16,
2511        vsreg,
2512        vsx,
2513        vtable_align,
2514        vtable_for,
2515        vtable_size,
2516        warn,
2517        wasip2,
2518        wasm32,
2519        wasm64,
2520        wasm_abi,
2521        wasm_import_module,
2522        wasm_target_feature,
2523        weak,
2524        weak_odr,
2525        where_clause_attrs,
2526        while_let,
2527        whole_dash_archive: "whole-archive",
2528        width,
2529        windows,
2530        windows_subsystem,
2531        with_negative_coherence,
2532        wrap_binder,
2533        wrapping_add,
2534        wrapping_div,
2535        wrapping_mul,
2536        wrapping_rem,
2537        wrapping_rem_euclid,
2538        wrapping_sub,
2539        wreg,
2540        write_bytes,
2541        write_fmt,
2542        write_macro,
2543        write_str,
2544        write_via_move,
2545        writeln_macro,
2546        x86,
2547        x86_64,
2548        x86_amx_intrinsics,
2549        x87_reg,
2550        x87_target_feature,
2551        xer,
2552        xmm_reg,
2553        xop_target_feature,
2554        xtensa,
2555        yeet_desugar_details,
2556        yeet_expr,
2557        yes,
2558        yield_expr,
2559        ymm_reg,
2560        yreg,
2561        zca,
2562        zfh,
2563        zfhmin,
2564        zmm_reg,
2565        ztso,
2566        // tidy-alphabetical-end
2567    }
2568}
2569
2570/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2571/// `proc_macro`.
2572pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2573
2574#[derive(#[automatically_derived]
impl ::core::marker::Copy for Ident { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Ident {
    #[inline]
    fn clone(&self) -> Ident {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::Eq for Ident {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for Ident where __CTX: crate::HashStableContext {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    Ident { name: ref __binding_0, span: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_Generic, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Ident {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    Ident { name: ref __binding_0, span: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Ident {
            fn decode(__decoder: &mut __D) -> Self {
                Ident {
                    name: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable)]
2575pub struct Ident {
2576    /// `name` should never be the empty symbol. If you are considering that,
2577    /// you are probably conflating "empty identifier with "no identifier" and
2578    /// you should use `Option<Ident>` instead.
2579    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2580    pub name: Symbol,
2581    pub span: Span,
2582}
2583
2584impl Ident {
2585    #[inline]
2586    /// Constructs a new identifier from a symbol and a span.
2587    pub fn new(name: Symbol, span: Span) -> Ident {
2588        if true {
    match (&name, &sym::empty) {
        (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);
            }
        }
    };
};debug_assert_ne!(name, sym::empty);
2589        Ident { name, span }
2590    }
2591
2592    /// Constructs a new identifier with a dummy span.
2593    #[inline]
2594    pub fn with_dummy_span(name: Symbol) -> Ident {
2595        Ident::new(name, DUMMY_SP)
2596    }
2597
2598    // For dummy identifiers that are never used and absolutely must be
2599    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2600    // makes it clear that it's intended as a dummy value, and is more likely
2601    // to be detected if it accidentally does get used.
2602    #[inline]
2603    pub fn dummy() -> Ident {
2604        Ident::with_dummy_span(sym::dummy)
2605    }
2606
2607    /// Maps a string to an identifier with a dummy span.
2608    pub fn from_str(string: &str) -> Ident {
2609        Ident::with_dummy_span(Symbol::intern(string))
2610    }
2611
2612    /// Maps a string and a span to an identifier.
2613    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2614        Ident::new(Symbol::intern(string), span)
2615    }
2616
2617    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2618    pub fn with_span_pos(self, span: Span) -> Ident {
2619        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2620    }
2621
2622    /// Creates a new ident with the same span and name with leading quote removed, if any.
2623    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2624    pub fn without_first_quote(self) -> Ident {
2625        self.as_str()
2626            .strip_prefix('\'')
2627            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2628    }
2629
2630    /// "Normalize" ident for use in comparisons using "item hygiene".
2631    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2632    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2633    /// different macro 2.0 macros.
2634    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2635    pub fn normalize_to_macros_2_0(self) -> Ident {
2636        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2637    }
2638
2639    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2640    /// Identifiers with same string value become same if they came from the same non-transparent
2641    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2642    /// non-transparent macros.
2643    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2644    #[inline]
2645    pub fn normalize_to_macro_rules(self) -> Ident {
2646        Ident::new(self.name, self.span.normalize_to_macro_rules())
2647    }
2648
2649    /// Access the underlying string. This is a slowish operation because it
2650    /// requires locking the symbol interner.
2651    ///
2652    /// Note that the lifetime of the return value is a lie. See
2653    /// `Symbol::as_str()` for details.
2654    pub fn as_str(&self) -> &str {
2655        self.name.as_str()
2656    }
2657}
2658
2659impl PartialEq for Ident {
2660    #[inline]
2661    fn eq(&self, rhs: &Self) -> bool {
2662        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2663    }
2664}
2665
2666impl Hash for Ident {
2667    fn hash<H: Hasher>(&self, state: &mut H) {
2668        self.name.hash(state);
2669        self.span.ctxt().hash(state);
2670    }
2671}
2672
2673impl fmt::Debug for Ident {
2674    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2675        fmt::Display::fmt(self, f)?;
2676        fmt::Debug::fmt(&self.span.ctxt(), f)
2677    }
2678}
2679
2680/// This implementation is supposed to be used in error messages, so it's expected to be identical
2681/// to printing the original identifier token written in source code (`token_to_string`),
2682/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2683impl fmt::Display for Ident {
2684    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2685        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2686    }
2687}
2688
2689pub enum IdentPrintMode {
2690    Normal,
2691    RawIdent,
2692    RawLifetime,
2693}
2694
2695/// The most general type to print identifiers.
2696///
2697/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2698/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2699/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2700/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2701/// hygiene data, most importantly name of the crate it refers to.
2702/// As a result we print `$crate` as `crate` if it refers to the local crate
2703/// and as `::other_crate_name` if it refers to some other crate.
2704/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2705/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2706/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2707/// done for a token stream or a single token.
2708pub struct IdentPrinter {
2709    symbol: Symbol,
2710    mode: IdentPrintMode,
2711    /// Span used for retrieving the crate name to which `$crate` refers to,
2712    /// if this field is `None` then the `$crate` conversion doesn't happen.
2713    convert_dollar_crate: Option<Span>,
2714}
2715
2716impl IdentPrinter {
2717    /// The most general `IdentPrinter` constructor. Do not use this.
2718    pub fn new(
2719        symbol: Symbol,
2720        mode: IdentPrintMode,
2721        convert_dollar_crate: Option<Span>,
2722    ) -> IdentPrinter {
2723        IdentPrinter { symbol, mode, convert_dollar_crate }
2724    }
2725
2726    /// This implementation is supposed to be used when printing identifiers
2727    /// as a part of pretty-printing for larger AST pieces.
2728    /// Do not use this either.
2729    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2730        IdentPrinter::new(ident.name, mode, Some(ident.span))
2731    }
2732}
2733
2734impl fmt::Display for IdentPrinter {
2735    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2736        let s = match self.mode {
2737            IdentPrintMode::Normal
2738                if self.symbol == kw::DollarCrate
2739                    && let Some(span) = self.convert_dollar_crate =>
2740            {
2741                let converted = span.ctxt().dollar_crate_name();
2742                if !converted.is_path_segment_keyword() {
2743                    f.write_str("::")?;
2744                }
2745                converted
2746            }
2747            IdentPrintMode::Normal => self.symbol,
2748            IdentPrintMode::RawIdent => {
2749                f.write_str("r#")?;
2750                self.symbol
2751            }
2752            IdentPrintMode::RawLifetime => {
2753                f.write_str("'r#")?;
2754                let s = self
2755                    .symbol
2756                    .as_str()
2757                    .strip_prefix("'")
2758                    .expect("only lifetime idents should be passed with RawLifetime mode");
2759                Symbol::intern(s)
2760            }
2761        };
2762        s.fmt(f)
2763    }
2764}
2765
2766/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2767/// construction for "local variable hygiene" comparisons.
2768///
2769/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2770/// This ensures compile-time safety and avoids manual normalization calls.
2771#[derive(#[automatically_derived]
impl ::core::marker::Copy for MacroRulesNormalizedIdent { }Copy, #[automatically_derived]
impl ::core::clone::Clone for MacroRulesNormalizedIdent {
    #[inline]
    fn clone(&self) -> MacroRulesNormalizedIdent {
        let _: ::core::clone::AssertParamIsClone<Ident>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::Eq for MacroRulesNormalizedIdent {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Ident>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialEq for MacroRulesNormalizedIdent {
    #[inline]
    fn eq(&self, other: &MacroRulesNormalizedIdent) -> bool {
        self.0 == other.0
    }
}PartialEq, #[automatically_derived]
impl ::core::hash::Hash for MacroRulesNormalizedIdent {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash)]
2772pub struct MacroRulesNormalizedIdent(Ident);
2773
2774impl MacroRulesNormalizedIdent {
2775    #[inline]
2776    pub fn new(ident: Ident) -> Self {
2777        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2778    }
2779}
2780
2781impl fmt::Debug for MacroRulesNormalizedIdent {
2782    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2783        fmt::Debug::fmt(&self.0, f)
2784    }
2785}
2786
2787impl fmt::Display for MacroRulesNormalizedIdent {
2788    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2789        fmt::Display::fmt(&self.0, f)
2790    }
2791}
2792
2793/// An interned UTF-8 string.
2794///
2795/// Internally, a `Symbol` is implemented as an index, and all operations
2796/// (including hashing, equality, and ordering) operate on that index. The use
2797/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2798/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2799///
2800/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2801/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2802#[derive(#[automatically_derived]
impl ::core::clone::Clone for Symbol {
    #[inline]
    fn clone(&self) -> Symbol {
        let _: ::core::clone::AssertParamIsClone<SymbolIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for Symbol { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for Symbol {
    #[inline]
    fn eq(&self, other: &Symbol) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Symbol {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<SymbolIndex>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Symbol {
    #[inline]
    fn partial_cmp(&self, other: &Symbol)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for Symbol {
    #[inline]
    fn cmp(&self, other: &Symbol) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&self.0, &other.0)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for Symbol {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash)]
2803pub struct Symbol(SymbolIndex);
2804
2805// Used within both `Symbol` and `ByteSymbol`.
2806impl ::std::fmt::Debug for SymbolIndex {
    fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        fmt.write_fmt(format_args!("{0}", self.as_u32()))
    }
}rustc_index::newtype_index! {
2807    #[orderable]
2808    struct SymbolIndex {}
2809}
2810
2811impl Symbol {
2812    /// Avoid this except for things like deserialization of previously
2813    /// serialized symbols, and testing. Use `intern` instead.
2814    pub const fn new(n: u32) -> Self {
2815        Symbol(SymbolIndex::from_u32(n))
2816    }
2817
2818    /// Maps a string to its interned representation.
2819    #[rustc_diagnostic_item = "SymbolIntern"]
2820    pub fn intern(str: &str) -> Self {
2821        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2822    }
2823
2824    /// Access the underlying string. This is a slowish operation because it
2825    /// requires locking the symbol interner.
2826    ///
2827    /// Note that the lifetime of the return value is a lie. It's not the same
2828    /// as `&self`, but actually tied to the lifetime of the underlying
2829    /// interner. Interners are long-lived, and there are very few of them, and
2830    /// this function is typically used for short-lived things, so in practice
2831    /// it works out ok.
2832    pub fn as_str(&self) -> &str {
2833        with_session_globals(|session_globals| unsafe {
2834            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2835        })
2836    }
2837
2838    pub fn as_u32(self) -> u32 {
2839        self.0.as_u32()
2840    }
2841
2842    pub fn is_empty(self) -> bool {
2843        self == sym::empty
2844    }
2845
2846    /// This method is supposed to be used in error messages, so it's expected to be
2847    /// identical to printing the original identifier token written in source code
2848    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2849    /// or edition, so we have to guess the rawness using the global edition.
2850    pub fn to_ident_string(self) -> String {
2851        // Avoid creating an empty identifier, because that asserts in debug builds.
2852        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2853    }
2854
2855    /// Checks if `self` is similar to any symbol in `candidates`.
2856    ///
2857    /// The returned boolean represents whether the candidate is the same symbol with a different
2858    /// casing.
2859    ///
2860    /// All the candidates are assumed to be lowercase.
2861    pub fn find_similar(
2862        self,
2863        candidates: &[Symbol],
2864    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2865        let lowercase = self.as_str().to_lowercase();
2866        let lowercase_sym = Symbol::intern(&lowercase);
2867        if candidates.contains(&lowercase_sym) {
2868            Some((lowercase_sym, true))
2869        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2870            Some((similar_sym, false))
2871        } else {
2872            None
2873        }
2874    }
2875}
2876
2877impl fmt::Debug for Symbol {
2878    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2879        fmt::Debug::fmt(self.as_str(), f)
2880    }
2881}
2882
2883impl fmt::Display for Symbol {
2884    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2885        fmt::Display::fmt(self.as_str(), f)
2886    }
2887}
2888
2889impl<CTX> HashStable<CTX> for Symbol {
2890    #[inline]
2891    fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
2892        self.as_str().hash_stable(hcx, hasher);
2893    }
2894}
2895
2896impl<CTX> ToStableHashKey<CTX> for Symbol {
2897    type KeyType = String;
2898    #[inline]
2899    fn to_stable_hash_key(&self, _: &CTX) -> String {
2900        self.as_str().to_string()
2901    }
2902}
2903
2904impl StableCompare for Symbol {
2905    const CAN_USE_UNSTABLE_SORT: bool = true;
2906
2907    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2908        self.as_str().cmp(other.as_str())
2909    }
2910}
2911
2912/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2913/// it has fewer operations defined than `Symbol`.
2914#[derive(#[automatically_derived]
impl ::core::clone::Clone for ByteSymbol {
    #[inline]
    fn clone(&self) -> ByteSymbol {
        let _: ::core::clone::AssertParamIsClone<SymbolIndex>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ByteSymbol { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for ByteSymbol {
    #[inline]
    fn eq(&self, other: &ByteSymbol) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ByteSymbol {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<SymbolIndex>;
    }
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for ByteSymbol {
    #[inline]
    fn partial_cmp(&self, other: &ByteSymbol)
        -> ::core::option::Option<::core::cmp::Ordering> {
        ::core::cmp::PartialOrd::partial_cmp(&self.0, &other.0)
    }
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for ByteSymbol {
    #[inline]
    fn cmp(&self, other: &ByteSymbol) -> ::core::cmp::Ordering {
        ::core::cmp::Ord::cmp(&self.0, &other.0)
    }
}Ord, #[automatically_derived]
impl ::core::hash::Hash for ByteSymbol {
    #[inline]
    fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
        ::core::hash::Hash::hash(&self.0, state)
    }
}Hash)]
2915pub struct ByteSymbol(SymbolIndex);
2916
2917impl ByteSymbol {
2918    /// Avoid this except for things like deserialization of previously
2919    /// serialized symbols, and testing. Use `intern` instead.
2920    pub const fn new(n: u32) -> Self {
2921        ByteSymbol(SymbolIndex::from_u32(n))
2922    }
2923
2924    /// Maps a string to its interned representation.
2925    pub fn intern(byte_str: &[u8]) -> Self {
2926        with_session_globals(|session_globals| {
2927            session_globals.symbol_interner.intern_byte_str(byte_str)
2928        })
2929    }
2930
2931    /// Like `Symbol::as_str`.
2932    pub fn as_byte_str(&self) -> &[u8] {
2933        with_session_globals(|session_globals| unsafe {
2934            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2935        })
2936    }
2937
2938    pub fn as_u32(self) -> u32 {
2939        self.0.as_u32()
2940    }
2941}
2942
2943impl fmt::Debug for ByteSymbol {
2944    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2945        fmt::Debug::fmt(self.as_byte_str(), f)
2946    }
2947}
2948
2949impl<CTX> HashStable<CTX> for ByteSymbol {
2950    #[inline]
2951    fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
2952        self.as_byte_str().hash_stable(hcx, hasher);
2953    }
2954}
2955
2956// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2957// string with identical contents (e.g. "foo" and b"foo") are both interned,
2958// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2959// will have the same index.
2960pub(crate) struct Interner(Lock<InternerInner>);
2961
2962// The `&'static [u8]`s in this type actually point into the arena.
2963//
2964// This type is private to prevent accidentally constructing more than one
2965// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2966// between `Interner`s.
2967struct InternerInner {
2968    arena: DroplessArena,
2969    byte_strs: FxIndexSet<&'static [u8]>,
2970}
2971
2972impl Interner {
2973    // These arguments are `&str`, but because of the sharing, we are
2974    // effectively pre-interning all these strings for both `Symbol` and
2975    // `ByteSymbol`.
2976    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2977        let byte_strs = FxIndexSet::from_iter(
2978            init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes()),
2979        );
2980
2981        // The order in which duplicates are reported is irrelevant.
2982        #[expect(rustc::potential_query_instability)]
2983        if byte_strs.len() != init.len() + extra.len() {
2984            {
    ::core::panicking::panic_fmt(format_args!("duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {0:?}",
            FxHashSet::intersection(&init.iter().copied().collect(),
                    &extra.iter().copied().collect()).collect::<Vec<_>>()));
}panic!(
2985                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2986                FxHashSet::intersection(
2987                    &init.iter().copied().collect(),
2988                    &extra.iter().copied().collect(),
2989                )
2990                .collect::<Vec<_>>()
2991            )
2992        }
2993
2994        Interner(Lock::new(InternerInner { arena: Default::default(), byte_strs }))
2995    }
2996
2997    fn intern_str(&self, str: &str) -> Symbol {
2998        Symbol::new(self.intern_inner(str.as_bytes()))
2999    }
3000
3001    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
3002        ByteSymbol::new(self.intern_inner(byte_str))
3003    }
3004
3005    #[inline]
3006    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
3007        let mut inner = self.0.lock();
3008        if let Some(idx) = inner.byte_strs.get_index_of(byte_str) {
3009            return idx as u32;
3010        }
3011
3012        let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
3013
3014        // SAFETY: we can extend the arena allocation to `'static` because we
3015        // only access these while the arena is still alive.
3016        let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
3017
3018        // This second hash table lookup can be avoided by using `RawEntryMut`,
3019        // but this code path isn't hot enough for it to be worth it. See
3020        // #91445 for details.
3021        let (idx, is_new) = inner.byte_strs.insert_full(byte_str);
3022        if true {
    if !is_new { ::core::panicking::panic("assertion failed: is_new") };
};debug_assert!(is_new); // due to the get_index_of check above
3023
3024        idx as u32
3025    }
3026
3027    /// Get the symbol as a string.
3028    ///
3029    /// [`Symbol::as_str()`] should be used in preference to this function.
3030    fn get_str(&self, symbol: Symbol) -> &str {
3031        let byte_str = self.get_inner(symbol.0.as_usize());
3032        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
3033        unsafe { str::from_utf8_unchecked(byte_str) }
3034    }
3035
3036    /// Get the symbol as a string.
3037    ///
3038    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
3039    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
3040        self.get_inner(symbol.0.as_usize())
3041    }
3042
3043    fn get_inner(&self, index: usize) -> &[u8] {
3044        self.0.lock().byte_strs.get_index(index).unwrap()
3045    }
3046}
3047
3048// This module has a very short name because it's used a lot.
3049/// This module contains all the defined keyword `Symbol`s.
3050///
3051/// Given that `kw` is imported, use them like `kw::keyword_name`.
3052/// For example `kw::Loop` or `kw::Break`.
3053pub mod kw {
3054    pub use super::kw_generated::*;
3055}
3056
3057// This module has a very short name because it's used a lot.
3058/// This module contains all the defined non-keyword `Symbol`s.
3059///
3060/// Given that `sym` is imported, use them like `sym::symbol_name`.
3061/// For example `sym::rustfmt` or `sym::u8`.
3062pub mod sym {
3063    // Used from a macro in `librustc_feature/accepted.rs`
3064    use super::Symbol;
3065    pub use super::kw::MacroRules as macro_rules;
3066    #[doc(inline)]
3067    pub use super::sym_generated::*;
3068
3069    /// Get the symbol for an integer.
3070    ///
3071    /// The first few non-negative integers each have a static symbol and therefore
3072    /// are fast.
3073    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
3074        if let Result::Ok(idx) = n.try_into() {
3075            if idx < 10 {
3076                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
3077            }
3078        }
3079        let mut buffer = itoa::Buffer::new();
3080        let printed = buffer.format(n);
3081        Symbol::intern(printed)
3082    }
3083}
3084
3085impl Symbol {
3086    fn is_special(self) -> bool {
3087        self <= kw::Underscore
3088    }
3089
3090    fn is_used_keyword_always(self) -> bool {
3091        self >= kw::As && self <= kw::While
3092    }
3093
3094    fn is_unused_keyword_always(self) -> bool {
3095        self >= kw::Abstract && self <= kw::Yield
3096    }
3097
3098    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
3099        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
3100    }
3101
3102    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
3103        self == kw::Gen && edition().at_least_rust_2024()
3104            || self == kw::Try && edition().at_least_rust_2018()
3105    }
3106
3107    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
3108        self.is_special()
3109            || self.is_used_keyword_always()
3110            || self.is_unused_keyword_always()
3111            || self.is_used_keyword_conditional(edition)
3112            || self.is_unused_keyword_conditional(edition)
3113    }
3114
3115    pub fn is_weak(self) -> bool {
3116        self >= kw::Auto && self <= kw::Yeet
3117    }
3118
3119    /// A keyword or reserved identifier that can be used as a path segment.
3120    pub fn is_path_segment_keyword(self) -> bool {
3121        self == kw::Super
3122            || self == kw::SelfLower
3123            || self == kw::SelfUpper
3124            || self == kw::Crate
3125            || self == kw::PathRoot
3126            || self == kw::DollarCrate
3127    }
3128
3129    /// Returns `true` if the symbol is `true` or `false`.
3130    pub fn is_bool_lit(self) -> bool {
3131        self == kw::True || self == kw::False
3132    }
3133
3134    /// Returns `true` if this symbol can be a raw identifier.
3135    pub fn can_be_raw(self) -> bool {
3136        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
3137    }
3138
3139    /// Was this symbol index predefined in the compiler's `symbols!` macro?
3140    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
3141    /// takes a `u32` argument instead of a `&self` argument. Use with care.
3142    pub fn is_predefined(index: u32) -> bool {
3143        index < PREDEFINED_SYMBOLS_COUNT
3144    }
3145}
3146
3147impl Ident {
3148    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
3149    /// unnamed method parameters, crate root module, error recovery etc.
3150    pub fn is_special(self) -> bool {
3151        self.name.is_special()
3152    }
3153
3154    /// Returns `true` if the token is a keyword used in the language.
3155    pub fn is_used_keyword(self) -> bool {
3156        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3157        self.name.is_used_keyword_always()
3158            || self.name.is_used_keyword_conditional(|| self.span.edition())
3159    }
3160
3161    /// Returns `true` if the token is a keyword reserved for possible future use.
3162    pub fn is_unused_keyword(self) -> bool {
3163        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3164        self.name.is_unused_keyword_always()
3165            || self.name.is_unused_keyword_conditional(|| self.span.edition())
3166    }
3167
3168    /// Returns `true` if the token is either a special identifier or a keyword.
3169    pub fn is_reserved(self) -> bool {
3170        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3171        self.name.is_reserved(|| self.span.edition())
3172    }
3173
3174    /// A keyword or reserved identifier that can be used as a path segment.
3175    pub fn is_path_segment_keyword(self) -> bool {
3176        self.name.is_path_segment_keyword()
3177    }
3178
3179    /// We see this identifier in a normal identifier position, like variable name or a type.
3180    /// How was it written originally? Did it use the raw form? Let's try to guess.
3181    pub fn is_raw_guess(self) -> bool {
3182        self.name.can_be_raw() && self.is_reserved()
3183    }
3184
3185    /// Given the name of a lifetime without the first quote (`'`),
3186    /// returns whether the lifetime name is reserved (therefore invalid)
3187    pub fn is_reserved_lifetime(self) -> bool {
3188        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
3189    }
3190
3191    pub fn is_raw_lifetime_guess(self) -> bool {
3192        // Check that the name isn't just a single quote.
3193        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
3194        if self.name.as_str() == "'" {
3195            return false;
3196        }
3197        let ident_without_apostrophe = self.without_first_quote();
3198        ident_without_apostrophe.name != self.name
3199            && ident_without_apostrophe.name.can_be_raw()
3200            && ident_without_apostrophe.is_reserved_lifetime()
3201    }
3202
3203    pub fn guess_print_mode(self) -> IdentPrintMode {
3204        if self.is_raw_lifetime_guess() {
3205            IdentPrintMode::RawLifetime
3206        } else if self.is_raw_guess() {
3207            IdentPrintMode::RawIdent
3208        } else {
3209            IdentPrintMode::Normal
3210        }
3211    }
3212
3213    /// Whether this would be the identifier for a tuple field like `self.0`, as
3214    /// opposed to a named field like `self.thing`.
3215    pub fn is_numeric(self) -> bool {
3216        self.as_str().bytes().all(|b| b.is_ascii_digit())
3217    }
3218}
3219
3220/// Collect all the keywords in a given edition into a vector.
3221///
3222/// *Note:* Please update this if a new keyword is added beyond the current
3223/// range.
3224pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
3225    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
3226        .filter_map(|kw| {
3227            let kw = Symbol::new(kw);
3228            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
3229                Some(kw)
3230            } else {
3231                None
3232            }
3233        })
3234        .collect()
3235}