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", "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_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",
                        "bcmp_fn", "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_attr_trace>",
                        "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_trace>", "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",
                        "coverage", "coverage_attribute", "cr", "crate_in_paths",
                        "crate_local", "crate_name", "crate_type",
                        "crate_visibility_modifier", "crt-static", "csky",
                        "csky_target_feature", "cstr_type", "cstring_type", "ctlz",
                        "ctlz_nonzero", "ctpop", "ctr", "cttz", "cttz_nonzero",
                        "custom_attribute", "custom_code_classes_in_docs",
                        "custom_derive", "custom_inner_attributes", "custom_mir",
                        "custom_test_frameworks", "d32", "dead_code",
                        "dead_code_pub_in_binary", "dealloc", "debug",
                        "debug_assert_eq_macro", "debug_assert_macro",
                        "debug_assert_ne_macro", "debug_assertions",
                        "debug_struct_fields_finish", "debug_tuple_fields_finish",
                        "debugger_visualizer", "decl_macro", "declare_lint_pass",
                        "decorated", "default_alloc_error_handler",
                        "default_field_values", "default_fn",
                        "default_lib_allocator", "default_method_body_is_const",
                        "default_trait1", "default_trait2", "default_trait3",
                        "default_trait4", "default_type_parameter_fallback",
                        "default_type_params", "define_opaque", "deny",
                        "deprecated", "deprecated_safe", "deprecated_suggestion",
                        "deref", "deref_method", "deref_mut", "deref_patterns",
                        "deref_pure", "deref_target", "derive", "derive_const",
                        "118304", "derive_default_enum", "derive_from",
                        "derive_smart_pointer", "destruct",
                        "destructuring_assignment", "diagnostic",
                        "diagnostic_namespace", "diagnostic_on_const",
                        "diagnostic_on_move", "diagnostic_on_type_error",
                        "diagnostic_on_unknown", "diagnostic_on_unmatch_args",
                        "diagnostic_on_unmatched_args", "diagnostic_opaque",
                        "dialect", "direct", "direct_const_arg",
                        "discriminant_kind", "discriminant_type",
                        "discriminant_value", "disjoint_bitor", "dispatch_from_dyn",
                        "div", "div_assign", "diverging_block_default", "dl",
                        "do_not_recommend", "doc", "doc_alias", "doc_auto_cfg",
                        "doc_cfg", "doc_cfg_hide", "doc_keyword", "doc_masked",
                        "doc_notable_trait", "doc_primitive", "doc_spotlight",
                        "doctest", "dotdot_in_tuple_patterns",
                        "dotdoteq_in_patterns", "dreg", "dreg_low8", "dreg_low16",
                        "drop", "drop_glue", "drop_in_place", "drop_types_in_const",
                        "dropck_eyepatch", "dropck_parametricity", "<!dummy!>",
                        "dummy_cgu_name", "dylib", "dyn_compatible_for_dispatch",
                        "dyn_metadata", "dyn_star", "dyn_trait", "dynamic-no-pic",
                        "edition_panic", "effective_target_features", "effects",
                        "eh_personality", "eii", "eii_declaration", "eii_internals",
                        "eii_shared_macro", "element_ty", "elf", "", "{}", "[]",
                        "()", "enable", "end", "entry_nops", "env", "eq",
                        "ergonomic_clones", "ermsb_target_feature", "exact_div",
                        "except", "exception", "exception-handling",
                        "exclusive_range_pattern", "exhaustive_integer_patterns",
                        "exhaustive_patterns", "existential_type", "exit_fn",
                        "exp2f16", "exp2f32", "exp2f64", "exp2f128", "expand1",
                        "expand2", "expect", "expected", "expf16", "expf32",
                        "expf64", "expf128", "explicit_extern_abis",
                        "explicit_generic_args_with_impl_trait",
                        "explicit_tail_calls", "export_name", "export_stable",
                        "export-symbols", "expr", "expr_2021",
                        "expr_fragment_specifier_2024",
                        "extended_key_value_attributes",
                        "extended_varargs_abi_support", "extendedl32r",
                        "extern_absolute_paths", "extern_crate_item_prelude",
                        "extern_crate_self", "extern_in_paths", "extern_item_impls",
                        "extern_prelude", "extern_system_varargs", "extern_types",
                        "extern_weak", "external", "external_doc", "f16", "f16_nan",
                        "f16c_target_feature", "f32", "f32_nan", "f64", "f64_nan",
                        "f128", "f128_nan", "fabs", "fadd_algebraic", "fadd_fast",
                        "fake_variadic", "fallback", "fdiv_algebraic", "fdiv_fast",
                        "feature", "fence", "🦀", "fetch_update", "ffi_const",
                        "ffi_pure", "ffi_returns_twice", "field", "field_base",
                        "field_init_shorthand", "field_of", "field_offset",
                        "field_projections", "field_representing_type",
                        "field_representing_type_actual_type_id",
                        "field_representing_type_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", "free_fn", "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", "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",
                        "macros_in_extern", "main", "malloc_fn", "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",
                        "memcmp_fn", "memcpy_fn", "memmove_fn", "memory",
                        "memset_fn", "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>",
                        "open_fn", "ops", "opt_out_copy", "optimize",
                        "optimize_attribute", "optimized", "optin_builtin_traits",
                        "option", "option_env", "options", "or", "or_patterns",
                        "ord_cmp_method", "other", "out", "output",
                        "overflow_checks", "overlapping_marker_traits", "owned_box",
                        "packed", "packed_bundled_libs", "panic", "panic_2015",
                        "panic_2021", "panic_abort", "panic_bounds_check",
                        "panic_cannot_unwind", "panic_const_add_overflow",
                        "panic_const_async_fn_resumed",
                        "panic_const_async_fn_resumed_drop",
                        "panic_const_async_fn_resumed_panic",
                        "panic_const_async_gen_fn_resumed",
                        "panic_const_async_gen_fn_resumed_drop",
                        "panic_const_async_gen_fn_resumed_panic",
                        "panic_const_coroutine_resumed",
                        "panic_const_coroutine_resumed_drop",
                        "panic_const_coroutine_resumed_panic",
                        "panic_const_div_by_zero", "panic_const_div_overflow",
                        "panic_const_gen_fn_none", "panic_const_gen_fn_none_drop",
                        "panic_const_gen_fn_none_panic", "panic_const_mul_overflow",
                        "panic_const_neg_overflow", "panic_const_rem_by_zero",
                        "panic_const_rem_overflow", "panic_const_shl_overflow",
                        "panic_const_shr_overflow", "panic_const_sub_overflow",
                        "panic_display", "panic_fmt", "panic_handler", "panic_impl",
                        "panic_implementation", "panic_in_cleanup", "panic_info",
                        "panic_invalid_enum_construction", "panic_location",
                        "panic_misaligned_pointer_dereference", "panic_nounwind",
                        "panic_null_pointer_dereference",
                        "panic_null_reference_constructed", "panic_runtime",
                        "panic_str_2015", "panic_unwind", "panicking",
                        "param_attrs", "parent_label", "partial_cmp", "partial_ord",
                        "passes", "pat", "pat_param", "patchable_function_entry",
                        "path", "pattern_complexity_limit", "pattern_parentheses",
                        "pattern_type", "pattern_type_range_trait", "pattern_types",
                        "phantom_data", "phase", "pic", "pie", "pin", "pin_drop",
                        "pin_ergonomics", "pin_v2", "platform_intrinsics", "plugin",
                        "plugin_registrar", "plugins", "pointee", "pointee_sized",
                        "pointee_trait", "pointer", "poll", "post-cleanup",
                        "post-lto", "postfix_match", "powerpc", "powerpc64",
                        "powerpc_target_feature", "powf16", "powf32", "powf64",
                        "powf128", "powif16", "powif32", "powif64", "powif128",
                        "pre-lto", "precise_capturing",
                        "precise_capturing_in_traits",
                        "precise_pointer_size_matching", "predicates",
                        "pref_align_of", "prefetch_read_data",
                        "prefetch_read_instruction", "prefetch_write_data",
                        "prefetch_write_instruction", "prefix_nops", "preg",
                        "prelude", "prelude_import", "preserves_flags",
                        "prfchw_target_feature", "prid", "primitive", "proc-macro",
                        "proc_macro", "proc_macro_attribute", "proc_macro_derive",
                        "proc_macro_expr", "proc_macro_gen", "proc_macro_hygiene",
                        "proc_macro_internals", "proc_macro_mod",
                        "proc_macro_non_items", "proc_macro_path_invoc",
                        "profiler_runtime", "ptr", "ptr_cast", "ptr_cast_const",
                        "ptr_cast_mut", "ptr_const_is_null", "ptr_copy",
                        "ptr_copy_nonoverlapping", "ptr_from_ref",
                        "ptr_guaranteed_cmp", "ptr_is_null", "ptr_mask",
                        "ptr_metadata", "ptr_null", "ptr_null_mut",
                        "ptr_offset_from", "ptr_offset_from_unsigned", "ptr_read",
                        "ptr_read_unaligned", "ptr_replace", "ptr_swap",
                        "ptr_swap_nonoverlapping", "ptr_write", "ptr_write_bytes",
                        "ptr_write_unaligned", "ptr_write_volatile",
                        "pub_macro_rules", "pub_restricted", "public", "pure",
                        "pushpop_unsafe", "qreg", "qreg_low4", "qreg_low8",
                        "quad_precision_float", "question_mark", "quote",
                        "range_inclusive_new", "raw-dylib", "raw_dylib",
                        "raw_dylib_elf", "raw_eq", "raw_identifiers", "raw_ref_op",
                        "re_rebalance_coherence", "read_fn", "read_via_copy",
                        "readonly", "realloc", "realloc_fn", "realtime", "reason",
                        "reborrow", "receiver", "receiver_target",
                        "recursion_limit", "reexport_test_harness_main",
                        "ref_pat_eat_one_layer_2024",
                        "ref_pat_eat_one_layer_2024_structural",
                        "ref_pat_everywhere", "ref_unwind_safe_trait", "reference",
                        "reflect", "reg", "reg16", "reg32", "reg64", "reg_abcd",
                        "reg_addr", "reg_byte", "reg_data", "reg_iw", "reg_nonzero",
                        "reg_pair", "reg_ptr", "reg_upper", "register_attr",
                        "register_tool", "relaxed_adts", "relaxed_struct_unsize",
                        "relocation_model", "rem", "rem_assign", "repr", "repr128",
                        "repr_align", "repr_align_enum", "repr_packed", "repr_simd",
                        "repr_transparent", "require", "reserve-x18", "residual",
                        "result", "result_ffi_guarantees", "return_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_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_paren_sugar", "rustc_partition_codegened",
                        "rustc_partition_reused", "rustc_pass_by_value",
                        "rustc_pass_indirectly_in_non_rustic_abis", "rustc_peek",
                        "rustc_peek_liveness", "rustc_peek_maybe_init",
                        "rustc_peek_maybe_uninit", "rustc_preserve_ub_checks",
                        "rustc_private", "rustc_proc_macro_decls",
                        "rustc_promotable", "rustc_pub_transparent",
                        "rustc_reallocator", "rustc_regions",
                        "rustc_reservation_impl", "rustc_scalable_vector",
                        "rustc_should_not_be_called_on_const_items",
                        "rustc_simd_monomorphize_lane_limit",
                        "rustc_skip_during_method_dispatch",
                        "rustc_specialization_trait", "rustc_std_internal_symbol",
                        "rustc_strict_coherence", "rustc_test_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", "strlen_fn", "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_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", "va_start", "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_fn", "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        Pointer,
