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