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", "dbg_macro", "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-beta.3"], 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        dbg_macro,
752        dead_code,
753        dealloc,
754        debug,
755        debug_assert_eq_macro,
756        debug_assert_macro,
757        debug_assert_ne_macro,
758        debug_assertions,
759        debug_struct_fields_finish,
760        debug_tuple_fields_finish,
761        debugger_visualizer,
762        decl_macro,
763        declare_lint_pass,
764        decorated,
765        default_alloc_error_handler,
766        default_field_values,
767        default_fn,
768        default_lib_allocator,
769        default_method_body_is_const,
770        // --------------------------
771        // Lang items which are used only for experiments with auto traits with default bounds.
772        // These lang items are not actually defined in core/std. Experiment is a part of
773        // `MCP: Low level components for async drop`(https://github.com/rust-lang/compiler-team/issues/727)
774        default_trait1,
775        default_trait2,
776        default_trait3,
777        default_trait4,
778        // --------------------------
779        default_type_parameter_fallback,
780        default_type_params,
781        define_opaque,
782        deny,
783        deprecated,
784        deprecated_safe,
785        deprecated_suggestion,
786        deref,
787        deref_method,
788        deref_mut,
789        deref_patterns,
790        deref_pure,
791        deref_target,
792        derive,
793        derive_const,
794        derive_const_issue: "118304",
795        derive_default_enum,
796        derive_from,
797        derive_smart_pointer,
798        destruct,
799        destructuring_assignment,
800        diagnostic,
801        diagnostic_namespace,
802        diagnostic_on_const,
803        diagnostic_on_move,
804        diagnostic_on_unknown,
805        dialect,
806        direct,
807        discriminant_kind,
808        discriminant_type,
809        discriminant_value,
810        disjoint_bitor,
811        dispatch_from_dyn,
812        div,
813        div_assign,
814        diverging_block_default,
815        dl,
816        do_not_recommend,
817        doc,
818        doc_alias,
819        doc_auto_cfg,
820        doc_cfg,
821        doc_cfg_hide,
822        doc_keyword,
823        doc_masked,
824        doc_notable_trait,
825        doc_primitive,
826        doc_spotlight,
827        doctest,
828        dotdot_in_tuple_patterns,
829        dotdoteq_in_patterns,
830        dreg,
831        dreg_low8,
832        dreg_low16,
833        drop,
834        drop_in_place,
835        drop_types_in_const,
836        dropck_eyepatch,
837        dropck_parametricity,
838        dummy: "<!dummy!>", // use this instead of `sym::empty` for symbols that won't be used
839        dummy_cgu_name,
840        dylib,
841        dyn_compatible_for_dispatch,
842        dyn_metadata,
843        dyn_star,
844        dyn_trait,
845        dynamic_no_pic: "dynamic-no-pic",
846        edition_panic,
847        effective_target_features,
848        effects,
849        eh_catch_typeinfo,
850        eh_personality,
851        eii,
852        eii_declaration,
853        eii_internals,
854        eii_shared_macro,
855        element_ty,
856        // Notes about `sym::empty`:
857        // - It should only be used when it genuinely means "empty symbol". Use
858        //   `Option<Symbol>` when "no symbol" is a possibility.
859        // - For dummy symbols that are never used and absolutely must be
860        //   present, it's better to use `sym::dummy` than `sym::empty`, because
861        //   it's clearer that it's intended as a dummy value, and more likely
862        //   to be detected if it accidentally does get used.
863        empty: "",
864        empty_braces: "{}",
865        emscripten_wasm_eh,
866        enable,
867        end,
868        entry_nops,
869        env,
870        env_CFG_RELEASE: env!("CFG_RELEASE"),
871        eq,
872        ergonomic_clones,
873        ermsb_target_feature,
874        exact_div,
875        except,
876        exception_handling: "exception-handling",
877        exclusive_range_pattern,
878        exhaustive_integer_patterns,
879        exhaustive_patterns,
880        existential_type,
881        exp2f16,
882        exp2f32,
883        exp2f64,
884        exp2f128,
885        expect,
886        expected,
887        expf16,
888        expf32,
889        expf64,
890        expf128,
891        explicit_extern_abis,
892        explicit_generic_args_with_impl_trait,
893        explicit_tail_calls,
894        export_name,
895        export_stable,
896        export_symbols: "export-symbols",
897        expr,
898        expr_2021,
899        expr_fragment_specifier_2024,
900        extended_key_value_attributes,
901        extended_varargs_abi_support,
902        extern_absolute_paths,
903        extern_crate_item_prelude,
904        extern_crate_self,
905        extern_in_paths,
906        extern_item_impls,
907        extern_prelude,
908        extern_system_varargs,
909        extern_types,
910        extern_weak,
911        external,
912        external_doc,
913        f16,
914        f16_nan,
915        f16c_target_feature,
916        f32,
917        f32_nan,
918        f64,
919        f64_nan,
920        f128,
921        f128_nan,
922        fabs,
923        fadd_algebraic,
924        fadd_fast,
925        fake_variadic,
926        fallback,
927        fdiv_algebraic,
928        fdiv_fast,
929        feature,
930        fence,
931        ferris: "🦀",
932        fetch_update,
933        ffi_const,
934        ffi_pure,
935        ffi_returns_twice,
936        field,
937        field_base,
938        field_init_shorthand,
939        field_of,
940        field_offset,
941        field_projections,
942        field_representing_type,
943        field_representing_type_raw,
944        field_type,
945        fields,
946        file,
947        final_associated_functions,
948        float_to_int_unchecked,
949        floorf16,
950        floorf32,
951        floorf64,
952        floorf128,
953        fmaf16,
954        fmaf32,
955        fmaf64,
956        fmaf128,
957        fmt,
958        fmt_debug,
959        fmul_algebraic,
960        fmul_fast,
961        fmuladdf16,
962        fmuladdf32,
963        fmuladdf64,
964        fmuladdf128,
965        fn_align,
966        fn_body,
967        fn_delegation,
968        fn_must_use,
969        fn_mut,
970        fn_once,
971        fn_once_output,
972        fn_ptr_addr,
973        fn_ptr_trait,
974        forbid,
975        force_target_feature,
976        forget,
977        format_args,
978        format_args_capture,
979        format_args_nl,
980        format_argument,
981        format_arguments,
982        format_macro,
983        framework,
984        freeze,
985        freeze_impls,
986        freg,
987        frem_algebraic,
988        frem_fast,
989        from,
990        from_desugaring,
991        from_iter,
992        from_output,
993        from_residual,
994        from_size_align_unchecked,
995        from_size_alignment_unchecked,
996        from_str,
997        from_str_nonconst,
998        from_usize,
999        from_yeet,
1000        frontmatter,
1001        fsub_algebraic,
1002        fsub_fast,
1003        full,
1004        fundamental,
1005        fused_iterator,
1006        future_output,
1007        future_trait,
1008        fxsr,
1009        gdb_script_file,
1010        ge,
1011        gen_blocks,
1012        gen_future,
1013        generator_clone,
1014        generators,
1015        generic_arg_infer,
1016        generic_assert,
1017        generic_associated_types,
1018        generic_associated_types_extended,
1019        generic_const_args,
1020        generic_const_exprs,
1021        generic_const_items,
1022        generic_const_parameter_types,
1023        generic_param_attrs,
1024        generic_pattern_types,
1025        generics,
1026        get_context,
1027        global_alloc_ty,
1028        global_allocator,
1029        global_asm,
1030        global_registration,
1031        globs,
1032        gt,
1033        guard,
1034        guard_patterns,
1035        half_open_range_patterns,
1036        half_open_range_patterns_in_slices,
1037        hash,
1038        hexagon,
1039        hexagon_target_feature,
1040        hidden,
1041        hide,
1042        homogeneous_aggregate,
1043        html_favicon_url,
1044        html_logo_url,
1045        html_no_source,
1046        html_playground_url,
1047        html_root_url,
1048        hvx,
1049        hvx_length64b: "hvx-length64b",
1050        hvx_length128b: "hvx-length128b",
1051        hwaddress,
1052        i8,
1053        i16,
1054        i32,
1055        i64,
1056        i128,
1057        i128_type,
1058        ident,
1059        if_let,
1060        if_let_guard,
1061        if_let_rescope,
1062        if_while_or_patterns,
1063        ignore,
1064        immediate_abort: "immediate-abort",
1065        impl_header_lifetime_elision,
1066        impl_lint_pass,
1067        impl_restriction,
1068        impl_trait_in_assoc_type,
1069        impl_trait_in_bindings,
1070        impl_trait_in_fn_trait_return,
1071        impl_trait_projections,
1072        implied_by,
1073        import,
1074        import_name_type,
1075        import_shadowing,
1076        import_trait_associated_functions,
1077        imported_main,
1078        in_band_lifetimes,
1079        include,
1080        include_bytes,
1081        include_str,
1082        inclusive_range_syntax,
1083        incomplete_features,
1084        index,
1085        index_mut,
1086        infer_outlives_requirements,
1087        infer_static_outlives_requirements,
1088        inherent_associated_types,
1089        initial,
1090        inlateout,
1091        inline,
1092        inline_const,
1093        inline_const_pat,
1094        inout,
1095        inputs,
1096        instruction_set,
1097        integer_: "integer", // underscore to avoid clashing with the function `sym::integer` below
1098        integral,
1099        internal,
1100        internal_eq_trait_method_impls,
1101        internal_features,
1102        into_async_iter_into_iter,
1103        into_future,
1104        into_iter,
1105        into_try_type,
1106        intra_doc_pointers,
1107        intrinsics,
1108        irrefutable_let_patterns,
1109        is,
1110        is_auto,
1111        is_val_statically_known,
1112        isa_attribute,
1113        isize,
1114        issue,
1115        issue_5723_bootstrap,
1116        issue_tracker_base_url,
1117        item,
1118        item_like_imports,
1119        iter,
1120        iter_mut,
1121        iterator,
1122        iterator_collect_fn,
1123        kcfi,
1124        kernel_address,
1125        kernel_hwaddress,
1126        keylocker_x86,
1127        keyword,
1128        kind,
1129        kreg,
1130        kreg0,
1131        label,
1132        label_break_value,
1133        lahfsahf_target_feature,
1134        lang,
1135        lang_items,
1136        large_assignments,
1137        last,
1138        lateout,
1139        lazy_normalization_consts,
1140        lazy_type_alias,
1141        le,
1142        legacy_receiver,
1143        len,
1144        let_chains,
1145        let_else,
1146        lhs,
1147        lib,
1148        libc,
1149        lifetime,
1150        lifetime_capture_rules_2024,
1151        lifetimes,
1152        line,
1153        link,
1154        link_arg_attribute,
1155        link_args,
1156        link_cfg,
1157        link_dash_arg: "link-arg",
1158        link_llvm_intrinsics,
1159        link_name,
1160        link_ordinal,
1161        link_section,
1162        linkage,
1163        linker,
1164        linker_info,
1165        linker_messages,
1166        linkonce,
1167        linkonce_odr,
1168        lint_reasons,
1169        literal,
1170        load,
1171        loaded_from_disk,
1172        local,
1173        local_inner_macros,
1174        log2f16,
1175        log2f32,
1176        log2f64,
1177        log2f128,
1178        log10f16,
1179        log10f32,
1180        log10f64,
1181        log10f128,
1182        log_syntax,
1183        logf16,
1184        logf32,
1185        logf64,
1186        logf128,
1187        loongarch32,
1188        loongarch64,
1189        loongarch_target_feature,
1190        loop_break_value,
1191        loop_match,
1192        lr,
1193        lt,
1194        m68k,
1195        m68k_target_feature,
1196        macro_at_most_once_rep,
1197        macro_attr,
1198        macro_attributes_in_derive_output,
1199        macro_derive,
1200        macro_escape,
1201        macro_export,
1202        macro_guard_matcher,
1203        macro_lifetime_matcher,
1204        macro_literal_matcher,
1205        macro_metavar_expr,
1206        macro_metavar_expr_concat,
1207        macro_reexport,
1208        macro_use,
1209        macro_vis_matcher,
1210        macros_in_extern,
1211        main,
1212        managed_boxes,
1213        manually_drop,
1214        map,
1215        map_err,
1216        marker,
1217        marker_trait_attr,
1218        masked,
1219        match_beginning_vert,
1220        match_default_bindings,
1221        maximum_number_nsz_f16,
1222        maximum_number_nsz_f32,
1223        maximum_number_nsz_f64,
1224        maximum_number_nsz_f128,
1225        maximumf16,
1226        maximumf32,
1227        maximumf64,
1228        maximumf128,
1229        may_dangle,
1230        may_unwind,
1231        maybe_dangling,
1232        maybe_uninit,
1233        maybe_uninit_uninit,
1234        maybe_uninit_zeroed,
1235        mem,
1236        mem_align_const,
1237        mem_discriminant,
1238        mem_drop,
1239        mem_forget,
1240        mem_size_const,
1241        mem_swap,
1242        mem_uninitialized,
1243        mem_variant_count,
1244        mem_zeroed,
1245        member_constraints,
1246        memory,
1247        memtag,
1248        message,
1249        meta,
1250        meta_sized,
1251        metadata_type,
1252        mgca_type_const_syntax,
1253        min_adt_const_params,
1254        min_const_fn,
1255        min_const_generics,
1256        min_const_unsafe_fn,
1257        min_exhaustive_patterns,
1258        min_generic_const_args,
1259        min_specialization,
1260        min_type_alias_impl_trait,
1261        minimum_number_nsz_f16,
1262        minimum_number_nsz_f32,
1263        minimum_number_nsz_f64,
1264        minimum_number_nsz_f128,
1265        minimumf16,
1266        minimumf32,
1267        minimumf64,
1268        minimumf128,
1269        mips,
1270        mips32r6,
1271        mips64,
1272        mips64r6,
1273        mips_target_feature,
1274        mir_assume,
1275        mir_basic_block,
1276        mir_call,
1277        mir_cast_ptr_to_ptr,
1278        mir_cast_transmute,
1279        mir_cast_unsize,
1280        mir_checked,
1281        mir_debuginfo,
1282        mir_discriminant,
1283        mir_drop,
1284        mir_field,
1285        mir_goto,
1286        mir_make_place,
1287        mir_move,
1288        mir_offset,
1289        mir_ptr_metadata,
1290        mir_retag,
1291        mir_return,
1292        mir_return_to,
1293        mir_set_discriminant,
1294        mir_static,
1295        mir_static_mut,
1296        mir_storage_dead,
1297        mir_storage_live,
1298        mir_tail_call,
1299        mir_unreachable,
1300        mir_unwind_cleanup,
1301        mir_unwind_continue,
1302        mir_unwind_resume,
1303        mir_unwind_terminate,
1304        mir_unwind_terminate_reason,
1305        mir_unwind_unreachable,
1306        mir_variant,
1307        miri,
1308        mmx_reg,
1309        modifiers,
1310        module,
1311        module_path,
1312        more_maybe_bounds,
1313        more_qualified_paths,
1314        more_struct_aliases,
1315        movbe_target_feature,
1316        move_ref_pattern,
1317        move_size_limit,
1318        movrs_target_feature,
1319        msp430,
1320        mul,
1321        mul_assign,
1322        mul_with_overflow,
1323        multiple_supertrait_upcastable,
1324        must_not_suspend,
1325        must_use,
1326        mut_preserve_binding_mode_2024,
1327        mut_ref,
1328        mutable,
1329        naked,
1330        naked_asm,
1331        naked_functions,
1332        naked_functions_rustic_abi,
1333        naked_functions_target_feature,
1334        name,
1335        names,
1336        native_link_modifiers,
1337        native_link_modifiers_as_needed,
1338        native_link_modifiers_bundle,
1339        native_link_modifiers_verbatim,
1340        native_link_modifiers_whole_archive,
1341        natvis_file,
1342        ne,
1343        needs_allocator,
1344        needs_drop,
1345        needs_panic_runtime,
1346        neg,
1347        negate_unsigned,
1348        negative_bounds,
1349        negative_impls,
1350        neon,
1351        nested,
1352        never,
1353        never_patterns,
1354        never_type,
1355        never_type_fallback,
1356        new,
1357        new_binary,
1358        new_debug,
1359        new_debug_noop,
1360        new_display,
1361        new_lower_exp,
1362        new_lower_hex,
1363        new_octal,
1364        new_pointer,
1365        new_range,
1366        new_unchecked,
1367        new_upper_exp,
1368        new_upper_hex,
1369        next,
1370        niko,
1371        nll,
1372        no,
1373        no_builtins,
1374        no_core,
1375        no_coverage,
1376        no_crate_inject,
1377        no_debug,
1378        no_default_passes,
1379        no_implicit_prelude,
1380        no_inline,
1381        no_link,
1382        no_main,
1383        no_mangle,
1384        no_sanitize,
1385        no_stack_check,
1386        no_std,
1387        nomem,
1388        non_ascii_idents,
1389        non_exhaustive,
1390        non_exhaustive_omitted_patterns_lint,
1391        non_lifetime_binders,
1392        non_modrs_mods,
1393        nonblocking,
1394        none,
1395        nontemporal_store,
1396        noop_method_borrow,
1397        noop_method_clone,
1398        noop_method_deref,
1399        noprefix,
1400        noreturn,
1401        nostack,
1402        not,
1403        notable_trait,
1404        note,
1405        null,
1406        nvptx64,
1407        nvptx_target_feature,
1408        object_safe_for_dispatch,
1409        of,
1410        off,
1411        offload,
1412        offset,
1413        offset_of,
1414        offset_of_enum,
1415        offset_of_nested,
1416        offset_of_slice,
1417        ok_or_else,
1418        old_name,
1419        omit_gdb_pretty_printer_section,
1420        on,
1421        on_const,
1422        on_move,
1423        on_unimplemented,
1424        on_unknown,
1425        opaque,
1426        opaque_module_name_placeholder: "<opaque>",
1427        ops,
1428        opt_out_copy,
1429        optimize,
1430        optimize_attribute,
1431        optimized,
1432        optin_builtin_traits,
1433        option,
1434        option_env,
1435        options,
1436        or,
1437        or_patterns,
1438        ord_cmp_method,
1439        other,
1440        out,
1441        output,
1442        overflow_checks,
1443        overlapping_marker_traits,
1444        owned_box,
1445        packed,
1446        packed_bundled_libs,
1447        panic,
1448        panic_2015,
1449        panic_2021,
1450        panic_abort,
1451        panic_bounds_check,
1452        panic_cannot_unwind,
1453        panic_const_add_overflow,
1454        panic_const_async_fn_resumed,
1455        panic_const_async_fn_resumed_drop,
1456        panic_const_async_fn_resumed_panic,
1457        panic_const_async_gen_fn_resumed,
1458        panic_const_async_gen_fn_resumed_drop,
1459        panic_const_async_gen_fn_resumed_panic,
1460        panic_const_coroutine_resumed,
1461        panic_const_coroutine_resumed_drop,
1462        panic_const_coroutine_resumed_panic,
1463        panic_const_div_by_zero,
1464        panic_const_div_overflow,
1465        panic_const_gen_fn_none,
1466        panic_const_gen_fn_none_drop,
1467        panic_const_gen_fn_none_panic,
1468        panic_const_mul_overflow,
1469        panic_const_neg_overflow,
1470        panic_const_rem_by_zero,
1471        panic_const_rem_overflow,
1472        panic_const_shl_overflow,
1473        panic_const_shr_overflow,
1474        panic_const_sub_overflow,
1475        panic_display,
1476        panic_fmt,
1477        panic_handler,
1478        panic_impl,
1479        panic_implementation,
1480        panic_in_cleanup,
1481        panic_info,
1482        panic_invalid_enum_construction,
1483        panic_location,
1484        panic_misaligned_pointer_dereference,
1485        panic_nounwind,
1486        panic_null_pointer_dereference,
1487        panic_runtime,
1488        panic_str_2015,
1489        panic_unwind,
1490        panicking,
1491        param_attrs,
1492        parent_label,
1493        partial_cmp,
1494        partial_ord,
1495        passes,
1496        pat,
1497        pat_param,
1498        patchable_function_entry,
1499        path,
1500        pattern_complexity_limit,
1501        pattern_parentheses,
1502        pattern_type,
1503        pattern_type_range_trait,
1504        pattern_types,
1505        phantom_data,
1506        phase,
1507        pic,
1508        pie,
1509        pin,
1510        pin_ergonomics,
1511        pin_v2,
1512        platform_intrinsics,
1513        plugin,
1514        plugin_registrar,
1515        plugins,
1516        pointee,
1517        pointee_sized,
1518        pointee_trait,
1519        pointer,
1520        poll,
1521        post_cleanup: "post-cleanup",
1522        post_dash_lto: "post-lto",
1523        postfix_match,
1524        powerpc,
1525        powerpc64,
1526        powerpc_target_feature,
1527        powf16,
1528        powf32,
1529        powf64,
1530        powf128,
1531        powif16,
1532        powif32,
1533        powif64,
1534        powif128,
1535        pre_dash_lto: "pre-lto",
1536        precise_capturing,
1537        precise_capturing_in_traits,
1538        precise_pointer_size_matching,
1539        predicates,
1540        pref_align_of,
1541        prefetch_read_data,
1542        prefetch_read_instruction,
1543        prefetch_write_data,
1544        prefetch_write_instruction,
1545        prefix_nops,
1546        preg,
1547        prelude,
1548        prelude_import,
1549        preserves_flags,
1550        prfchw_target_feature,
1551        proc_dash_macro: "proc-macro",
1552        proc_macro,
1553        proc_macro_attribute,
1554        proc_macro_derive,
1555        proc_macro_expr,
1556        proc_macro_gen,
1557        proc_macro_hygiene,
1558        proc_macro_internals,
1559        proc_macro_mod,
1560        proc_macro_non_items,
1561        proc_macro_path_invoc,
1562        profiler_runtime,
1563        ptr,
1564        ptr_cast,
1565        ptr_cast_const,
1566        ptr_cast_mut,
1567        ptr_const_is_null,
1568        ptr_copy,
1569        ptr_copy_nonoverlapping,
1570        ptr_from_ref,
1571        ptr_guaranteed_cmp,
1572        ptr_is_null,
1573        ptr_mask,
1574        ptr_metadata,
1575        ptr_null,
1576        ptr_null_mut,
1577        ptr_offset_from,
1578        ptr_offset_from_unsigned,
1579        ptr_read,
1580        ptr_read_unaligned,
1581        ptr_replace,
1582        ptr_swap,
1583        ptr_swap_nonoverlapping,
1584        ptr_write,
1585        ptr_write_bytes,
1586        ptr_write_unaligned,
1587        ptr_write_volatile,
1588        pub_macro_rules,
1589        pub_restricted,
1590        public,
1591        pure,
1592        pushpop_unsafe,
1593        qreg,
1594        qreg_low4,
1595        qreg_low8,
1596        quad_precision_float,
1597        question_mark,
1598        quote,
1599        range_inclusive_new,
1600        raw_dash_dylib: "raw-dylib",
1601        raw_dylib,
1602        raw_dylib_elf,
1603        raw_eq,
1604        raw_identifiers,
1605        raw_ref_op,
1606        re_rebalance_coherence,
1607        read_via_copy,
1608        readonly,
1609        realloc,
1610        realtime,
1611        reason,
1612        reborrow,
1613        receiver,
1614        receiver_target,
1615        recursion_limit,
1616        reexport_test_harness_main,
1617        ref_pat_eat_one_layer_2024,
1618        ref_pat_eat_one_layer_2024_structural,
1619        ref_pat_everywhere,
1620        ref_unwind_safe_trait,
1621        reference,
1622        reflect,
1623        reg,
1624        reg16,
1625        reg32,
1626        reg64,
1627        reg_abcd,
1628        reg_addr,
1629        reg_byte,
1630        reg_data,
1631        reg_iw,
1632        reg_nonzero,
1633        reg_pair,
1634        reg_ptr,
1635        reg_upper,
1636        register_attr,
1637        register_tool,
1638        relaxed_adts,
1639        relaxed_struct_unsize,
1640        relocation_model,
1641        rem,
1642        rem_assign,
1643        repr,
1644        repr128,
1645        repr_align,
1646        repr_align_enum,
1647        repr_packed,
1648        repr_simd,
1649        repr_transparent,
1650        require,
1651        reserve_x18: "reserve-x18",
1652        residual,
1653        result,
1654        result_ffi_guarantees,
1655        return_position_impl_trait_in_trait,
1656        return_type_notation,
1657        riscv32,
1658        riscv64,
1659        riscv_target_feature,
1660        rlib,
1661        ropi,
1662        ropi_rwpi: "ropi-rwpi",
1663        rotate_left,
1664        rotate_right,
1665        round_ties_even_f16,
1666        round_ties_even_f32,
1667        round_ties_even_f64,
1668        round_ties_even_f128,
1669        roundf16,
1670        roundf32,
1671        roundf64,
1672        roundf128,
1673        rtm_target_feature,
1674        runtime,
1675        rust,
1676        rust_2015,
1677        rust_2018,
1678        rust_2018_preview,
1679        rust_2021,
1680        rust_2024,
1681        rust_analyzer,
1682        rust_begin_unwind,
1683        rust_cold_cc,
1684        rust_eh_catch_typeinfo,
1685        rust_eh_personality,
1686        rust_future,
1687        rust_logo,
1688        rust_out,
1689        rust_preserve_none_cc,
1690        rustc,
1691        rustc_abi,
1692        // FIXME(#82232, #143834): temporary name to mitigate `#[align]` nameres ambiguity
1693        rustc_align,
1694        rustc_align_static,
1695        rustc_allocator,
1696        rustc_allocator_zeroed,
1697        rustc_allocator_zeroed_variant,
1698        rustc_allow_const_fn_unstable,
1699        rustc_allow_incoherent_impl,
1700        rustc_allowed_through_unstable_modules,
1701        rustc_as_ptr,
1702        rustc_attrs,
1703        rustc_autodiff,
1704        rustc_builtin_macro,
1705        rustc_capture_analysis,
1706        rustc_clean,
1707        rustc_coherence_is_core,
1708        rustc_coinductive,
1709        rustc_confusables,
1710        rustc_const_stable,
1711        rustc_const_stable_indirect,
1712        rustc_const_unstable,
1713        rustc_conversion_suggestion,
1714        rustc_deallocator,
1715        rustc_default_body_unstable,
1716        rustc_delayed_bug_from_inside_query,
1717        rustc_deny_explicit_impl,
1718        rustc_deprecated_safe_2024,
1719        rustc_diagnostic_item,
1720        rustc_diagnostic_macros,
1721        rustc_do_not_const_check,
1722        rustc_doc_primitive,
1723        rustc_driver,
1724        rustc_dummy,
1725        rustc_dump_def_parents,
1726        rustc_dump_def_path,
1727        rustc_dump_hidden_type_of_opaques,
1728        rustc_dump_inferred_outlives,
1729        rustc_dump_item_bounds,
1730        rustc_dump_layout,
1731        rustc_dump_object_lifetime_defaults,
1732        rustc_dump_predicates,
1733        rustc_dump_symbol_name,
1734        rustc_dump_user_args,
1735        rustc_dump_variances,
1736        rustc_dump_variances_of_opaques,
1737        rustc_dump_vtable,
1738        rustc_dyn_incompatible_trait,
1739        rustc_effective_visibility,
1740        rustc_eii_foreign_item,
1741        rustc_evaluate_where_clauses,
1742        rustc_expected_cgu_reuse,
1743        rustc_force_inline,
1744        rustc_has_incoherent_inherent_impls,
1745        rustc_if_this_changed,
1746        rustc_inherit_overflow_checks,
1747        rustc_insignificant_dtor,
1748        rustc_intrinsic,
1749        rustc_intrinsic_const_stable_indirect,
1750        rustc_layout_scalar_valid_range_end,
1751        rustc_layout_scalar_valid_range_start,
1752        rustc_legacy_const_generics,
1753        rustc_lint_opt_deny_field_access,
1754        rustc_lint_opt_ty,
1755        rustc_lint_query_instability,
1756        rustc_lint_untracked_query_information,
1757        rustc_macro_transparency,
1758        rustc_main,
1759        rustc_mir,
1760        rustc_must_implement_one_of,
1761        rustc_must_match_exhaustively,
1762        rustc_never_returns_null_ptr,
1763        rustc_never_type_options,
1764        rustc_no_implicit_autorefs,
1765        rustc_no_implicit_bounds,
1766        rustc_no_mir_inline,
1767        rustc_non_const_trait_method,
1768        rustc_nonnull_optimization_guaranteed,
1769        rustc_nounwind,
1770        rustc_objc_class,
1771        rustc_objc_selector,
1772        rustc_offload_kernel,
1773        rustc_on_unimplemented,
1774        rustc_paren_sugar,
1775        rustc_partition_codegened,
1776        rustc_partition_reused,
1777        rustc_pass_by_value,
1778        rustc_pass_indirectly_in_non_rustic_abis,
1779        rustc_peek,
1780        rustc_peek_liveness,
1781        rustc_peek_maybe_init,
1782        rustc_peek_maybe_uninit,
1783        rustc_preserve_ub_checks,
1784        rustc_private,
1785        rustc_proc_macro_decls,
1786        rustc_promotable,
1787        rustc_pub_transparent,
1788        rustc_reallocator,
1789        rustc_regions,
1790        rustc_reservation_impl,
1791        rustc_scalable_vector,
1792        rustc_should_not_be_called_on_const_items,
1793        rustc_simd_monomorphize_lane_limit,
1794        rustc_skip_during_method_dispatch,
1795        rustc_specialization_trait,
1796        rustc_std_internal_symbol,
1797        rustc_strict_coherence,
1798        rustc_test_marker,
1799        rustc_then_this_would_need,
1800        rustc_trivial_field_reads,
1801        rustc_unsafe_specialization_marker,
1802        rustdoc,
1803        rustdoc_internals,
1804        rustdoc_missing_doc_code_examples,
1805        rustfmt,
1806        rvalue_static_promotion,
1807        rwpi,
1808        s390x,
1809        s390x_target_feature,
1810        s390x_target_feature_vector,
1811        safety,
1812        sanitize,
1813        sanitizer_cfi_generalize_pointers,
1814        sanitizer_cfi_normalize_integers,
1815        sanitizer_runtime,
1816        saturating_add,
1817        saturating_sub,
1818        sdylib,
1819        search_unbox,
1820        select_unpredictable,
1821        self_in_typedefs,
1822        self_struct_ctor,
1823        semiopaque,
1824        sha2,
1825        sha3,
1826        sha512_sm_x86,
1827        shadow_call_stack,
1828        shallow,
1829        shl,
1830        shl_assign,
1831        shorter_tail_lifetimes,
1832        should_panic,
1833        show,
1834        shr,
1835        shr_assign,
1836        signed,
1837        simd,
1838        simd_add,
1839        simd_and,
1840        simd_arith_offset,
1841        simd_as,
1842        simd_bitmask,
1843        simd_bitreverse,
1844        simd_bswap,
1845        simd_carryless_mul,
1846        simd_cast,
1847        simd_cast_ptr,
1848        simd_ceil,
1849        simd_ctlz,
1850        simd_ctpop,
1851        simd_cttz,
1852        simd_div,
1853        simd_eq,
1854        simd_expose_provenance,
1855        simd_extract,
1856        simd_extract_dyn,
1857        simd_fabs,
1858        simd_fcos,
1859        simd_fexp,
1860        simd_fexp2,
1861        simd_ffi,
1862        simd_flog,
1863        simd_flog2,
1864        simd_flog10,
1865        simd_floor,
1866        simd_fma,
1867        simd_fsin,
1868        simd_fsqrt,
1869        simd_funnel_shl,
1870        simd_funnel_shr,
1871        simd_gather,
1872        simd_ge,
1873        simd_gt,
1874        simd_insert,
1875        simd_insert_dyn,
1876        simd_le,
1877        simd_lt,
1878        simd_masked_load,
1879        simd_masked_store,
1880        simd_maximum_number_nsz,
1881        simd_minimum_number_nsz,
1882        simd_mul,
1883        simd_ne,
1884        simd_neg,
1885        simd_or,
1886        simd_reduce_add_ordered,
1887        simd_reduce_add_unordered,
1888        simd_reduce_all,
1889        simd_reduce_and,
1890        simd_reduce_any,
1891        simd_reduce_max,
1892        simd_reduce_min,
1893        simd_reduce_mul_ordered,
1894        simd_reduce_mul_unordered,
1895        simd_reduce_or,
1896        simd_reduce_xor,
1897        simd_relaxed_fma,
1898        simd_rem,
1899        simd_round,
1900        simd_round_ties_even,
1901        simd_saturating_add,
1902        simd_saturating_sub,
1903        simd_scatter,
1904        simd_select,
1905        simd_select_bitmask,
1906        simd_shl,
1907        simd_shr,
1908        simd_shuffle,
1909        simd_shuffle_const_generic,
1910        simd_splat,
1911        simd_sub,
1912        simd_trunc,
1913        simd_with_exposed_provenance,
1914        simd_xor,
1915        since,
1916        sinf16,
1917        sinf32,
1918        sinf64,
1919        sinf128,
1920        size,
1921        size_of,
1922        size_of_val,
1923        sized,
1924        sized_hierarchy,
1925        slice,
1926        slice_from_raw_parts,
1927        slice_from_raw_parts_mut,
1928        slice_get_unchecked,
1929        slice_len_fn,
1930        slice_patterns,
1931        slicing_syntax,
1932        soft_float: "soft-float",
1933        sparc,
1934        sparc64,
1935        sparc_target_feature,
1936        spe_acc,
1937        specialization,
1938        speed,
1939        spirv,
1940        spotlight,
1941        sqrtf16,
1942        sqrtf32,
1943        sqrtf64,
1944        sqrtf128,
1945        sreg,
1946        sreg_low16,
1947        sse,
1948        sse2,
1949        sse4a_target_feature,
1950        stable,
1951        staged_api,
1952        start,
1953        state,
1954        static_align,
1955        static_in_const,
1956        static_nobundle,
1957        static_recursion,
1958        staticlib,
1959        std,
1960        std_lib_injection,
1961        std_panic,
1962        std_panic_2015_macro,
1963        std_panic_macro,
1964        stmt,
1965        stmt_expr_attributes,
1966        stop_after_dataflow,
1967        store,
1968        str,
1969        str_from_utf8,
1970        str_from_utf8_mut,
1971        str_from_utf8_unchecked,
1972        str_from_utf8_unchecked_mut,
1973        str_inherent_from_utf8,
1974        str_inherent_from_utf8_mut,
1975        str_inherent_from_utf8_unchecked,
1976        str_inherent_from_utf8_unchecked_mut,
1977        strict_provenance_lints,
1978        string_deref_patterns,
1979        stringify,
1980        struct_field_attributes,
1981        struct_inherit,
1982        struct_variant,
1983        structural_match,
1984        structural_peq,
1985        sub,
1986        sub_assign,
1987        sub_with_overflow,
1988        suggestion,
1989        super_let,
1990        supertrait_item_shadowing,
1991        sve_cast,
1992        sve_tuple_create2,
1993        sve_tuple_create3,
1994        sve_tuple_create4,
1995        sve_tuple_get,
1996        sve_tuple_set,
1997        sym,
1998        sync,
1999        synthetic,
2000        t32,
2001        target,
2002        target_abi,
2003        target_arch,
2004        target_endian,
2005        target_env,
2006        target_family,
2007        target_feature,
2008        target_feature_11,
2009        target_feature_inline_always,
2010        target_has_atomic,
2011        target_has_atomic_equal_alignment,
2012        target_has_atomic_load_store,
2013        target_has_reliable_f16,
2014        target_has_reliable_f16_math,
2015        target_has_reliable_f128,
2016        target_has_reliable_f128_math,
2017        target_os,
2018        target_pointer_width,
2019        target_thread_local,
2020        target_vendor,
2021        tbm_target_feature,
2022        termination,
2023        termination_trait,
2024        termination_trait_test,
2025        test,
2026        test_2018_feature,
2027        test_accepted_feature,
2028        test_case,
2029        test_incomplete_feature,
2030        test_removed_feature,
2031        test_runner,
2032        test_unstable_lint,
2033        thread,
2034        thread_local,
2035        three_way_compare,
2036        thumb2,
2037        thumb_mode: "thumb-mode",
2038        tmm_reg,
2039        to_string,
2040        to_vec,
2041        tool_attributes,
2042        tool_lints,
2043        trace_macros,
2044        track_caller,
2045        trait_alias,
2046        trait_ty,
2047        trait_upcasting,
2048        transmute,
2049        transmute_generic_consts,
2050        transmute_opts,
2051        transmute_trait,
2052        transmute_unchecked,
2053        transparent,
2054        transparent_enums,
2055        transparent_unions,
2056        trivial_bounds,
2057        trivial_clone,
2058        truncf16,
2059        truncf32,
2060        truncf64,
2061        truncf128,
2062        try_blocks,
2063        try_blocks_heterogeneous,
2064        try_capture,
2065        try_from,
2066        try_into,
2067        try_trait_v2,
2068        try_trait_v2_residual,
2069        try_update,
2070        tt,
2071        tuple,
2072        tuple_indexing,
2073        tuple_trait,
2074        two_phase,
2075        ty,
2076        type_alias_enum_variants,
2077        type_alias_impl_trait,
2078        type_ascribe,
2079        type_ascription,
2080        type_changing_struct_update,
2081        type_id,
2082        type_id_eq,
2083        type_id_vtable,
2084        type_info,
2085        type_ir,
2086        type_ir_infer_ctxt_like,
2087        type_ir_inherent,
2088        type_ir_interner,
2089        type_length_limit,
2090        type_macros,
2091        type_name,
2092        type_of,
2093        type_privacy_lints,
2094        typed_swap_nonoverlapping,
2095        u8,
2096        u8_legacy_const_max,
2097        u8_legacy_const_min,
2098        u8_legacy_fn_max_value,
2099        u8_legacy_fn_min_value,
2100        u8_legacy_mod,
2101        u16,
2102        u16_legacy_const_max,
2103        u16_legacy_const_min,
2104        u16_legacy_fn_max_value,
2105        u16_legacy_fn_min_value,
2106        u16_legacy_mod,
2107        u32,
2108        u32_legacy_const_max,
2109        u32_legacy_const_min,
2110        u32_legacy_fn_max_value,
2111        u32_legacy_fn_min_value,
2112        u32_legacy_mod,
2113        u64,
2114        u64_legacy_const_max,
2115        u64_legacy_const_min,
2116        u64_legacy_fn_max_value,
2117        u64_legacy_fn_min_value,
2118        u64_legacy_mod,
2119        u128,
2120        u128_legacy_const_max,
2121        u128_legacy_const_min,
2122        u128_legacy_fn_max_value,
2123        u128_legacy_fn_min_value,
2124        u128_legacy_mod,
2125        ub_checks,
2126        unaligned_volatile_load,
2127        unaligned_volatile_store,
2128        unboxed_closures,
2129        unchecked_add,
2130        unchecked_div,
2131        unchecked_funnel_shl,
2132        unchecked_funnel_shr,
2133        unchecked_mul,
2134        unchecked_rem,
2135        unchecked_shl,
2136        unchecked_shr,
2137        unchecked_sub,
2138        undecorated,
2139        underscore_const_names,
2140        underscore_imports,
2141        underscore_lifetimes,
2142        uniform_paths,
2143        unit,
2144        universal_impl_trait,
2145        unix,
2146        unlikely,
2147        unmarked_api,
2148        unnamed_fields,
2149        unpin,
2150        unqualified_local_imports,
2151        unreachable,
2152        unreachable_2015,
2153        unreachable_2015_macro,
2154        unreachable_2021,
2155        unreachable_code,
2156        unreachable_display,
2157        unreachable_macro,
2158        unrestricted_attribute_tokens,
2159        unsafe_attributes,
2160        unsafe_binders,
2161        unsafe_block_in_unsafe_fn,
2162        unsafe_cell,
2163        unsafe_cell_raw_get,
2164        unsafe_eii,
2165        unsafe_extern_blocks,
2166        unsafe_fields,
2167        unsafe_no_drop_flag,
2168        unsafe_pinned,
2169        unsafe_unpin,
2170        unsafety,
2171        unsize,
2172        unsized_const_param_ty,
2173        unsized_const_params,
2174        unsized_fn_params,
2175        unsized_locals,
2176        unsized_tuple_coercion,
2177        unstable,
2178        unstable_feature_bound,
2179        unstable_location_reason_default: "this crate is being loaded from the sysroot, an \
2180                          unstable location; did you mean to load this crate \
2181                          from crates.io via `Cargo.toml` instead?",
2182        untagged_unions,
2183        unused_imports,
2184        unwind,
2185        unwind_attributes,
2186        unwind_safe_trait,
2187        unwrap,
2188        unwrap_binder,
2189        unwrap_or,
2190        update,
2191        use_cloned,
2192        use_extern_macros,
2193        use_nested_groups,
2194        used,
2195        used_with_arg,
2196        using,
2197        usize,
2198        usize_legacy_const_max,
2199        usize_legacy_const_min,
2200        usize_legacy_fn_max_value,
2201        usize_legacy_fn_min_value,
2202        usize_legacy_mod,
2203        v1,
2204        v8plus,
2205        va_arg,
2206        va_copy,
2207        va_end,
2208        va_list,
2209        va_start,
2210        val,
2211        validity,
2212        value,
2213        values,
2214        var,
2215        variadic,
2216        variant_count,
2217        variants,
2218        vec,
2219        vector,
2220        verbatim,
2221        version,
2222        vfp2,
2223        vis,
2224        visible_private_types,
2225        volatile,
2226        volatile_copy_memory,
2227        volatile_copy_nonoverlapping_memory,
2228        volatile_load,
2229        volatile_set_memory,
2230        volatile_store,
2231        vreg,
2232        vreg_low16,
2233        vreg_pair,
2234        vsreg,
2235        vsx,
2236        vtable_align,
2237        vtable_size,
2238        warn,
2239        wasip2,
2240        wasm32,
2241        wasm64,
2242        wasm_abi,
2243        wasm_import_module,
2244        wasm_target_feature,
2245        weak,
2246        weak_odr,
2247        where_clause_attrs,
2248        while_let,
2249        whole_dash_archive: "whole-archive",
2250        width,
2251        windows,
2252        windows_subsystem,
2253        with_negative_coherence,
2254        wrap_binder,
2255        wrapping_add,
2256        wrapping_div,
2257        wrapping_mul,
2258        wrapping_rem,
2259        wrapping_rem_euclid,
2260        wrapping_sub,
2261        wreg,
2262        write_box_via_move,
2263        write_bytes,
2264        write_fmt,
2265        write_macro,
2266        write_str,
2267        write_via_move,
2268        writeln_macro,
2269        x86,
2270        x86_64,
2271        x86_amx_intrinsics,
2272        x87_reg,
2273        x87_target_feature,
2274        xer,
2275        xmm_reg,
2276        xop_target_feature,
2277        xtensa,
2278        yeet_desugar_details,
2279        yeet_expr,
2280        yes,
2281        yield_expr,
2282        ymm_reg,
2283        yreg,
2284        zca,
2285        zfh,
2286        zfhmin,
2287        zmm_reg,
2288        ztso,
2289        // tidy-alphabetical-end
2290    }
2291}
2292
2293/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2294/// `proc_macro`.
2295pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2296
2297#[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)]
2298pub struct Ident {
2299    /// `name` should never be the empty symbol. If you are considering that,
2300    /// you are probably conflating "empty identifier with "no identifier" and
2301    /// you should use `Option<Ident>` instead.
2302    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2303    pub name: Symbol,
2304    pub span: Span,
2305}
2306
2307impl Ident {
2308    #[inline]
2309    /// Constructs a new identifier from a symbol and a span.
2310    pub fn new(name: Symbol, span: Span) -> Ident {
2311        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);
2312        Ident { name, span }
2313    }
2314
2315    /// Constructs a new identifier with a dummy span.
2316    #[inline]
2317    pub fn with_dummy_span(name: Symbol) -> Ident {
2318        Ident::new(name, DUMMY_SP)
2319    }
2320
2321    // For dummy identifiers that are never used and absolutely must be
2322    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2323    // makes it clear that it's intended as a dummy value, and is more likely
2324    // to be detected if it accidentally does get used.
2325    #[inline]
2326    pub fn dummy() -> Ident {
2327        Ident::with_dummy_span(sym::dummy)
2328    }
2329
2330    /// Maps a string to an identifier with a dummy span.
2331    pub fn from_str(string: &str) -> Ident {
2332        Ident::with_dummy_span(Symbol::intern(string))
2333    }
2334
2335    /// Maps a string and a span to an identifier.
2336    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2337        Ident::new(Symbol::intern(string), span)
2338    }
2339
2340    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2341    pub fn with_span_pos(self, span: Span) -> Ident {
2342        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2343    }
2344
2345    /// Creates a new ident with the same span and name with leading quote removed, if any.
2346    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2347    pub fn without_first_quote(self) -> Ident {
2348        self.as_str()
2349            .strip_prefix('\'')
2350            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2351    }
2352
2353    /// "Normalize" ident for use in comparisons using "item hygiene".
2354    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2355    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2356    /// different macro 2.0 macros.
2357    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2358    pub fn normalize_to_macros_2_0(self) -> Ident {
2359        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2360    }
2361
2362    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2363    /// Identifiers with same string value become same if they came from the same non-transparent
2364    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2365    /// non-transparent macros.
2366    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2367    #[inline]
2368    pub fn normalize_to_macro_rules(self) -> Ident {
2369        Ident::new(self.name, self.span.normalize_to_macro_rules())
2370    }
2371
2372    /// Access the underlying string. This is a slowish operation because it
2373    /// requires locking the symbol interner.
2374    ///
2375    /// Note that the lifetime of the return value is a lie. See
2376    /// `Symbol::as_str()` for details.
2377    pub fn as_str(&self) -> &str {
2378        self.name.as_str()
2379    }
2380}
2381
2382impl PartialEq for Ident {
2383    #[inline]
2384    fn eq(&self, rhs: &Self) -> bool {
2385        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2386    }
2387}
2388
2389impl Hash for Ident {
2390    fn hash<H: Hasher>(&self, state: &mut H) {
2391        self.name.hash(state);
2392        self.span.ctxt().hash(state);
2393    }
2394}
2395
2396impl fmt::Debug for Ident {
2397    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2398        fmt::Display::fmt(self, f)?;
2399        fmt::Debug::fmt(&self.span.ctxt(), f)
2400    }
2401}
2402
2403/// This implementation is supposed to be used in error messages, so it's expected to be identical
2404/// to printing the original identifier token written in source code (`token_to_string`),
2405/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2406impl fmt::Display for Ident {
2407    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2408        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2409    }
2410}
2411
2412pub enum IdentPrintMode {
2413    Normal,
2414    RawIdent,
2415    RawLifetime,
2416}
2417
2418/// The most general type to print identifiers.
2419///
2420/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2421/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2422/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2423/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2424/// hygiene data, most importantly name of the crate it refers to.
2425/// As a result we print `$crate` as `crate` if it refers to the local crate
2426/// and as `::other_crate_name` if it refers to some other crate.
2427/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2428/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2429/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2430/// done for a token stream or a single token.
2431pub struct IdentPrinter {
2432    symbol: Symbol,
2433    mode: IdentPrintMode,
2434    /// Span used for retrieving the crate name to which `$crate` refers to,
2435    /// if this field is `None` then the `$crate` conversion doesn't happen.
2436    convert_dollar_crate: Option<Span>,
2437}
2438
2439impl IdentPrinter {
2440    /// The most general `IdentPrinter` constructor. Do not use this.
2441    pub fn new(
2442        symbol: Symbol,
2443        mode: IdentPrintMode,
2444        convert_dollar_crate: Option<Span>,
2445    ) -> IdentPrinter {
2446        IdentPrinter { symbol, mode, convert_dollar_crate }
2447    }
2448
2449    /// This implementation is supposed to be used when printing identifiers
2450    /// as a part of pretty-printing for larger AST pieces.
2451    /// Do not use this either.
2452    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2453        IdentPrinter::new(ident.name, mode, Some(ident.span))
2454    }
2455}
2456
2457impl fmt::Display for IdentPrinter {
2458    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2459        let s = match self.mode {
2460            IdentPrintMode::Normal
2461                if self.symbol == kw::DollarCrate
2462                    && let Some(span) = self.convert_dollar_crate =>
2463            {
2464                let converted = span.ctxt().dollar_crate_name();
2465                if !converted.is_path_segment_keyword() {
2466                    f.write_str("::")?;
2467                }
2468                converted
2469            }
2470            IdentPrintMode::Normal => self.symbol,
2471            IdentPrintMode::RawIdent => {
2472                f.write_str("r#")?;
2473                self.symbol
2474            }
2475            IdentPrintMode::RawLifetime => {
2476                f.write_str("'r#")?;
2477                let s = self
2478                    .symbol
2479                    .as_str()
2480                    .strip_prefix("'")
2481                    .expect("only lifetime idents should be passed with RawLifetime mode");
2482                Symbol::intern(s)
2483            }
2484        };
2485        s.fmt(f)
2486    }
2487}
2488
2489/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2490/// construction for "local variable hygiene" comparisons.
2491///
2492/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2493/// This ensures compile-time safety and avoids manual normalization calls.
2494#[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)]
2495pub struct MacroRulesNormalizedIdent(Ident);
2496
2497impl MacroRulesNormalizedIdent {
2498    #[inline]
2499    pub fn new(ident: Ident) -> Self {
2500        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2501    }
2502
2503    pub fn symbol(&self) -> Symbol {
2504        self.0.name
2505    }
2506
2507    pub fn ident(&self) -> Ident {
2508        self.0
2509    }
2510}
2511
2512impl fmt::Debug for MacroRulesNormalizedIdent {
2513    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2514        fmt::Debug::fmt(&self.0, f)
2515    }
2516}
2517
2518impl fmt::Display for MacroRulesNormalizedIdent {
2519    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2520        fmt::Display::fmt(&self.0, f)
2521    }
2522}
2523
2524/// An interned UTF-8 string.
2525///
2526/// Internally, a `Symbol` is implemented as an index, and all operations
2527/// (including hashing, equality, and ordering) operate on that index. The use
2528/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2529/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2530///
2531/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2532/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2533#[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)]
2534pub struct Symbol(SymbolIndex);
2535
2536// Used within both `Symbol` and `ByteSymbol`.
2537impl ::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! {
2538    #[orderable]
2539    struct SymbolIndex {}
2540}
2541
2542impl Symbol {
2543    /// Avoid this except for things like deserialization of previously
2544    /// serialized symbols, and testing. Use `intern` instead.
2545    pub const fn new(n: u32) -> Self {
2546        Symbol(SymbolIndex::from_u32(n))
2547    }
2548
2549    /// Maps a string to its interned representation.
2550    #[rustc_diagnostic_item = "SymbolIntern"]
2551    pub fn intern(str: &str) -> Self {
2552        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2553    }
2554
2555    /// Access the underlying string. This is a slowish operation because it
2556    /// requires locking the symbol interner.
2557    ///
2558    /// Note that the lifetime of the return value is a lie. It's not the same
2559    /// as `&self`, but actually tied to the lifetime of the underlying
2560    /// interner. Interners are long-lived, and there are very few of them, and
2561    /// this function is typically used for short-lived things, so in practice
2562    /// it works out ok.
2563    pub fn as_str(&self) -> &str {
2564        with_session_globals(|session_globals| unsafe {
2565            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2566        })
2567    }
2568
2569    pub fn as_u32(self) -> u32 {
2570        self.0.as_u32()
2571    }
2572
2573    pub fn is_empty(self) -> bool {
2574        self == sym::empty
2575    }
2576
2577    /// This method is supposed to be used in error messages, so it's expected to be
2578    /// identical to printing the original identifier token written in source code
2579    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2580    /// or edition, so we have to guess the rawness using the global edition.
2581    pub fn to_ident_string(self) -> String {
2582        // Avoid creating an empty identifier, because that asserts in debug builds.
2583        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2584    }
2585
2586    /// Checks if `self` is similar to any symbol in `candidates`.
2587    ///
2588    /// The returned boolean represents whether the candidate is the same symbol with a different
2589    /// casing.
2590    ///
2591    /// All the candidates are assumed to be lowercase.
2592    pub fn find_similar(
2593        self,
2594        candidates: &[Symbol],
2595    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2596        let lowercase = self.as_str().to_lowercase();
2597        let lowercase_sym = Symbol::intern(&lowercase);
2598        if candidates.contains(&lowercase_sym) {
2599            Some((lowercase_sym, true))
2600        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2601            Some((similar_sym, false))
2602        } else {
2603            None
2604        }
2605    }
2606}
2607
2608impl fmt::Debug for Symbol {
2609    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2610        fmt::Debug::fmt(self.as_str(), f)
2611    }
2612}
2613
2614impl fmt::Display for Symbol {
2615    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2616        fmt::Display::fmt(self.as_str(), f)
2617    }
2618}
2619
2620impl<Hcx> HashStable<Hcx> for Symbol {
2621    #[inline]
2622    fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2623        self.as_str().hash_stable(hcx, hasher);
2624    }
2625}
2626
2627impl<Hcx> ToStableHashKey<Hcx> for Symbol {
2628    type KeyType = String;
2629    #[inline]
2630    fn to_stable_hash_key(&self, _: &mut Hcx) -> String {
2631        self.as_str().to_string()
2632    }
2633}
2634
2635impl StableCompare for Symbol {
2636    const CAN_USE_UNSTABLE_SORT: bool = true;
2637
2638    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2639        self.as_str().cmp(other.as_str())
2640    }
2641}
2642
2643/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2644/// it has fewer operations defined than `Symbol`.
2645#[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)]
2646pub struct ByteSymbol(SymbolIndex);
2647
2648impl ByteSymbol {
2649    /// Avoid this except for things like deserialization of previously
2650    /// serialized symbols, and testing. Use `intern` instead.
2651    pub const fn new(n: u32) -> Self {
2652        ByteSymbol(SymbolIndex::from_u32(n))
2653    }
2654
2655    /// Maps a string to its interned representation.
2656    pub fn intern(byte_str: &[u8]) -> Self {
2657        with_session_globals(|session_globals| {
2658            session_globals.symbol_interner.intern_byte_str(byte_str)
2659        })
2660    }
2661
2662    /// Like `Symbol::as_str`.
2663    pub fn as_byte_str(&self) -> &[u8] {
2664        with_session_globals(|session_globals| unsafe {
2665            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2666        })
2667    }
2668
2669    pub fn as_u32(self) -> u32 {
2670        self.0.as_u32()
2671    }
2672}
2673
2674impl fmt::Debug for ByteSymbol {
2675    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2676        fmt::Debug::fmt(self.as_byte_str(), f)
2677    }
2678}
2679
2680impl<Hcx> HashStable<Hcx> for ByteSymbol {
2681    #[inline]
2682    fn hash_stable(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2683        self.as_byte_str().hash_stable(hcx, hasher);
2684    }
2685}
2686
2687// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2688// string with identical contents (e.g. "foo" and b"foo") are both interned,
2689// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2690// will have the same index.
2691pub(crate) struct Interner(Lock<InternerInner>);
2692
2693// The `&'static [u8]`s in this type actually point into the arena.
2694//
2695// This type is private to prevent accidentally constructing more than one
2696// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2697// between `Interner`s.
2698struct InternerInner {
2699    arena: DroplessArena,
2700    byte_strs: FxIndexSet<&'static [u8]>,
2701}
2702
2703impl Interner {
2704    // These arguments are `&str`, but because of the sharing, we are
2705    // effectively pre-interning all these strings for both `Symbol` and
2706    // `ByteSymbol`.
2707    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2708        let byte_strs = FxIndexSet::from_iter(
2709            init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes()),
2710        );
2711
2712        // The order in which duplicates are reported is irrelevant.
2713        #[expect(rustc::potential_query_instability)]
2714        if byte_strs.len() != init.len() + extra.len() {
2715            {
    ::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!(
2716                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2717                FxHashSet::intersection(
2718                    &init.iter().copied().collect(),
2719                    &extra.iter().copied().collect(),
2720                )
2721                .collect::<Vec<_>>()
2722            )
2723        }
2724
2725        Interner(Lock::new(InternerInner { arena: Default::default(), byte_strs }))
2726    }
2727
2728    fn intern_str(&self, str: &str) -> Symbol {
2729        Symbol::new(self.intern_inner(str.as_bytes()))
2730    }
2731
2732    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
2733        ByteSymbol::new(self.intern_inner(byte_str))
2734    }
2735
2736    #[inline]
2737    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
2738        let mut inner = self.0.lock();
2739        if let Some(idx) = inner.byte_strs.get_index_of(byte_str) {
2740            return idx as u32;
2741        }
2742
2743        let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
2744
2745        // SAFETY: we can extend the arena allocation to `'static` because we
2746        // only access these while the arena is still alive.
2747        let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
2748
2749        // This second hash table lookup can be avoided by using `RawEntryMut`,
2750        // but this code path isn't hot enough for it to be worth it. See
2751        // #91445 for details.
2752        let (idx, is_new) = inner.byte_strs.insert_full(byte_str);
2753        if true {
    if !is_new { ::core::panicking::panic("assertion failed: is_new") };
};debug_assert!(is_new); // due to the get_index_of check above
2754
2755        idx as u32
2756    }
2757
2758    /// Get the symbol as a string.
2759    ///
2760    /// [`Symbol::as_str()`] should be used in preference to this function.
2761    fn get_str(&self, symbol: Symbol) -> &str {
2762        let byte_str = self.get_inner(symbol.0.as_usize());
2763        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
2764        unsafe { str::from_utf8_unchecked(byte_str) }
2765    }
2766
2767    /// Get the symbol as a string.
2768    ///
2769    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
2770    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
2771        self.get_inner(symbol.0.as_usize())
2772    }
2773
2774    fn get_inner(&self, index: usize) -> &[u8] {
2775        self.0.lock().byte_strs.get_index(index).unwrap()
2776    }
2777}
2778
2779// This module has a very short name because it's used a lot.
2780/// This module contains all the defined keyword `Symbol`s.
2781///
2782/// Given that `kw` is imported, use them like `kw::keyword_name`.
2783/// For example `kw::Loop` or `kw::Break`.
2784pub mod kw {
2785    pub use super::kw_generated::*;
2786}
2787
2788// This module has a very short name because it's used a lot.
2789/// This module contains all the defined non-keyword `Symbol`s.
2790///
2791/// Given that `sym` is imported, use them like `sym::symbol_name`.
2792/// For example `sym::rustfmt` or `sym::u8`.
2793pub mod sym {
2794    // Used from a macro in `librustc_feature/accepted.rs`
2795    use super::Symbol;
2796    pub use super::kw::MacroRules as macro_rules;
2797    #[doc(inline)]
2798    pub use super::sym_generated::*;
2799
2800    // Used quite often in relation to C ABI.
2801    pub const C: Symbol = ascii_letter_digit('C').unwrap();
2802
2803    // RISC-V stuff
2804    #[expect(non_upper_case_globals)]
2805    pub const f: Symbol = ascii_letter_digit('f').unwrap();
2806    #[expect(non_upper_case_globals)]
2807    pub const d: Symbol = ascii_letter_digit('d').unwrap();
2808
2809    /// Get the symbol for an integer.
2810    ///
2811    /// The first few non-negative integers each have a static symbol and therefore
2812    /// are fast.
2813    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
2814        if let Result::Ok(idx) = n.try_into() {
2815            if idx < 10 {
2816                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
2817            }
2818        }
2819        let mut buffer = itoa::Buffer::new();
2820        let printed = buffer.format(n);
2821        Symbol::intern(printed)
2822    }
2823
2824    pub const fn ascii_letter_digit(c: char) -> Option<Symbol> {
2825        let i = c as u32;
2826        Option::Some(Symbol::new(match c {
2827            '0'..='9' => super::SYMBOL_DIGITS_BASE + (i - '0' as u32),
2828            'A'..='Z' => super::SYMBOL_UPPERCASE_LETTERS_BASE + (i - 'A' as u32),
2829            'a'..='z' => super::SYMBOL_LOWERCASE_LETTERS_BASE + (i - 'a' as u32),
2830            _ => return Option::None,
2831        }))
2832    }
2833
2834    pub fn character(c: char) -> Symbol {
2835        ascii_letter_digit(c).unwrap_or_else(|| {
2836            let mut buf: [u8; char::MAX_LEN_UTF8] = Default::default();
2837            Symbol::intern(c.encode_utf8(&mut buf))
2838        })
2839    }
2840}
2841
2842impl Symbol {
2843    fn is_special(self) -> bool {
2844        self <= kw::Underscore
2845    }
2846
2847    fn is_used_keyword_always(self) -> bool {
2848        self >= kw::As && self <= kw::While
2849    }
2850
2851    fn is_unused_keyword_always(self) -> bool {
2852        self >= kw::Abstract && self <= kw::Yield
2853    }
2854
2855    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
2856        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
2857    }
2858
2859    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2860        self == kw::Gen && edition().at_least_rust_2024()
2861            || self == kw::Try && edition().at_least_rust_2018()
2862    }
2863
2864    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2865        self.is_special()
2866            || self.is_used_keyword_always()
2867            || self.is_unused_keyword_always()
2868            || self.is_used_keyword_conditional(edition)
2869            || self.is_unused_keyword_conditional(edition)
2870    }
2871
2872    pub fn is_weak(self) -> bool {
2873        self >= kw::Auto && self <= kw::Yeet
2874    }
2875
2876    /// A keyword or reserved identifier that can be used as a path segment.
2877    pub fn is_path_segment_keyword(self) -> bool {
2878        self == kw::Super
2879            || self == kw::SelfLower
2880            || self == kw::SelfUpper
2881            || self == kw::Crate
2882            || self == kw::PathRoot
2883            || self == kw::DollarCrate
2884    }
2885
2886    /// Returns `true` if the symbol is `true` or `false`.
2887    pub fn is_bool_lit(self) -> bool {
2888        self == kw::True || self == kw::False
2889    }
2890
2891    /// Returns `true` if this symbol can be a raw identifier.
2892    pub fn can_be_raw(self) -> bool {
2893        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
2894    }
2895
2896    /// Was this symbol index predefined in the compiler's `symbols!` macro?
2897    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
2898    /// takes a `u32` argument instead of a `&self` argument. Use with care.
2899    pub fn is_predefined(index: u32) -> bool {
2900        index < PREDEFINED_SYMBOLS_COUNT
2901    }
2902}
2903
2904impl Ident {
2905    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
2906    /// unnamed method parameters, crate root module, error recovery etc.
2907    pub fn is_special(self) -> bool {
2908        self.name.is_special()
2909    }
2910
2911    /// Returns `true` if the token is a keyword used in the language.
2912    pub fn is_used_keyword(self) -> bool {
2913        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2914        self.name.is_used_keyword_always()
2915            || self.name.is_used_keyword_conditional(|| self.span.edition())
2916    }
2917
2918    /// Returns `true` if the token is a keyword reserved for possible future use.
2919    pub fn is_unused_keyword(self) -> bool {
2920        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2921        self.name.is_unused_keyword_always()
2922            || self.name.is_unused_keyword_conditional(|| self.span.edition())
2923    }
2924
2925    /// Returns `true` if the token is either a special identifier or a keyword.
2926    pub fn is_reserved(self) -> bool {
2927        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2928        self.name.is_reserved(|| self.span.edition())
2929    }
2930
2931    /// A keyword or reserved identifier that can be used as a path segment.
2932    pub fn is_path_segment_keyword(self) -> bool {
2933        self.name.is_path_segment_keyword()
2934    }
2935
2936    /// We see this identifier in a normal identifier position, like variable name or a type.
2937    /// How was it written originally? Did it use the raw form? Let's try to guess.
2938    pub fn is_raw_guess(self) -> bool {
2939        self.name.can_be_raw() && self.is_reserved()
2940    }
2941
2942    /// Given the name of a lifetime without the first quote (`'`),
2943    /// returns whether the lifetime name is reserved (therefore invalid)
2944    pub fn is_reserved_lifetime(self) -> bool {
2945        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
2946    }
2947
2948    pub fn is_raw_lifetime_guess(self) -> bool {
2949        // Check that the name isn't just a single quote.
2950        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
2951        if self.name.as_str() == "'" {
2952            return false;
2953        }
2954        let ident_without_apostrophe = self.without_first_quote();
2955        ident_without_apostrophe.name != self.name
2956            && ident_without_apostrophe.name.can_be_raw()
2957            && ident_without_apostrophe.is_reserved_lifetime()
2958    }
2959
2960    pub fn guess_print_mode(self) -> IdentPrintMode {
2961        if self.is_raw_lifetime_guess() {
2962            IdentPrintMode::RawLifetime
2963        } else if self.is_raw_guess() {
2964            IdentPrintMode::RawIdent
2965        } else {
2966            IdentPrintMode::Normal
2967        }
2968    }
2969
2970    /// Whether this would be the identifier for a tuple field like `self.0`, as
2971    /// opposed to a named field like `self.thing`.
2972    pub fn is_numeric(self) -> bool {
2973        self.as_str().bytes().all(|b| b.is_ascii_digit())
2974    }
2975}
2976
2977/// Collect all the keywords in a given edition into a vector.
2978///
2979/// *Note:* Please update this if a new keyword is added beyond the current
2980/// range.
2981pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
2982    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
2983        .filter_map(|kw| {
2984            let kw = Symbol::new(kw);
2985            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
2986                Some(kw)
2987            } else {
2988                None
2989            }
2990        })
2991        .collect()
2992}