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