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