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