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