274        Poll,
275        Range,
276        RangeCopy,
277        RangeFrom,
278        RangeFromCopy,
279        RangeFull,
280        RangeInclusive,
281        RangeInclusiveCopy,
282        RangeMax,
283        RangeMin,
284        RangeSub,
285        RangeTo,
286        RangeToInclusive,
287        RangeToInclusiveCopy,
288        Rc,
289        RcWeak,
290        Ready,
291        Reborrow,
292        RefCell,
293        Reference,
294        Relaxed,
295        Release,
296        Result,
297        ResumeTy,
298        Reverse,
299        Rust,
300        // Temporary name for the rust_embed hack introduced in #145108
301        RustEmbed,
302        RustaceansAreAwesome,
303        RwLock,
304        RwLockReadGuard,
305        RwLockWriteGuard,
306        SelfTy,
307        Send,
308        SeqCst,
309        Sized,
310        Slice,
311        SliceIndex,
312        Some,
313        Source,
314        SpanCtxt,
315        StdinLock,
316        Str,
317        String,
318        Struct,
319        StructuralPartialEq,
320        SymbolIntern,
321        Sync,
322        SyncUnsafeCell,
323        Target,
324        This,
325        TokenStream,
326        TrivialClone,
327        Try,
328        TryCaptureGeneric,
329        TryCapturePrintable,
330        TryFrom,
331        TryInto,
332        Tuple,
333        Ty,
334        TyCtxt,
335        TyKind,
336        Type,
337        Union,
338        Unresolved,
339        Unsize,
340        Vec,
341        Wrapper,
342        _DECLS,
343        __H,
344        __S,
345        __awaitee,
346        __try_var,
347        _t,
348        _task_context,
349        a32,
350        aarch64,
351        aarch64_target_feature,
352        aarch64_unstable_target_feature,
353        aarch64_ver_target_feature,
354        abi,
355        abi_amdgpu_kernel,
356        abi_avr_interrupt,
357        abi_c_cmse_nonsecure_call,
358        abi_cmse_nonsecure_call,
359        abi_custom,
360        abi_efiapi,
361        abi_gpu_kernel,
362        abi_msp430_interrupt,
363        abi_ptx,
364        abi_riscv_interrupt,
365        abi_swift,
366        abi_sysv64,
367        abi_thiscall,
368        abi_unadjusted,
369        abi_vectorcall,
370        abi_x86_interrupt,
371        abort,
372        add,
373        add_assign,
374        add_with_overflow,
375        address,
376        adt_const_params,
377        advanced_slice_patterns,
378        adx_target_feature,
379        aes,
380        aggregate_raw_ptr,
381        alias,
382        align,
383        align_of,
384        align_of_val,
385        alignment,
386        all,
387        alloc,
388        alloc_error_handler,
389        alloc_layout,
390        alloc_zeroed,
391        allocator,
392        allocator_api,
393        allocator_internals,
394        allow,
395        allow_fail,
396        allow_internal_unsafe,
397        allow_internal_unstable,
398        altivec,
399        alu32,
400        always,
401        amdgpu,
402        amdgpu_dispatch_ptr,
403        analysis,
404        and,
405        and_then,
406        anon,
407        anon_assoc,
408        anonymous_lifetime_in_impl_trait,
409        any,
410        apx_target_feature,
411        arbitrary_enum_discriminant,
412        arbitrary_self_types,
413        arbitrary_self_types_pointers,
414        areg,
415        args,
416        arith_offset,
417        arm,
418        arm64ec,
419        arm_a32: "arm::a32",
420        arm_t32: "arm::t32",
421        arm_target_feature,
422        array,
423        as_dash_needed: "as-needed",
424        as_ref,
425        asm,
426        asm_cfg,
427        asm_const,
428        asm_experimental_arch,
429        asm_experimental_reg,
430        asm_goto,
431        asm_goto_with_outputs,
432        asm_sym,
433        asm_unwind,
434        assert,
435        assert_eq,
436        assert_eq_macro,
437        assert_fields_are_eq,
438        assert_inhabited,
439        assert_macro,
440        assert_mem_uninitialized_valid,
441        assert_ne_macro,
442        assert_receiver_is_total_eq,
443        assert_zero_valid,
444        asserting,
445        associated_const_equality,
446        associated_consts,
447        associated_type_bounds,
448        associated_type_defaults,
449        associated_types,
450        assume,
451        assume_init,
452        asterisk: "*",
453        async_await,
454        async_call,
455        async_call_mut,
456        async_call_once,
457        async_closure,
458        async_drop,
459        async_drop_in_place,
460        async_fn,
461        async_fn_in_dyn_trait,
462        async_fn_in_trait,
463        async_fn_kind_helper,
464        async_fn_kind_upvars,
465        async_fn_mut,
466        async_fn_once,
467        async_fn_once_output,
468        async_fn_track_caller,
469        async_fn_traits,
470        async_for_loop,
471        async_gen_internals,
472        async_iterator,
473        async_iterator_poll_next,
474        async_trait_bounds,
475        atomic,
476        atomic_and,
477        atomic_cxchg,
478        atomic_cxchgweak,
479        atomic_fence,
480        atomic_load,
481        atomic_max,
482        atomic_min,
483        atomic_nand,
484        atomic_or,
485        atomic_singlethreadfence,
486        atomic_store,
487        atomic_umax,
488        atomic_umin,
489        atomic_xadd,
490        atomic_xchg,
491        atomic_xor,
492        atomic_xsub,
493        atomics,
494        att_syntax,
495        attr,
496        attr_literals,
497        attribute,
498        attributes,
499        audit_that,
500        augmented_assignments,
501        auto_cfg,
502        auto_traits,
503        autodiff,
504        autodiff_forward,
505        autodiff_reverse,
506        automatically_derived,
507        available_externally,
508        avr,
509        avr_target_feature,
510        avx,
511        avx10_target_feature,
512        avx512_target_feature,
513        avx512bw,
514        avx512f,
515        await_macro,
516        backchain,
517        backend_repr,
518        bcmp_fn,
519        begin_panic,
520        bench,
521        bevy_ecs,
522        bikeshed,
523        bikeshed_guaranteed_no_drop,
524        bin,
525        bind_by_move_pattern_guards,
526        bindings_after_at,
527        bitand,
528        bitand_assign,
529        bitor,
530        bitor_assign,
531        bitreverse,
532        bits,
533        bitxor,
534        bitxor_assign,
535        black_box,
536        block,
537        blocking,
538        bool,
539        borrowck_graphviz_format,
540        borrowck_graphviz_postflow,
541        box_new,
542        box_patterns,
543        box_syntax,
544        boxed_slice,
545        bpf,
546        bpf_target_feature,
547        braced_empty_structs,
548        branch,
549        breakpoint,
550        breg,
551        bridge,
552        bswap,
553        built,
554        builtin_syntax,
555        bundle,
556        c_dash_variadic,
557        c_str_literals,
558        c_unwind,
559        c_variadic,
560        c_variadic_experimental_arch,
561        c_variadic_naked_functions,
562        c_void,
563        call,
564        call_mut,
565        call_once,
566        call_once_future,
567        call_ref_future,
568        caller,
569        caller_location,
570        capture_disjoint_fields,
571        carrying_mul_add,
572        carryless_mul,
573        catch_unwind,
574        cause,
575        cdylib,
576        ceilf16,
577        ceilf32,
578        ceilf64,
579        ceilf128,
580        cfg,
581        cfg_accessible,
582        cfg_attr,
583        cfg_attr_multi,
584        cfg_attr_trace: "<cfg_attr_trace>", // must not be a valid identifier
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_trace: "<cfg_trace>", // must not be a valid identifier
606        cfg_ub_checks,
607        cfg_version,
608        cfi,
609        cfi_encoding,
610        char,
611        checked_type_aliases,
612        clflushopt_target_feature,
613        client,
614        clippy,
615        clobber_abi,
616        clone,
617        clone_closures,
618        clone_fn,
619        clone_from,
620        close_fn,
621        closure,
622        closure_lifetime_binder,
623        closure_to_fn_coercion,
624        closure_track_caller,
625        cmp,
626        cmp_ord_max,
627        cmp_ord_min,
628        cmp_partialeq_eq,
629        cmp_partialeq_ne,
630        cmp_partialord_cmp,
631        cmp_partialord_ge,
632        cmp_partialord_gt,
633        cmp_partialord_le,
634        cmp_partialord_lt,
635        cmpxchg16b_target_feature,
636        cmse_nonsecure_entry,
637        coerce_pointee_validated,
638        coerce_shared,
639        coerce_shared_target,
640        coerce_unsized,
641        coff,
642        cold,
643        cold_path,
644        collapse_debuginfo,
645        column,
646        common,
647        compare_bytes,
648        compare_exchange,
649        compare_exchange_weak,
650        compile_error,
651        compiler,
652        compiler_builtins,
653        compiler_copy,
654        compiler_fence,
655        compiler_move,
656        concat,
657        concat_bytes,
658        conservative_impl_trait,
659        console,
660        const_allocate,
661        const_async_blocks,
662        const_block_items,
663        const_c_variadic,
664        const_closures,
665        const_compare_raw_pointers,
666        const_constructor,
667        const_continue,
668        const_deallocate,
669        const_destruct,
670        const_eval_limit,
671        const_eval_select,
672        const_evaluatable_checked,
673        const_extern_fn,
674        const_fn,
675        const_fn_floating_point_arithmetic,
676        const_fn_fn_ptr_basics,
677        const_fn_trait_bound,
678        const_fn_transmute,
679        const_fn_union,
680        const_fn_unsize,
681        const_for,
682        const_format_args,
683        const_generics,
684        const_generics_defaults,
685        const_if_match,
686        const_impl_trait,
687        const_in_array_repeat_expressions,
688        const_indexing,
689        const_let,
690        const_loop,
691        const_make_global,
692        const_mut_refs,
693        const_panic,
694        const_panic_fmt,
695        const_param_ty,
696        const_param_ty_unchecked,
697        const_precise_live_drops,
698        const_ptr_cast,
699        const_raw_ptr_deref,
700        const_raw_ptr_to_usize_cast,
701        const_refs_to_cell,
702        const_refs_to_static,
703        const_trait_bound_opt_out,
704        const_trait_impl,
705        const_try,
706        const_ty_placeholder: "<const_ty>",
707        constant,
708        constructor,
709        contract_build_check_ensures,
710        contract_check_ensures,
711        contract_check_requires,
712        contract_checks,
713        contracts,
714        contracts_ensures,
715        contracts_internals,
716        contracts_requires,
717        convert,
718        coprocessor,
719        copy,
720        copy_closures,
721        copy_nonoverlapping,
722        copysignf16,
723        copysignf32,
724        copysignf64,
725        copysignf128,
726        core,
727        core_panic,
728        core_panic_2015_macro,
729        core_panic_macro,
730        coroutine,
731        coroutine_clone,
732        coroutine_resume,
733        coroutine_return,
734        coroutine_state,
735        coroutine_yield,
736        coroutines,
737        cosf16,
738        cosf32,
739        cosf64,
740        cosf128,
741        count,
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_struct_fields_finish,
777        debug_tuple_fields_finish,
778        debugger_visualizer,
779        decl_macro,
780        declare_lint_pass,
781        decorated,
782        default_alloc_error_handler,
783        default_field_values,
784        default_fn,
785        default_lib_allocator,
786        default_method_body_is_const,
787        // --------------------------
788        // Lang items which are used only for experiments with auto traits with default bounds.
789        // These lang items are not actually defined in core/std. Experiment is a part of
790        // `MCP: Low level components for async drop`(https://github.com/rust-lang/compiler-team/issues/727)
791        default_trait1,
792        default_trait2,
793        default_trait3,
794        default_trait4,
795        // --------------------------
796        default_type_parameter_fallback,
797        default_type_params,
798        define_opaque,
799        deny,
800        deprecated,
801        deprecated_safe,
802        deprecated_suggestion,
803        deref,
804        deref_method,
805        deref_mut,
806        deref_patterns,
807        deref_pure,
808        deref_target,
809        derive,
810        derive_const,
811        derive_const_issue: "118304",
812        derive_default_enum,
813        derive_from,
814        derive_smart_pointer,
815        destruct,
816        destructuring_assignment,
817        diagnostic,
818        diagnostic_namespace,
819        diagnostic_on_const,
820        diagnostic_on_move,
821        diagnostic_on_type_error,
822        diagnostic_on_unknown,
823        diagnostic_on_unmatch_args,
824        diagnostic_on_unmatched_args,
825        diagnostic_opaque,
826        dialect,
827        direct,
828        direct_const_arg,
829        discriminant_kind,
830        discriminant_type,
831        discriminant_value,
832        disjoint_bitor,
833        dispatch_from_dyn,
834        div,
835        div_assign,
836        diverging_block_default,
837        dl,
838        do_not_recommend,
839        doc,
840        doc_alias,
841        doc_auto_cfg,
842        doc_cfg,
843        doc_cfg_hide,
844        doc_keyword,
845        doc_masked,
846        doc_notable_trait,
847        doc_primitive,
848        doc_spotlight,
849        doctest,
850        dotdot_in_tuple_patterns,
851        dotdoteq_in_patterns,
852        dreg,
853        dreg_low8,
854        dreg_low16,
855        drop,
856        drop_glue,
857        drop_in_place,
858        drop_types_in_const,
859        dropck_eyepatch,
860        dropck_parametricity,
861        dummy: "<!dummy!>", // use this instead of `sym::empty` for symbols that won't be used
862        dummy_cgu_name,
863        dylib,
864        dyn_compatible_for_dispatch,
865        dyn_metadata,
866        dyn_star,
867        dyn_trait,
868        dynamic_no_pic: "dynamic-no-pic",
869        edition_panic,
870        effective_target_features,
871        effects,
872        eh_personality,
873        eii,
874        eii_declaration,
875        eii_internals,
876        eii_shared_macro,
877        element_ty,
878        elf,
879        // Notes about `sym::empty`:
880        // - It should only be used when it genuinely means "empty symbol". Use
881        //   `Option<Symbol>` when "no symbol" is a possibility.
882        // - For dummy symbols that are never used and absolutely must be
883        //   present, it's better to use `sym::dummy` than `sym::empty`, because
884        //   it's clearer that it's intended as a dummy value, and more likely
885        //   to be detected if it accidentally does get used.
886        empty: "",
887        empty_braces: "{}",
888        empty_brackets: "[]",
889        empty_parens: "()",
890        enable,
891        end,
892        entry_nops,
893        env,
894        env_CFG_RELEASE: env!("CFG_RELEASE"),
895        eq,
896        ergonomic_clones,
897        ermsb_target_feature,
898        exact_div,
899        except,
900        exception,
901        exception_handling: "exception-handling",
902        exclusive_range_pattern,
903        exhaustive_integer_patterns,
904        exhaustive_patterns,
905        existential_type,
906        exit_fn,
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        fetch_update,
962        ffi_const,
963        ffi_pure,
964        ffi_returns_twice,
965        field,
966        field_base,
967        field_init_shorthand,
968        field_of,
969        field_offset,
970        field_projections,
971        field_representing_type,
972        field_representing_type_actual_type_id,
973        field_representing_type_raw,
974        field_type,
975        fields,
976        file,
977        final_associated_functions,
978        float_to_int_unchecked,
979        floorf16,
980        floorf32,
981        floorf64,
982        floorf128,
983        fma4_target_feature,
984        fmaf16,
985        fmaf32,
986        fmaf64,
987        fmaf128,
988        fmt,
989        fmt_debug,
990        fmul_algebraic,
991        fmul_fast,
992        fmuladdf16,
993        fmuladdf32,
994        fmuladdf64,
995        fmuladdf128,
996        fn_align,
997        fn_body,
998        fn_delegation,
999        fn_must_use,
1000        fn_mut,
1001        fn_once,
1002        fn_once_output,
1003        fn_ptr_addr,
1004        fn_ptr_trait,
1005        forbid,
1006        force_target_feature,
1007        forget,
1008        format_args,
1009        format_args_capture,
1010        format_args_nl,
1011        format_argument,
1012        format_arguments,
1013        format_macro,
1014        format_placeholder,
1015        format_unsafe_arg,
1016        fp,
1017        framework,
1018        free_fn,
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        last,
1180        lasx,
1181        late_bound_turbofishing,
1182        lateout,
1183        lazy_normalization_consts,
1184        lazy_type_alias,
1185        le,
1186        legacy_receiver,
1187        len,
1188        let_chains,
1189        let_else,
1190        lhs,
1191        lib,
1192        libc,
1193        lifetime,
1194        lifetime_capture_rules_2024,
1195        lifetimes,
1196        line,
1197        link,
1198        link_arg_attribute,
1199        link_args,
1200        link_cfg,
1201        link_dash_arg: "link-arg",
1202        link_llvm_intrinsics,
1203        link_name,
1204        link_ordinal,
1205        link_section,
1206        linkage,
1207        linker,
1208        linker_info,
1209        linker_messages,
1210        linkonce,
1211        linkonce_odr,
1212        lint_reasons,
1213        literal,
1214        little, big,
1215        load,
1216        loaded_from_disk,
1217        local,
1218        local_inner_macros,
1219        log2f16,
1220        log2f32,
1221        log2f64,
1222        log2f128,
1223        log10f16,
1224        log10f32,
1225        log10f64,
1226        log10f128,
1227        log_syntax,
1228        logf16,
1229        logf32,
1230        logf64,
1231        logf128,
1232        loongarch32,
1233        loongarch64,
1234        loongarch_target_feature,
1235        loop_break_value,
1236        loop_hints,
1237        loop_match,
1238        lr,
1239        lsx,
1240        lt,
1241        m68k,
1242        m68k_target_feature,
1243        mac16,
1244        macho: "mach-o",
1245        macro_at_most_once_rep,
1246        macro_attr,
1247        macro_attributes_in_derive_output,
1248        macro_derive,
1249        macro_escape,
1250        macro_export,
1251        macro_guard_matcher,
1252        macro_lifetime_matcher,
1253        macro_literal_matcher,
1254        macro_metavar_expr,
1255        macro_metavar_expr_concat,
1256        macro_reexport,
1257        macro_use,
1258        macro_vis_matcher,
1259        macros_in_extern,
1260        main,
1261        malloc_fn,
1262        managed_boxes,
1263        manually_drop,
1264        map,
1265        map_err,
1266        marker,
1267        marker_trait_attr,
1268        masked,
1269        match_beginning_vert,
1270        match_default_bindings,
1271        maximum_number_nsz_f16,
1272        maximum_number_nsz_f32,
1273        maximum_number_nsz_f64,
1274        maximum_number_nsz_f128,
1275        maximumf16,
1276        maximumf32,
1277        maximumf64,
1278        maximumf128,
1279        may_dangle,
1280        may_unwind,
1281        maybe_dangling,
1282        maybe_uninit,
1283        maybe_uninit_uninit,
1284        maybe_uninit_zeroed,
1285        mem,
1286        mem_align_const,
1287        mem_discriminant,
1288        mem_drop,
1289        mem_forget,
1290        mem_size_const,
1291        mem_swap,
1292        mem_uninitialized,
1293        mem_variant_count,
1294        mem_zeroed,
1295        member_constraints,
1296        memcmp_fn,
1297        memcpy_fn,
1298        memmove_fn,
1299        memory,
1300        memset_fn,
1301        memtag,
1302        message,
1303        meta,
1304        meta_sized,
1305        metadata_type,
1306        mgca_type_const_syntax,
1307        min_adt_const_params,
1308        min_const_fn,
1309        min_const_generics,
1310        min_const_unsafe_fn,
1311        min_exhaustive_patterns,
1312        min_generic_const_args,
1313        min_specialization,
1314        min_type_alias_impl_trait,
1315        minimum_number_nsz_f16,
1316        minimum_number_nsz_f32,
1317        minimum_number_nsz_f64,
1318        minimum_number_nsz_f128,
1319        minimumf16,
1320        minimumf32,
1321        minimumf64,
1322        minimumf128,
1323        mips,
1324        mips32r6,
1325        mips64,
1326        mips64r6,
1327        mips_target_feature,
1328        mir_assume,
1329        mir_basic_block,
1330        mir_call,
1331        mir_cast_ptr_to_ptr,
1332        mir_cast_transmute,
1333        mir_cast_unsize,
1334        mir_checked,
1335        mir_debuginfo,
1336        mir_discriminant,
1337        mir_drop,
1338        mir_field,
1339        mir_goto,
1340        mir_make_place,
1341        mir_move,
1342        mir_offset,
1343        mir_ptr_metadata,
1344        mir_return,
1345        mir_return_to,
1346        mir_set_discriminant,
1347        mir_static,
1348        mir_static_mut,
1349        mir_storage_dead,
1350        mir_storage_live,
1351        mir_tail_call,
1352        mir_unreachable,
1353        mir_unwind_cleanup,
1354        mir_unwind_continue,
1355        mir_unwind_resume,
1356        mir_unwind_terminate,
1357        mir_unwind_terminate_reason,
1358        mir_unwind_unreachable,
1359        mir_variant,
1360        miri,
1361        misc,
1362        miscsr,
1363        mmx_reg,
1364        modifiers,
1365        module,
1366        module_path,
1367        more_maybe_bounds,
1368        more_qualified_paths,
1369        more_struct_aliases,
1370        movbe_target_feature,
1371        move_expr,
1372        move_ref_pattern,
1373        move_size_limit,
1374        movrs_target_feature,
1375        msp430,
1376        mul,
1377        mul_assign,
1378        mul_with_overflow,
1379        multiple_supertrait_upcastable,
1380        must_not_suspend,
1381        must_use,
1382        mut_preserve_binding_mode_2024,
1383        mut_ref,
1384        mut_restriction,
1385        mutable,
1386        naked,
1387        naked_asm,
1388        naked_functions,
1389        naked_functions_rustic_abi,
1390        naked_functions_target_feature,
1391        name,
1392        names,
1393        native_link_modifiers,
1394        native_link_modifiers_as_needed,
1395        native_link_modifiers_bundle,
1396        native_link_modifiers_verbatim,
1397        native_link_modifiers_whole_archive,
1398        natvis_file,
1399        ne,
1400        needs_allocator,
1401        needs_drop,
1402        needs_panic_runtime,
1403        neg,
1404        negate_unsigned,
1405        negative_bounds,
1406        negative_impls,
1407        neon,
1408        nested,
1409        never,
1410        never_patterns,
1411        never_type,
1412        never_type_fallback,
1413        new,
1414        new_binary,
1415        new_debug,
1416        new_debug_noop,
1417        new_display,
1418        new_lower_exp,
1419        new_lower_hex,
1420        new_octal,
1421        new_pointer,
1422        new_range,
1423        new_unchecked,
1424        new_upper_exp,
1425        new_upper_hex,
1426        next,
1427        niko,
1428        nll,
1429        no,
1430        no_builtins,
1431        no_core,
1432        no_coverage,
1433        no_crate_inject,
1434        no_debug,
1435        no_default_passes,
1436        no_implicit_prelude,
1437        no_inline,
1438        no_link,
1439        no_main,
1440        no_mangle,
1441        no_sanitize,
1442        no_stack_check,
1443        no_std,
1444        nomem,
1445        non_ascii_idents,
1446        non_exhaustive,
1447        non_exhaustive_omitted_patterns_lint,
1448        non_lifetime_binders,
1449        non_modrs_mods,
1450        nonblocking,
1451        none,
1452        nontemporal_store,
1453        noop_method_borrow,
1454        noop_method_clone,
1455        noop_method_deref,
1456        noprefix,
1457        noreturn,
1458        nostack,
1459        not,
1460        notable_trait,
1461        note,
1462        null,
1463        nvptx64,
1464        nvptx_target_feature,
1465        object_safe_for_dispatch,
1466        of,
1467        off,
1468        offload,
1469        offload_kernel,
1470        offset,
1471        offset_of,
1472        offset_of_enum,
1473        offset_of_nested,
1474        offset_of_slice,
1475        ok_or_else,
1476        old_name,
1477        omit_gdb_pretty_printer_section,
1478        on,
1479        on_const,
1480        on_move,
1481        on_type_error,
1482        on_unimplemented,
1483        on_unknown,
1484        on_unmatched_args,
1485        opaque,
1486        opaque_module_name_placeholder: "<opaque>",
1487        open_fn,
1488        ops,
1489        opt_out_copy,
1490        optimize,
1491        optimize_attribute,
1492        optimized,
1493        optin_builtin_traits,
1494        option,
1495        option_env,
1496        options,
1497        or,
1498        or_patterns,
1499        ord_cmp_method,
1500        other,
1501        out,
1502        output,
1503        overflow_checks,
1504        overlapping_marker_traits,
1505        owned_box,
1506        packed,
1507        packed_bundled_libs,
1508        panic,
1509        panic_2015,
1510        panic_2021,
1511        panic_abort,
1512        panic_bounds_check,
1513        panic_cannot_unwind,
1514        panic_const_add_overflow,
1515        panic_const_async_fn_resumed,
1516        panic_const_async_fn_resumed_drop,
1517        panic_const_async_fn_resumed_panic,
1518        panic_const_async_gen_fn_resumed,
1519        panic_const_async_gen_fn_resumed_drop,
1520        panic_const_async_gen_fn_resumed_panic,
1521        panic_const_coroutine_resumed,
1522        panic_const_coroutine_resumed_drop,
1523        panic_const_coroutine_resumed_panic,
1524        panic_const_div_by_zero,
1525        panic_const_div_overflow,
1526        panic_const_gen_fn_none,
1527        panic_const_gen_fn_none_drop,
1528        panic_const_gen_fn_none_panic,
1529        panic_const_mul_overflow,
1530        panic_const_neg_overflow,
1531        panic_const_rem_by_zero,
1532        panic_const_rem_overflow,
1533        panic_const_shl_overflow,
1534        panic_const_shr_overflow,
1535        panic_const_sub_overflow,
1536        panic_display,
1537        panic_fmt,
1538        panic_handler,
1539        panic_impl,
1540        panic_implementation,
1541        panic_in_cleanup,
1542        panic_info,
1543        panic_invalid_enum_construction,
1544        panic_location,
1545        panic_misaligned_pointer_dereference,
1546        panic_nounwind,
1547        panic_null_pointer_dereference,
1548        panic_null_reference_constructed,
1549        panic_runtime,
1550        panic_str_2015,
1551        panic_unwind,
1552        panicking,
1553        param_attrs,
1554        parent_label,
1555        partial_cmp,
1556        partial_ord,
1557        passes,
1558        pat,
1559        pat_param,
1560        patchable_function_entry,
1561        path,
1562        pattern_complexity_limit,
1563        pattern_parentheses,
1564        pattern_type,
1565        pattern_type_range_trait,
1566        pattern_types,
1567        phantom_data,
1568        phase,
1569        pic,
1570        pie,
1571        pin,
1572        pin_drop,
1573        pin_ergonomics,
1574        pin_v2,
1575        platform_intrinsics,
1576        plugin,
1577        plugin_registrar,
1578        plugins,
1579        pointee,
1580        pointee_sized,
1581        pointee_trait,
1582        pointer,
1583        poll,
1584        post_cleanup: "post-cleanup",
1585        post_dash_lto: "post-lto",
1586        postfix_match,
1587        powerpc,
1588        powerpc64,
1589        powerpc_target_feature,
1590        powf16,
1591        powf32,
1592        powf64,
1593        powf128,
1594        powif16,
1595        powif32,
1596        powif64,
1597        powif128,
1598        pre_dash_lto: "pre-lto",
1599        precise_capturing,
1600        precise_capturing_in_traits,
1601        precise_pointer_size_matching,
1602        predicates,
1603        pref_align_of,
1604        prefetch_read_data,
1605        prefetch_read_instruction,
1606        prefetch_write_data,
1607        prefetch_write_instruction,
1608        prefix_nops,
1609        preg,
1610        prelude,
1611        prelude_import,
1612        preserves_flags,
1613        prfchw_target_feature,
1614        prid,
1615        primitive,
1616        proc_dash_macro: "proc-macro",
1617        proc_macro,
1618        proc_macro_attribute,
1619        proc_macro_derive,
1620        proc_macro_expr,
1621        proc_macro_gen,
1622        proc_macro_hygiene,
1623        proc_macro_internals,
1624        proc_macro_mod,
1625        proc_macro_non_items,
1626        proc_macro_path_invoc,
1627        profiler_runtime,
1628        ptr,
1629        ptr_cast,
1630        ptr_cast_const,
1631        ptr_cast_mut,
1632        ptr_const_is_null,
1633        ptr_copy,
1634        ptr_copy_nonoverlapping,
1635        ptr_from_ref,
1636        ptr_guaranteed_cmp,
1637        ptr_is_null,
1638        ptr_mask,
1639        ptr_metadata,
1640        ptr_null,
1641        ptr_null_mut,
1642        ptr_offset_from,
1643        ptr_offset_from_unsigned,
1644        ptr_read,
1645        ptr_read_unaligned,
1646        ptr_replace,
1647        ptr_swap,
1648        ptr_swap_nonoverlapping,
1649        ptr_write,
1650        ptr_write_bytes,
1651        ptr_write_unaligned,
1652        ptr_write_volatile,
1653        pub_macro_rules,
1654        pub_restricted,
1655        public,
1656        pure,
1657        pushpop_unsafe,
1658        qreg,
1659        qreg_low4,
1660        qreg_low8,
1661        quad_precision_float,
1662        question_mark,
1663        quote,
1664        range_inclusive_new,
1665        raw_dash_dylib: "raw-dylib",
1666        raw_dylib,
1667        raw_dylib_elf,
1668        raw_eq,
1669        raw_identifiers,
1670        raw_ref_op,
1671        re_rebalance_coherence,
1672        read_fn,
1673        read_via_copy,
1674        readonly,
1675        realloc,
1676        realloc_fn,
1677        realtime,
1678        reason,
1679        reborrow,
1680        receiver,
1681        receiver_target,
1682        recursion_limit,
1683        reexport_test_harness_main,
1684        ref_pat_eat_one_layer_2024,
1685        ref_pat_eat_one_layer_2024_structural,
1686        ref_pat_everywhere,
1687        ref_unwind_safe_trait,
1688        reference,
1689        reflect,
1690        reg,
1691        reg16,
1692        reg32,
1693        reg64,
1694        reg_abcd,
1695        reg_addr,
1696        reg_byte,
1697        reg_data,
1698        reg_iw,
1699        reg_nonzero,
1700        reg_pair,
1701        reg_ptr,
1702        reg_upper,
1703        register_attr,
1704        register_tool,
1705        relaxed_adts,
1706        relaxed_struct_unsize,
1707        relocation_model,
1708        rem,
1709        rem_assign,
1710        repr,
1711        repr128,
1712        repr_align,
1713        repr_align_enum,
1714        repr_packed,
1715        repr_simd,
1716        repr_transparent,
1717        require,
1718        reserve_x18: "reserve-x18",
1719        residual,
1720        result,
1721        result_ffi_guarantees,
1722        return_address,
1723        return_position_impl_trait_in_trait,
1724        return_type_notation,
1725        right_arrow: "->",
1726        riscv32,
1727        riscv64,
1728        riscv_target_feature,
1729        rlib,
1730        ropi,
1731        ropi_rwpi: "ropi-rwpi",
1732        rotate_left,
1733        rotate_right,
1734        round_ties_even_f16,
1735        round_ties_even_f32,
1736        round_ties_even_f64,
1737        round_ties_even_f128,
1738        roundf16,
1739        roundf32,
1740        roundf64,
1741        roundf128,
1742        rtm_target_feature,
1743        runtime,
1744        rust,
1745        rust_2015,
1746        rust_2018,
1747        rust_2018_preview,
1748        rust_2021,
1749        rust_2024,
1750        rust_analyzer,
1751        rust_begin_unwind,
1752        rust_cold_cc,
1753        rust_dash_call: "rust-call",
1754        rust_eh_personality,
1755        rust_future,
1756        rust_logo,
1757        rust_out,
1758        rust_preserve_none_cc,
1759        rust_tail_cc,
1760        rustc,
1761        rustc_abi,
1762        // FIXME(#82232, #143834): temporary name to mitigate `#[align]` nameres ambiguity
1763        rustc_align,
1764        rustc_align_static,
1765        rustc_allocator,
1766        rustc_allocator_zeroed,
1767        rustc_allocator_zeroed_variant,
1768        rustc_allow_const_fn_unstable,
1769        rustc_allow_incoherent_impl,
1770        rustc_allowed_through_unstable_modules,
1771        rustc_as_ptr,
1772        rustc_attrs,
1773        rustc_autodiff,
1774        rustc_builtin_macro,
1775        rustc_capture_analysis,
1776        rustc_clean,
1777        rustc_coherence_is_core,
1778        rustc_coinductive,
1779        rustc_comptime,
1780        rustc_confusables,
1781        rustc_const_stable,
1782        rustc_const_stable_indirect,
1783        rustc_const_unstable,
1784        rustc_conversion_suggestion,
1785        rustc_deallocator,
1786        rustc_default_body_unstable,
1787        rustc_delayed_bug_from_inside_query,
1788        rustc_deny_explicit_impl,
1789        rustc_deprecated_safe_2024,
1790        rustc_diagnostic_item,
1791        rustc_diagnostic_macros,
1792        rustc_diagnostic_opaque,
1793        rustc_do_not_const_check,
1794        rustc_doc_primitive,
1795        rustc_driver,
1796        rustc_dummy,
1797        rustc_dump_def_parents,
1798        rustc_dump_def_path,
1799        rustc_dump_generics,
1800        rustc_dump_hidden_type_of_opaques,
1801        rustc_dump_inferred_outlives,
1802        rustc_dump_item_bounds,
1803        rustc_dump_layout,
1804        rustc_dump_object_lifetime_defaults,
1805        rustc_dump_predicates,
1806        rustc_dump_symbol_name,
1807        rustc_dump_user_args,
1808        rustc_dump_variances,
1809        rustc_dump_variances_of_opaques,
1810        rustc_dump_vtable,
1811        rustc_dyn_incompatible_trait,
1812        rustc_effective_visibility,
1813        rustc_eii_foreign_item,
1814        rustc_evaluate_where_clauses,
1815        rustc_expected_cgu_reuse,
1816        rustc_force_inline,
1817        rustc_has_incoherent_inherent_impls,
1818        rustc_if_this_changed,
1819        rustc_inherit_overflow_checks,
1820        rustc_insignificant_dtor,
1821        rustc_intrinsic,
1822        rustc_intrinsic_const_stable_indirect,
1823        rustc_legacy_const_generics,
1824        rustc_lint_opt_deny_field_access,
1825        rustc_lint_opt_ty,
1826        rustc_lint_query_instability,
1827        rustc_lint_untracked_query_information,
1828        rustc_macro_transparency,
1829        rustc_main,
1830        rustc_mir,
1831        rustc_must_implement_one_of,
1832        rustc_must_match_exhaustively,
1833        rustc_never_returns_null_ptr,
1834        rustc_never_type_options,
1835        rustc_no_implicit_autorefs,
1836        rustc_no_implicit_bounds,
1837        rustc_no_mir_inline,
1838        rustc_no_writable,
1839        rustc_non_const_trait_method,
1840        rustc_nonnull_optimization_guaranteed,
1841        rustc_nounwind,
1842        rustc_objc_class,
1843        rustc_objc_selector,
1844        rustc_offload_kernel,
1845        rustc_on_unimplemented,
1846        rustc_paren_sugar,
1847        rustc_partition_codegened,
1848        rustc_partition_reused,
1849        rustc_pass_by_value,
1850        rustc_pass_indirectly_in_non_rustic_abis,
1851        rustc_peek,
1852        rustc_peek_liveness,
1853        rustc_peek_maybe_init,
1854        rustc_peek_maybe_uninit,
1855        rustc_preserve_ub_checks,
1856        rustc_private,
1857        rustc_proc_macro_decls,
1858        rustc_promotable,
1859        rustc_pub_transparent,
1860        rustc_reallocator,
1861        rustc_regions,
1862        rustc_reservation_impl,
1863        rustc_scalable_vector,
1864        rustc_should_not_be_called_on_const_items,
1865        rustc_simd_monomorphize_lane_limit,
1866        rustc_skip_during_method_dispatch,
1867        rustc_specialization_trait,
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        strlen_fn,
2066        struct_field_attributes,
2067        struct_inherit,
2068        struct_variant,
2069        structural_match,
2070        structural_peq,
2071        sub,
2072        sub_assign,
2073        sub_with_overflow,
2074        suggestion,
2075        super_let,
2076        supertrait_item_shadowing,
2077        sve_cast,
2078        sve_tuple_create2,
2079        sve_tuple_create3,
2080        sve_tuple_create4,
2081        sve_tuple_get,
2082        sve_tuple_set,
2083        sym,
2084        sync,
2085        synthetic,
2086        t32,
2087        target,
2088        target_abi,
2089        target_arch,
2090        target_endian,
2091        target_env,
2092        target_family,
2093        target_feature,
2094        target_feature_11,
2095        target_feature_inline_always,
2096        target_has_atomic,
2097        target_has_atomic_load_store,
2098        target_has_atomic_primitive_alignment,
2099        target_has_reliable_f16,
2100        target_has_reliable_f16_math,
2101        target_has_reliable_f128,
2102        target_has_reliable_f128_math,
2103        target_has_threads,
2104        target_object_format,
2105        target_os,
2106        target_pointer_width,
2107        target_thread_local,
2108        target_vendor,
2109        tbm_target_feature,
2110        termination,
2111        termination_trait,
2112        termination_trait_test,
2113        test,
2114        test_2018_feature,
2115        test_accepted_feature,
2116        test_case,
2117        test_incomplete_feature,
2118        test_removed_feature,
2119        test_runner,
2120        test_unstable_lint,
2121        thread,
2122        thread_local,
2123        threadptr,
2124        three_way_compare,
2125        thumb2,
2126        thumb_mode: "thumb-mode",
2127        time,
2128        tmm_reg,
2129        to_owned_method,
2130        to_string,
2131        to_vec,
2132        tool_attributes,
2133        tool_lints,
2134        trace_macros,
2135        track_caller,
2136        trait_alias,
2137        trait_ty,
2138        trait_upcasting,
2139        transmute,
2140        transmute_generic_consts,
2141        transmute_opts,
2142        transmute_trait,
2143        transmute_unchecked,
2144        transparent,
2145        transparent_enums,
2146        transparent_unions,
2147        trivial_bounds,
2148        trivial_clone,
2149        truncf16,
2150        truncf32,
2151        truncf64,
2152        truncf128,
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        va_start,
2309        val,
2310        validity,
2311        value,
2312        values,
2313        var,
2314        variadic,
2315        variant_count,
2316        variants,
2317        vec,
2318        vector,
2319        verbatim,
2320        version,
2321        vfp2,
2322        vgpr16,
2323        vgpr32,
2324        vgpr64,
2325        vgpr96,
2326        vgpr128,
2327        vgpr160,
2328        vgpr192,
2329        vgpr224,
2330        vgpr256,
2331        vgpr288,
2332        vgpr320,
2333        vgpr352,
2334        vgpr384,
2335        vgpr512,
2336        vgpr1024,
2337        view_type,
2338        view_types,
2339        vis,
2340        visible_private_types,
2341        volatile,
2342        volatile_copy_memory,
2343        volatile_copy_nonoverlapping_memory,
2344        volatile_load,
2345        volatile_set_memory,
2346        volatile_store,
2347        vreg,
2348        vreg_low16,
2349        vreg_pair,
2350        vsreg,
2351        vsx,
2352        vtable_align,
2353        vtable_size,
2354        warn,
2355        wasip2,
2356        wasm,
2357        wasm32,
2358        wasm64,
2359        wasm_abi,
2360        wasm_import_module,
2361        wasm_target_feature,
2362        weak,
2363        weak_odr,
2364        where_clause_attrs,
2365        while_let,
2366        whole_dash_archive: "whole-archive",
2367        width,
2368        windowed,
2369        windows,
2370        windows_subsystem,
2371        with_negative_coherence,
2372        wrap_binder,
2373        wrapping_add,
2374        wrapping_div,
2375        wrapping_mul,
2376        wrapping_rem,
2377        wrapping_rem_euclid,
2378        wrapping_sub,
2379        wreg,
2380        write_box_via_move,
2381        write_bytes,
2382        write_fmt,
2383        write_fn,
2384        write_macro,
2385        write_str,
2386        write_via_move,
2387        writeln_macro,
2388        x86,
2389        x86_64,
2390        x86_amx_intrinsics,
2391        x87_reg,
2392        x87_target_feature,
2393        xcoff,
2394        xer,
2395        xloop,
2396        xmm_reg,
2397        xop_target_feature,
2398        xreg,
2399        xtensa,
2400        xtensa_target_feature,
2401        yeet_desugar_details,
2402        yeet_expr,
2403        yes,
2404        yield_expr,
2405        ymm_reg,
2406        yreg,
2407        zca,
2408        zfh,
2409        zfhmin,
2410        zmm_reg,
2411        ztso,
2412        // tidy-alphabetical-end
2413    }
2414}
2415
2416/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2417/// `proc_macro`.
2418pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2419
2420#[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)]
2421pub struct Ident {
2422    /// `name` should never be the empty symbol. If you are considering that,
2423    /// you are probably conflating "empty identifier with "no identifier" and
2424    /// you should use `Option<Ident>` instead.
2425    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2426    pub name: Symbol,
2427    pub span: Span,
2428}
2429
2430impl Ident {
2431    #[inline]
2432    /// Constructs a new identifier from a symbol and a span.
2433    pub fn new(name: Symbol, span: Span) -> Ident {
2434        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);
2435        Ident { name, span }
2436    }
2437
2438    /// Constructs a new identifier with a dummy span.
2439    #[inline]
2440    pub fn with_dummy_span(name: Symbol) -> Ident {
2441        Ident::new(name, DUMMY_SP)
2442    }
2443
2444    // For dummy identifiers that are never used and absolutely must be
2445    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2446    // makes it clear that it's intended as a dummy value, and is more likely
2447    // to be detected if it accidentally does get used.
2448    #[inline]
2449    pub fn dummy() -> Ident {
2450        Ident::with_dummy_span(sym::dummy)
2451    }
2452
2453    /// Maps a string to an identifier with a dummy span.
2454    pub fn from_str(string: &str) -> Ident {
2455        Ident::with_dummy_span(Symbol::intern(string))
2456    }
2457
2458    /// Maps a string and a span to an identifier.
2459    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2460        Ident::new(Symbol::intern(string), span)
2461    }
2462
2463    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2464    pub fn with_span_pos(self, span: Span) -> Ident {
2465        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2466    }
2467
2468    /// Creates a new ident with the same span and name with leading quote removed, if any.
2469    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2470    pub fn without_first_quote(self) -> Ident {
2471        self.as_str()
2472            .strip_prefix('\'')
2473            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2474    }
2475
2476    /// "Normalize" ident for use in comparisons using "item hygiene".
2477    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2478    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2479    /// different macro 2.0 macros.
2480    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2481    pub fn normalize_to_macros_2_0(self) -> Ident {
2482        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2483    }
2484
2485    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2486    /// Identifiers with same string value become same if they came from the same non-transparent
2487    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2488    /// non-transparent macros.
2489    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2490    #[inline]
2491    pub fn normalize_to_macro_rules(self) -> Ident {
2492        Ident::new(self.name, self.span.normalize_to_macro_rules())
2493    }
2494
2495    /// Access the underlying string. This is a slowish operation because it
2496    /// requires locking the symbol interner.
2497    ///
2498    /// Note that the lifetime of the return value is a lie. See
2499    /// `Symbol::as_str()` for details.
2500    pub fn as_str(&self) -> &str {
2501        self.name.as_str()
2502    }
2503}
2504
2505impl PartialEq for Ident {
2506    #[inline]
2507    fn eq(&self, rhs: &Self) -> bool {
2508        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2509    }
2510}
2511
2512impl Hash for Ident {
2513    fn hash<H: Hasher>(&self, state: &mut H) {
2514        self.name.hash(state);
2515        self.span.ctxt().hash(state);
2516    }
2517}
2518
2519impl fmt::Debug for Ident {
2520    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2521        fmt::Display::fmt(self, f)?;
2522        fmt::Debug::fmt(&self.span.ctxt(), f)
2523    }
2524}
2525
2526/// This implementation is supposed to be used in error messages, so it's expected to be identical
2527/// to printing the original identifier token written in source code (`token_to_string`),
2528/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2529impl fmt::Display for Ident {
2530    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2531        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2532    }
2533}
2534
2535pub enum IdentPrintMode {
2536    Normal,
2537    RawIdent,
2538    RawLifetime,
2539}
2540
2541/// The most general type to print identifiers.
2542///
2543/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2544/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2545/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2546/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2547/// hygiene data, most importantly name of the crate it refers to.
2548/// As a result we print `$crate` as `crate` if it refers to the local crate
2549/// and as `::other_crate_name` if it refers to some other crate.
2550/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2551/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2552/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2553/// done for a token stream or a single token.
2554pub struct IdentPrinter {
2555    symbol: Symbol,
2556    mode: IdentPrintMode,
2557    /// Span used for retrieving the crate name to which `$crate` refers to,
2558    /// if this field is `None` then the `$crate` conversion doesn't happen.
2559    convert_dollar_crate: Option<Span>,
2560}
2561
2562impl IdentPrinter {
2563    /// The most general `IdentPrinter` constructor. Do not use this.
2564    pub fn new(
2565        symbol: Symbol,
2566        mode: IdentPrintMode,
2567        convert_dollar_crate: Option<Span>,
2568    ) -> IdentPrinter {
2569        IdentPrinter { symbol, mode, convert_dollar_crate }
2570    }
2571
2572    /// This implementation is supposed to be used when printing identifiers
2573    /// as a part of pretty-printing for larger AST pieces.
2574    /// Do not use this either.
2575    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2576        IdentPrinter::new(ident.name, mode, Some(ident.span))
2577    }
2578}
2579
2580impl fmt::Display for IdentPrinter {
2581    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2582        let s = match self.mode {
2583            IdentPrintMode::Normal
2584                if self.symbol == kw::DollarCrate
2585                    && let Some(span) = self.convert_dollar_crate =>
2586            {
2587                let converted = span.ctxt().dollar_crate_name();
2588                if !converted.is_path_segment_keyword() {
2589                    f.write_str("::")?;
2590                }
2591                converted
2592            }
2593            IdentPrintMode::Normal => self.symbol,
2594            IdentPrintMode::RawIdent => {
2595                f.write_str("r#")?;
2596                self.symbol
2597            }
2598            IdentPrintMode::RawLifetime => {
2599                f.write_str("'r#")?;
2600                let s = self
2601                    .symbol
2602                    .as_str()
2603                    .strip_prefix("'")
2604                    .expect("only lifetime idents should be passed with RawLifetime mode");
2605                Symbol::intern(s)
2606            }
2607        };
2608        s.fmt(f)
2609    }
2610}
2611
2612/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2613/// construction for "local variable hygiene" comparisons.
2614///
2615/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2616/// This ensures compile-time safety and avoids manual normalization calls.
2617#[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)]
2618pub struct MacroRulesNormalizedIdent(Ident);
2619
2620impl MacroRulesNormalizedIdent {
2621    #[inline]
2622    pub fn new(ident: Ident) -> Self {
2623        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2624    }
2625
2626    pub fn symbol(&self) -> Symbol {
2627        self.0.name
2628    }
2629
2630    pub fn ident(&self) -> Ident {
2631        self.0
2632    }
2633}
2634
2635impl fmt::Debug for MacroRulesNormalizedIdent {
2636    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2637        fmt::Debug::fmt(&self.0, f)
2638    }
2639}
2640
2641impl fmt::Display for MacroRulesNormalizedIdent {
2642    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2643        fmt::Display::fmt(&self.0, f)
2644    }
2645}
2646
2647/// An interned UTF-8 string.
2648///
2649/// Internally, a `Symbol` is implemented as an index, and all operations
2650/// (including hashing, equality, and ordering) operate on that index. The use
2651/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2652/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2653///
2654/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2655/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2656#[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)]
2657pub struct Symbol(SymbolIndex);
2658
2659// Used within both `Symbol` and `ByteSymbol`.
2660impl ::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! {
2661    #[orderable]
2662    struct SymbolIndex {}
2663}
2664
2665impl Symbol {
2666    /// Avoid this except for things like deserialization of previously
2667    /// serialized symbols, and testing. Use `intern` instead.
2668    pub const fn new(n: u32) -> Self {
2669        Symbol(SymbolIndex::from_u32(n))
2670    }
2671
2672    /// Maps a string to its interned representation.
2673    #[rustc_diagnostic_item = "SymbolIntern"]
2674    #[inline]
2675    pub fn intern(str: &str) -> Self {
2676        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2677    }
2678
2679    /// Access the underlying string. This is a slowish operation because it
2680    /// requires locking the symbol interner.
2681    ///
2682    /// Note that the lifetime of the return value is a lie. It's not the same
2683    /// as `&self`, but actually tied to the lifetime of the underlying
2684    /// interner. Interners are long-lived, and there are very few of them, and
2685    /// this function is typically used for short-lived things, so in practice
2686    /// it works out ok.
2687    #[inline]
2688    pub fn as_str(&self) -> &str {
2689        with_session_globals(|session_globals| unsafe {
2690            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2691        })
2692    }
2693
2694    pub fn as_u32(self) -> u32 {
2695        self.0.as_u32()
2696    }
2697
2698    pub fn is_empty(self) -> bool {
2699        self == sym::empty
2700    }
2701
2702    /// This method is supposed to be used in error messages, so it's expected to be
2703    /// identical to printing the original identifier token written in source code
2704    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2705    /// or edition, so we have to guess the rawness using the global edition.
2706    pub fn to_ident_string(self) -> String {
2707        // Avoid creating an empty identifier, because that asserts in debug builds.
2708        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2709    }
2710
2711    /// Checks if `self` is similar to any symbol in `candidates`.
2712    ///
2713    /// The returned boolean represents whether the candidate is the same symbol with a different
2714    /// casing.
2715    ///
2716    /// All the candidates are assumed to be lowercase.
2717    pub fn find_similar(
2718        self,
2719        candidates: &[Symbol],
2720    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2721        let lowercase = self.as_str().to_lowercase();
2722        let lowercase_sym = Symbol::intern(&lowercase);
2723        if candidates.contains(&lowercase_sym) {
2724            Some((lowercase_sym, true))
2725        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2726            Some((similar_sym, false))
2727        } else {
2728            None
2729        }
2730    }
2731}
2732
2733impl fmt::Debug for Symbol {
2734    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2735        fmt::Debug::fmt(self.as_str(), f)
2736    }
2737}
2738
2739impl fmt::Display for Symbol {
2740    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2741        fmt::Display::fmt(self.as_str(), f)
2742    }
2743}
2744
2745impl StableHash for Symbol {
2746    #[inline]
2747    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2748        self.as_str().stable_hash(hcx, hasher);
2749    }
2750}
2751
2752impl StableCompare for Symbol {
2753    const CAN_USE_UNSTABLE_SORT: bool = true;
2754
2755    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2756        self.as_str().cmp(other.as_str())
2757    }
2758}
2759
2760/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2761/// it has fewer operations defined than `Symbol`.
2762#[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)]
2763pub struct ByteSymbol(SymbolIndex);
2764
2765impl ByteSymbol {
2766    /// Avoid this except for things like deserialization of previously
2767    /// serialized symbols, and testing. Use `intern` instead.
2768    pub const fn new(n: u32) -> Self {
2769        ByteSymbol(SymbolIndex::from_u32(n))
2770    }
2771
2772    /// Maps a string to its interned representation.
2773    pub fn intern(byte_str: &[u8]) -> Self {
2774        with_session_globals(|session_globals| {
2775            session_globals.symbol_interner.intern_byte_str(byte_str)
2776        })
2777    }
2778
2779    /// Like `Symbol::as_str`.
2780    pub fn as_byte_str(&self) -> &[u8] {
2781        with_session_globals(|session_globals| unsafe {
2782            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2783        })
2784    }
2785
2786    pub fn as_u32(self) -> u32 {
2787        self.0.as_u32()
2788    }
2789}
2790
2791impl fmt::Debug for ByteSymbol {
2792    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2793        fmt::Debug::fmt(self.as_byte_str(), f)
2794    }
2795}
2796
2797impl StableHash for ByteSymbol {
2798    #[inline]
2799    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2800        self.as_byte_str().stable_hash(hcx, hasher);
2801    }
2802}
2803
2804// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2805// string with identical contents (e.g. "foo" and b"foo") are both interned,
2806// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2807// will have the same index.
2808pub(crate) struct Interner(Lock<InternerInner>);
2809
2810// The `&'static [u8]`s in this type actually point into the arena.
2811//
2812// This type is private to prevent accidentally constructing more than one
2813// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2814// between `Interner`s.
2815struct InternerInner {
2816    arena: DroplessArena,
2817    indices: HashTable<(&'static [u8], u32)>,
2818    byte_strs: Vec<&'static [u8]>,
2819}
2820
2821impl Interner {
2822    // These arguments are `&str`, but because of the sharing, we are
2823    // effectively pre-interning all these strings for both `Symbol` and
2824    // `ByteSymbol`.
2825    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2826        let values = init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes());
2827        let (size_hint, _) = values.size_hint();
2828        let mut conflicting_values: Vec<&[u8]> = Vec::new();
2829
2830        let mut indices: HashTable<(&'static [u8], u32)> = HashTable::with_capacity(size_hint);
2831        let hasher = FxBuildHasher::default();
2832
2833        let mut byte_strs: Vec<&'static [u8]> = Vec::with_capacity(size_hint);
2834
2835        for v in values {
2836            match indices.entry(hasher.hash_one(&v), |&(s, _)| s == v, |&(s, _)| hasher.hash_one(s))
2837            {
2838                Entry::Occupied(v) => conflicting_values.push(v.get().0),
2839                Entry::Vacant(view) => {
2840                    view.insert((v, byte_strs.len() as u32));
2841                    byte_strs.push(v);
2842                }
2843            }
2844        }
2845
2846        if conflicting_values.len() != 0 {
2847            {
    ::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!(
2848                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2849                conflicting_values
2850            )
2851        }
2852
2853        Interner(Lock::new(InternerInner { arena: Default::default(), indices, byte_strs }))
2854    }
2855
2856    fn intern_str(&self, str: &str) -> Symbol {
2857        Symbol::new(self.intern_inner(str.as_bytes()))
2858    }
2859
2860    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
2861        ByteSymbol::new(self.intern_inner(byte_str))
2862    }
2863
2864    #[inline]
2865    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
2866        let hasher = FxBuildHasher::default();
2867        let hash_of_byte_str = hasher.hash_one(byte_str);
2868
2869        self.0.with_lock(|inner| {
2870            match inner.indices.entry(
2871                hash_of_byte_str,
2872                |&(s, _)| s == byte_str,
2873                |&(s, _)| hasher.hash_one(s),
2874            ) {
2875                Entry::Occupied(v) => v.get().1,
2876                Entry::Vacant(view) => {
2877                    let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
2878
2879                    // SAFETY: we can extend the arena allocation to `'static` because we
2880                    // only access these while the arena is still alive.
2881                    let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
2882                    let idx = inner.byte_strs.len() as u32;
2883                    view.insert((byte_str, idx));
2884                    inner.byte_strs.push(byte_str);
2885                    idx
2886                }
2887            }
2888        })
2889    }
2890
2891    /// Get the symbol as a string.
2892    ///
2893    /// [`Symbol::as_str()`] should be used in preference to this function.
2894    fn get_str(&self, symbol: Symbol) -> &str {
2895        let byte_str = self.get_inner(symbol.0.as_usize());
2896        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
2897        unsafe { str::from_utf8_unchecked(byte_str) }
2898    }
2899
2900    /// Get the symbol as a string.
2901    ///
2902    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
2903    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
2904        self.get_inner(symbol.0.as_usize())
2905    }
2906
2907    fn get_inner(&self, index: usize) -> &[u8] {
2908        self.0.with_lock(|inner| inner.byte_strs[index])
2909    }
2910}
2911
2912// This module has a very short name because it's used a lot.
2913/// This module contains all the defined keyword `Symbol`s.
2914///
2915/// Given that `kw` is imported, use them like `kw::keyword_name`.
2916/// For example `kw::Loop` or `kw::Break`.
2917pub mod kw {
2918    pub use super::kw_generated::*;
2919}
2920
2921// This module has a very short name because it's used a lot.
2922/// This module contains all the defined non-keyword `Symbol`s.
2923///
2924/// Given that `sym` is imported, use them like `sym::symbol_name`.
2925/// For example `sym::rustfmt` or `sym::u8`.
2926pub mod sym {
2927    // Used from a macro in `librustc_feature/accepted.rs`
2928    use super::Symbol;
2929    pub use super::kw::MacroRules as macro_rules;
2930    #[doc(inline)]
2931    pub use super::sym_generated::*;
2932
2933    // Used quite often in relation to C ABI.
2934    pub const C: Symbol = ascii_letter_digit('C').unwrap();
2935
2936    // RISC-V stuff
2937    #[expect(non_upper_case_globals)]
2938    pub const f: Symbol = ascii_letter_digit('f').unwrap();
2939    #[expect(non_upper_case_globals)]
2940    pub const d: Symbol = ascii_letter_digit('d').unwrap();
2941
2942    /// Get the symbol for an integer.
2943    ///
2944    /// The first few non-negative integers each have a static symbol and therefore
2945    /// are fast.
2946    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
2947        if let Result::Ok(idx) = n.try_into() {
2948            if idx < 10 {
2949                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
2950            }
2951        }
2952        let mut buffer = itoa::Buffer::new();
2953        let printed = buffer.format(n);
2954        Symbol::intern(printed)
2955    }
2956
2957    pub const fn ascii_letter_digit(c: char) -> Option<Symbol> {
2958        let i = c as u32;
2959        Option::Some(Symbol::new(match c {
2960            '0'..='9' => super::SYMBOL_DIGITS_BASE + (i - '0' as u32),
2961            'A'..='Z' => super::SYMBOL_UPPERCASE_LETTERS_BASE + (i - 'A' as u32),
2962            'a'..='z' => super::SYMBOL_LOWERCASE_LETTERS_BASE + (i - 'a' as u32),
2963            _ => return Option::None,
2964        }))
2965    }
2966
2967    pub fn character(c: char) -> Symbol {
2968        ascii_letter_digit(c).unwrap_or_else(|| {
2969            let mut buf: [u8; char::MAX_LEN_UTF8] = Default::default();
2970            Symbol::intern(c.encode_utf8(&mut buf))
2971        })
2972    }
2973}
2974
2975impl Symbol {
2976    fn is_special(self) -> bool {
2977        self <= kw::Underscore
2978    }
2979
2980    fn is_used_keyword_always(self) -> bool {
2981        self >= kw::As && self <= kw::While
2982    }
2983
2984    fn is_unused_keyword_always(self) -> bool {
2985        self >= kw::Abstract && self <= kw::Yield
2986    }
2987
2988    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
2989        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
2990    }
2991
2992    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2993        self == kw::Gen && edition().at_least_rust_2024()
2994            || self == kw::Try && edition().at_least_rust_2018()
2995    }
2996
2997    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2998        self.is_special()
2999            || self.is_used_keyword_always()
3000            || self.is_unused_keyword_always()
3001            || self.is_used_keyword_conditional(edition)
3002            || self.is_unused_keyword_conditional(edition)
3003    }
3004
3005    pub fn is_weak(self) -> bool {
3006        self >= kw::Auto && self <= kw::Yeet
3007    }
3008
3009    /// A keyword or reserved identifier that can be used as a path segment.
3010    pub fn is_path_segment_keyword(self) -> bool {
3011        self == kw::Super
3012            || self == kw::SelfLower
3013            || self == kw::SelfUpper
3014            || self == kw::Crate
3015            || self == kw::PathRoot
3016            || self == kw::DollarCrate
3017    }
3018
3019    /// Returns `true` if the symbol is `true` or `false`.
3020    pub fn is_bool_lit(self) -> bool {
3021        self == kw::True || self == kw::False
3022    }
3023
3024    /// Returns `true` if this symbol can be a raw identifier.
3025    pub fn can_be_raw(self) -> bool {
3026        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
3027    }
3028
3029    /// Was this symbol index predefined in the compiler's `symbols!` macro?
3030    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
3031    /// takes a `u32` argument instead of a `&self` argument. Use with care.
3032    pub fn is_predefined(index: u32) -> bool {
3033        index < PREDEFINED_SYMBOLS_COUNT
3034    }
3035}
3036
3037impl Ident {
3038    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
3039    /// unnamed method parameters, crate root module, error recovery etc.
3040    pub fn is_special(self) -> bool {
3041        self.name.is_special()
3042    }
3043
3044    /// Returns `true` if the token is a keyword used in the language.
3045    pub fn is_used_keyword(self) -> bool {
3046        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3047        self.name.is_used_keyword_always()
3048            || self.name.is_used_keyword_conditional(|| self.span.edition())
3049    }
3050
3051    /// Returns `true` if the token is a keyword reserved for possible future use.
3052    pub fn is_unused_keyword(self) -> bool {
3053        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3054        self.name.is_unused_keyword_always()
3055            || self.name.is_unused_keyword_conditional(|| self.span.edition())
3056    }
3057
3058    /// Returns `true` if the token is either a special identifier or a keyword.
3059    pub fn is_reserved(self) -> bool {
3060        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3061        self.name.is_reserved(|| self.span.edition())
3062    }
3063
3064    /// A keyword or reserved identifier that can be used as a path segment.
3065    pub fn is_path_segment_keyword(self) -> bool {
3066        self.name.is_path_segment_keyword()
3067    }
3068
3069    /// We see this identifier in a normal identifier position, like variable name or a type.
3070    /// How was it written originally? Did it use the raw form? Let's try to guess.
3071    pub fn is_raw_guess(self) -> bool {
3072        self.name.can_be_raw() && self.is_reserved()
3073    }
3074
3075    /// Given the name of a lifetime without the first quote (`'`),
3076    /// returns whether the lifetime name is reserved (therefore invalid)
3077    pub fn is_reserved_lifetime(self) -> bool {
3078        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
3079    }
3080
3081    pub fn is_raw_lifetime_guess(self) -> bool {
3082        // Check that the name isn't just a single quote.
3083        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
3084        if self.name.as_str() == "'" {
3085            return false;
3086        }
3087        let ident_without_apostrophe = self.without_first_quote();
3088        ident_without_apostrophe.name != self.name
3089            && ident_without_apostrophe.name.can_be_raw()
3090            && ident_without_apostrophe.is_reserved_lifetime()
3091    }
3092
3093    pub fn guess_print_mode(self) -> IdentPrintMode {
3094        if self.is_raw_lifetime_guess() {
3095            IdentPrintMode::RawLifetime
3096        } else if self.is_raw_guess() {
3097            IdentPrintMode::RawIdent
3098        } else {
3099            IdentPrintMode::Normal
3100        }
3101    }
3102
3103    /// Whether this would be the identifier for a tuple field like `self.0`, as
3104    /// opposed to a named field like `self.thing`.
3105    pub fn is_numeric(self) -> bool {
3106        self.as_str().bytes().all(|b| b.is_ascii_digit())
3107    }
3108}
3109
3110/// Collect all the keywords in a given edition into a vector.
3111///
3112/// *Note:* Please update this if a new keyword is added beyond the current
3113/// range.
3114pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
3115    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
3116        .filter_map(|kw| {
3117            let kw = Symbol::new(kw);
3118            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
3119                Some(kw)
3120            } else {
3121                None
3122            }
3123        })
3124        .collect()
3125}