Skip to main content

rustc_span/
symbol.rs

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