Skip to main content

rustc_span/
symbol.rs

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