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