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_uninit",
                        "maybe_uninit_uninit", "maybe_uninit_zeroed",
                        "mem_align_const", "mem_discriminant", "mem_drop",
                        "mem_forget", "mem_size_const", "mem_swap",
                        "mem_uninitialized", "mem_variant_count", "mem_zeroed",
                        "member_constraints", "memory", "memtag", "message", "meta",
                        "meta_sized", "metadata_type", "mgca_type_const_syntax",
                        "min_const_fn", "min_const_generics", "min_const_unsafe_fn",
                        "min_exhaustive_patterns", "min_generic_const_args",
                        "min_specialization", "min_type_alias_impl_trait",
                        "minimumf16", "minimumf32", "minimumf64", "minimumf128",
                        "minnumf16", "minnumf32", "minnumf64", "minnumf128", "mips",
                        "mips32r6", "mips64", "mips64r6", "mips_target_feature",
                        "mir_assume", "mir_basic_block", "mir_call",
                        "mir_cast_ptr_to_ptr", "mir_cast_transmute",
                        "mir_cast_unsize", "mir_checked", "mir_debuginfo",
                        "mir_discriminant", "mir_drop", "mir_field", "mir_goto",
                        "mir_make_place", "mir_move", "mir_offset",
                        "mir_ptr_metadata", "mir_retag", "mir_return",
                        "mir_return_to", "mir_set_discriminant", "mir_static",
                        "mir_static_mut", "mir_storage_dead", "mir_storage_live",
                        "mir_tail_call", "mir_unreachable", "mir_unwind_cleanup",
                        "mir_unwind_continue", "mir_unwind_resume",
                        "mir_unwind_terminate", "mir_unwind_terminate_reason",
                        "mir_unwind_unreachable", "mir_variant", "miri", "mmx_reg",
                        "modifiers", "module", "module_path", "more_maybe_bounds",
                        "more_qualified_paths", "more_struct_aliases",
                        "movbe_target_feature", "move_ref_pattern",
                        "move_size_limit", "movrs_target_feature", "msp430", "mul",
                        "mul_assign", "mul_with_overflow",
                        "multiple_supertrait_upcastable", "must_not_suspend",
                        "must_use", "mut_preserve_binding_mode_2024", "mut_ref",
                        "mutable", "naked", "naked_asm", "naked_functions",
                        "naked_functions_rustic_abi",
                        "naked_functions_target_feature", "name", "names",
                        "native_link_modifiers", "native_link_modifiers_as_needed",
                        "native_link_modifiers_bundle",
                        "native_link_modifiers_verbatim",
                        "native_link_modifiers_whole_archive", "natvis_file", "ne",
                        "needs_allocator", "needs_drop", "needs_panic_runtime",
                        "neg", "negate_unsigned", "negative_bounds",
                        "negative_impls", "neon", "nested", "never",
                        "never_patterns", "never_type", "never_type_fallback",
                        "new", "new_binary", "new_debug", "new_debug_noop",
                        "new_display", "new_lower_exp", "new_lower_hex",
                        "new_octal", "new_pointer", "new_range", "new_unchecked",
                        "new_upper_exp", "new_upper_hex", "next", "nll", "no",
                        "no_builtins", "no_core", "no_coverage", "no_crate_inject",
                        "no_debug", "no_default_passes", "no_implicit_prelude",
                        "no_inline", "no_link", "no_main", "no_mangle",
                        "no_sanitize", "no_stack_check", "no_std", "nomem",
                        "non_ascii_idents", "non_exhaustive",
                        "non_exhaustive_omitted_patterns_lint",
                        "non_lifetime_binders", "non_modrs_mods", "nonblocking",
                        "none", "nontemporal_store", "noop_method_borrow",
                        "noop_method_clone", "noop_method_deref", "noprefix",
                        "noreturn", "nostack", "not", "notable_trait", "note",
                        "null", "nvptx64", "nvptx_target_feature",
                        "object_safe_for_dispatch", "of", "off", "offload",
                        "offset", "offset_of", "offset_of_enum", "offset_of_nested",
                        "offset_of_slice", "ok_or_else", "old_name",
                        "omit_gdb_pretty_printer_section", "on", "on_const",
                        "on_unimplemented", "opaque", "opaque_generic_const_args",
                        "<opaque>", "ops", "opt_out_copy", "optimize",
                        "optimize_attribute", "optimized", "optin_builtin_traits",
                        "option", "option_env", "options", "or", "or_patterns",
                        "ord_cmp_method", "other", "out", "output",
                        "overflow_checks", "overlapping_marker_traits", "owned_box",
                        "packed", "packed_bundled_libs", "panic", "panic_2015",
                        "panic_2021", "panic_abort", "panic_bounds_check",
                        "panic_cannot_unwind", "panic_const_add_overflow",
                        "panic_const_async_fn_resumed",
                        "panic_const_async_fn_resumed_drop",
                        "panic_const_async_fn_resumed_panic",
                        "panic_const_async_gen_fn_resumed",
                        "panic_const_async_gen_fn_resumed_drop",
                        "panic_const_async_gen_fn_resumed_panic",
                        "panic_const_coroutine_resumed",
                        "panic_const_coroutine_resumed_drop",
                        "panic_const_coroutine_resumed_panic",
                        "panic_const_div_by_zero", "panic_const_div_overflow",
                        "panic_const_gen_fn_none", "panic_const_gen_fn_none_drop",
                        "panic_const_gen_fn_none_panic", "panic_const_mul_overflow",
                        "panic_const_neg_overflow", "panic_const_rem_by_zero",
                        "panic_const_rem_overflow", "panic_const_shl_overflow",
                        "panic_const_shr_overflow", "panic_const_sub_overflow",
                        "panic_display", "panic_fmt", "panic_handler", "panic_impl",
                        "panic_implementation", "panic_in_cleanup", "panic_info",
                        "panic_invalid_enum_construction", "panic_location",
                        "panic_misaligned_pointer_dereference", "panic_nounwind",
                        "panic_null_pointer_dereference", "panic_runtime",
                        "panic_str_2015", "panic_unwind", "panicking",
                        "param_attrs", "parent_label", "partial_cmp", "partial_ord",
                        "passes", "pat", "pat_param", "patchable_function_entry",
                        "path", "pattern_complexity_limit", "pattern_parentheses",
                        "pattern_type", "pattern_type_range_trait", "pattern_types",
                        "phantom_data", "phase", "pic", "pie", "pin",
                        "pin_ergonomics", "pin_v2", "platform_intrinsics", "plugin",
                        "plugin_registrar", "plugins", "pointee", "pointee_sized",
                        "pointee_trait", "pointer", "poll", "post-cleanup",
                        "post-lto", "postfix_match", "powerpc", "powerpc64",
                        "powerpc_target_feature", "powf16", "powf32", "powf64",
                        "powf128", "powif16", "powif32", "powif64", "powif128",
                        "pre-lto", "precise_capturing",
                        "precise_capturing_in_traits",
                        "precise_pointer_size_matching", "predicates",
                        "pref_align_of", "prefetch_read_data",
                        "prefetch_read_instruction", "prefetch_write_data",
                        "prefetch_write_instruction", "prefix_nops", "preg",
                        "prelude", "prelude_import", "preserves_flags",
                        "prfchw_target_feature", "proc-macro", "proc_macro",
                        "proc_macro_attribute", "proc_macro_derive",
                        "proc_macro_expr", "proc_macro_gen", "proc_macro_hygiene",
                        "proc_macro_internals", "proc_macro_mod",
                        "proc_macro_non_items", "proc_macro_path_invoc",
                        "profiler_runtime", "ptr", "ptr_cast", "ptr_cast_const",
                        "ptr_cast_mut", "ptr_const_is_null", "ptr_copy",
                        "ptr_copy_nonoverlapping", "ptr_from_ref",
                        "ptr_guaranteed_cmp", "ptr_is_null", "ptr_mask",
                        "ptr_metadata", "ptr_null", "ptr_null_mut",
                        "ptr_offset_from", "ptr_offset_from_unsigned", "ptr_read",
                        "ptr_read_unaligned", "ptr_replace", "ptr_swap",
                        "ptr_swap_nonoverlapping", "ptr_write", "ptr_write_bytes",
                        "ptr_write_unaligned", "ptr_write_volatile",
                        "pub_macro_rules", "pub_restricted", "public", "pure",
                        "pushpop_unsafe", "qreg", "qreg_low4", "qreg_low8",
                        "quad_precision_float", "question_mark", "quote",
                        "range_inclusive_new", "raw-dylib", "raw_dylib",
                        "raw_dylib_elf", "raw_eq", "raw_identifiers", "raw_ref_op",
                        "re_rebalance_coherence", "read_via_copy", "readonly",
                        "realloc", "realtime", "reason", "reborrow", "receiver",
                        "receiver_target", "recursion_limit",
                        "reexport_test_harness_main", "ref_pat_eat_one_layer_2024",
                        "ref_pat_eat_one_layer_2024_structural",
                        "ref_pat_everywhere", "ref_unwind_safe_trait", "reference",
                        "reflect", "reg", "reg16", "reg32", "reg64", "reg_abcd",
                        "reg_addr", "reg_byte", "reg_data", "reg_iw", "reg_nonzero",
                        "reg_pair", "reg_ptr", "reg_upper", "register_attr",
                        "register_tool", "relaxed_adts", "relaxed_struct_unsize",
                        "relocation_model", "rem", "rem_assign", "repr", "repr128",
                        "repr_align", "repr_align_enum", "repr_packed", "repr_simd",
                        "repr_transparent", "require", "reserve-x18", "residual",
                        "result", "result_ffi_guarantees",
                        "return_position_impl_trait_in_trait",
                        "return_type_notation", "riscv32", "riscv64",
                        "riscv_target_feature", "rlib", "ropi", "ropi-rwpi",
                        "rotate_left", "rotate_right", "round_ties_even_f16",
                        "round_ties_even_f32", "round_ties_even_f64",
                        "round_ties_even_f128", "roundf16", "roundf32", "roundf64",
                        "roundf128", "rtm_target_feature", "runtime", "rust",
                        "rust_2015", "rust_2018", "rust_2018_preview", "rust_2021",
                        "rust_2024", "rust_analyzer", "rust_begin_unwind",
                        "rust_cold_cc", "rust_eh_catch_typeinfo",
                        "rust_eh_personality", "rust_future", "rust_logo",
                        "rust_out", "rust_preserve_none_cc", "rustc", "rustc_abi",
                        "rustc_align", "rustc_align_static", "rustc_allocator",
                        "rustc_allocator_zeroed", "rustc_allocator_zeroed_variant",
                        "rustc_allow_const_fn_unstable",
                        "rustc_allow_incoherent_impl",
                        "rustc_allowed_through_unstable_modules", "rustc_as_ptr",
                        "rustc_attrs", "rustc_autodiff", "rustc_builtin_macro",
                        "rustc_capture_analysis", "rustc_clean",
                        "rustc_coherence_is_core", "rustc_coinductive",
                        "rustc_confusables", "rustc_const_stable",
                        "rustc_const_stable_indirect", "rustc_const_unstable",
                        "rustc_conversion_suggestion", "rustc_deallocator",
                        "rustc_def_path", "rustc_default_body_unstable",
                        "rustc_delayed_bug_from_inside_query",
                        "rustc_deny_explicit_impl", "rustc_deprecated_safe_2024",
                        "rustc_diagnostic_item", "rustc_diagnostic_macros",
                        "rustc_do_not_const_check", "rustc_doc_primitive",
                        "rustc_driver", "rustc_dummy", "rustc_dump_def_parents",
                        "rustc_dump_item_bounds", "rustc_dump_predicates",
                        "rustc_dump_user_args", "rustc_dump_vtable",
                        "rustc_dyn_incompatible_trait",
                        "rustc_effective_visibility", "rustc_eii_foreign_item",
                        "rustc_evaluate_where_clauses", "rustc_expected_cgu_reuse",
                        "rustc_force_inline", "rustc_has_incoherent_inherent_impls",
                        "rustc_hidden_type_of_opaques", "rustc_if_this_changed",
                        "rustc_inherit_overflow_checks", "rustc_insignificant_dtor",
                        "rustc_intrinsic", "rustc_intrinsic_const_stable_indirect",
                        "rustc_layout", "rustc_layout_scalar_valid_range_end",
                        "rustc_layout_scalar_valid_range_start",
                        "rustc_legacy_const_generics",
                        "rustc_lint_opt_deny_field_access", "rustc_lint_opt_ty",
                        "rustc_lint_query_instability",
                        "rustc_lint_untracked_query_information",
                        "rustc_macro_transparency", "rustc_main", "rustc_mir",
                        "rustc_must_implement_one_of",
                        "rustc_never_returns_null_ptr", "rustc_never_type_options",
                        "rustc_no_implicit_autorefs", "rustc_no_implicit_bounds",
                        "rustc_no_mir_inline", "rustc_non_const_trait_method",
                        "rustc_nonnull_optimization_guaranteed", "rustc_nounwind",
                        "rustc_objc_class", "rustc_objc_selector",
                        "rustc_object_lifetime_default", "rustc_offload_kernel",
                        "rustc_on_unimplemented", "rustc_outlives",
                        "rustc_paren_sugar", "rustc_partition_codegened",
                        "rustc_partition_reused", "rustc_pass_by_value",
                        "rustc_pass_indirectly_in_non_rustic_abis", "rustc_peek",
                        "rustc_peek_liveness", "rustc_peek_maybe_init",
                        "rustc_peek_maybe_uninit", "rustc_preserve_ub_checks",
                        "rustc_private", "rustc_proc_macro_decls",
                        "rustc_promotable", "rustc_pub_transparent",
                        "rustc_reallocator", "rustc_regions",
                        "rustc_reservation_impl", "rustc_scalable_vector",
                        "rustc_should_not_be_called_on_const_items",
                        "rustc_simd_monomorphize_lane_limit",
                        "rustc_skip_during_method_dispatch",
                        "rustc_specialization_trait", "rustc_std_internal_symbol",
                        "rustc_strict_coherence", "rustc_symbol_name",
                        "rustc_test_marker", "rustc_then_this_would_need",
                        "rustc_trivial_field_reads",
                        "rustc_unsafe_specialization_marker", "rustc_variance",
                        "rustc_variance_of_opaques", "rustdoc", "rustdoc_internals",
                        "rustdoc_missing_doc_code_examples", "rustfmt",
                        "rvalue_static_promotion", "rwpi", "s390x",
                        "s390x_target_feature", "s390x_target_feature_vector",
                        "safety", "sanitize", "sanitizer_cfi_generalize_pointers",
                        "sanitizer_cfi_normalize_integers", "sanitizer_runtime",
                        "saturating_add", "saturating_sub", "sdylib",
                        "search_unbox", "select_unpredictable", "self_in_typedefs",
                        "self_struct_ctor", "semiopaque", "sha2", "sha3",
                        "sha512_sm_x86", "shadow_call_stack", "shallow", "shl",
                        "shl_assign", "shorter_tail_lifetimes", "should_panic",
                        "show", "shr", "shr_assign", "signed", "simd", "simd_add",
                        "simd_and", "simd_arith_offset", "simd_as", "simd_bitmask",
                        "simd_bitreverse", "simd_bswap", "simd_carryless_mul",
                        "simd_cast", "simd_cast_ptr", "simd_ceil", "simd_ctlz",
                        "simd_ctpop", "simd_cttz", "simd_div", "simd_eq",
                        "simd_expose_provenance", "simd_extract",
                        "simd_extract_dyn", "simd_fabs", "simd_fcos", "simd_fexp",
                        "simd_fexp2", "simd_ffi", "simd_flog", "simd_flog2",
                        "simd_flog10", "simd_floor", "simd_fma", "simd_fmax",
                        "simd_fmin", "simd_fsin", "simd_fsqrt", "simd_funnel_shl",
                        "simd_funnel_shr", "simd_gather", "simd_ge", "simd_gt",
                        "simd_insert", "simd_insert_dyn", "simd_le", "simd_lt",
                        "simd_masked_load", "simd_masked_store", "simd_mul",
                        "simd_ne", "simd_neg", "simd_or", "simd_reduce_add_ordered",
                        "simd_reduce_add_unordered", "simd_reduce_all",
                        "simd_reduce_and", "simd_reduce_any", "simd_reduce_max",
                        "simd_reduce_min", "simd_reduce_mul_ordered",
                        "simd_reduce_mul_unordered", "simd_reduce_or",
                        "simd_reduce_xor", "simd_relaxed_fma", "simd_rem",
                        "simd_round", "simd_round_ties_even", "simd_saturating_add",
                        "simd_saturating_sub", "simd_scatter", "simd_select",
                        "simd_select_bitmask", "simd_shl", "simd_shr",
                        "simd_shuffle", "simd_shuffle_const_generic", "simd_splat",
                        "simd_sub", "simd_trunc", "simd_with_exposed_provenance",
                        "simd_xor", "since", "sinf16", "sinf32", "sinf64",
                        "sinf128", "size", "size_of", "size_of_val", "sized",
                        "sized_hierarchy", "slice", "slice_from_raw_parts",
                        "slice_from_raw_parts_mut", "slice_get_unchecked",
                        "slice_len_fn", "slice_patterns", "slicing_syntax", "soft",
                        "sparc", "sparc64", "sparc_target_feature", "spe_acc",
                        "specialization", "speed", "spirv", "spotlight", "sqrtf16",
                        "sqrtf32", "sqrtf64", "sqrtf128", "sreg", "sreg_low16",
                        "sse", "sse2", "sse4a_target_feature", "stable",
                        "staged_api", "start", "state", "static_align",
                        "static_in_const", "static_nobundle", "static_recursion",
                        "staticlib", "std", "std_lib_injection", "std_panic",
                        "std_panic_2015_macro", "std_panic_macro", "stmt",
                        "stmt_expr_attributes", "stop_after_dataflow", "store",
                        "str", "str_from_utf8", "str_from_utf8_mut",
                        "str_from_utf8_unchecked", "str_from_utf8_unchecked_mut",
                        "str_inherent_from_utf8", "str_inherent_from_utf8_mut",
                        "str_inherent_from_utf8_unchecked",
                        "str_inherent_from_utf8_unchecked_mut",
                        "strict_provenance_lints", "string_deref_patterns",
                        "stringify", "struct_field_attributes", "struct_inherit",
                        "struct_variant", "structural_match", "structural_peq",
                        "sub", "sub_assign", "sub_with_overflow", "suggestion",
                        "super_let", "supertrait_item_shadowing", "sym", "sync",
                        "synthetic", "t32", "target", "target_abi", "target_arch",
                        "target_endian", "target_env", "target_family",
                        "target_feature", "target_feature_11",
                        "target_feature_inline_always", "target_has_atomic",
                        "target_has_atomic_equal_alignment",
                        "target_has_atomic_load_store", "target_has_reliable_f16",
                        "target_has_reliable_f16_math", "target_has_reliable_f128",
                        "target_has_reliable_f128_math", "target_os",
                        "target_pointer_width", "target_thread_local",
                        "target_vendor", "tbm_target_feature", "termination",
                        "termination_trait", "termination_trait_test", "test",
                        "test_2018_feature", "test_accepted_feature", "test_case",
                        "test_removed_feature", "test_runner", "test_unstable_lint",
                        "thread", "thread_local", "three_way_compare", "thumb2",
                        "thumb-mode", "tmm_reg", "to_string", "to_vec",
                        "tool_attributes", "tool_lints", "trace_macros",
                        "track_caller", "trait_alias", "trait_ty",
                        "trait_upcasting", "transmute", "transmute_generic_consts",
                        "transmute_opts", "transmute_trait", "transmute_unchecked",
                        "transparent", "transparent_enums", "transparent_unions",
                        "trivial_bounds", "trivial_clone", "truncf16", "truncf32",
                        "truncf64", "truncf128", "try_blocks",
                        "try_blocks_heterogeneous", "try_capture", "try_from",
                        "try_into", "try_trait_v2", "try_trait_v2_residual",
                        "try_update", "tt", "tuple", "tuple_indexing",
                        "tuple_trait", "two_phase", "ty",
                        "type_alias_enum_variants", "type_alias_impl_trait",
                        "type_ascribe", "type_ascription",
                        "type_changing_struct_update", "type_id", "type_id_eq",
                        "type_id_vtable", "type_info", "type_ir",
                        "type_ir_infer_ctxt_like", "type_ir_inherent",
                        "type_ir_interner", "type_length_limit", "type_macros",
                        "type_name", "type_of", "type_privacy_lints",
                        "typed_swap_nonoverlapping", "u8", "u8_legacy_const_max",
                        "u8_legacy_const_min", "u8_legacy_fn_max_value",
                        "u8_legacy_fn_min_value", "u8_legacy_mod", "u16",
                        "u16_legacy_const_max", "u16_legacy_const_min",
                        "u16_legacy_fn_max_value", "u16_legacy_fn_min_value",
                        "u16_legacy_mod", "u32", "u32_legacy_const_max",
                        "u32_legacy_const_min", "u32_legacy_fn_max_value",
                        "u32_legacy_fn_min_value", "u32_legacy_mod", "u64",
                        "u64_legacy_const_max", "u64_legacy_const_min",
                        "u64_legacy_fn_max_value", "u64_legacy_fn_min_value",
                        "u64_legacy_mod", "u128", "u128_legacy_const_max",
                        "u128_legacy_const_min", "u128_legacy_fn_max_value",
                        "u128_legacy_fn_min_value", "u128_legacy_mod", "ub_checks",
                        "unaligned_volatile_load", "unaligned_volatile_store",
                        "unboxed_closures", "unchecked_add", "unchecked_div",
                        "unchecked_funnel_shl", "unchecked_funnel_shr",
                        "unchecked_mul", "unchecked_rem", "unchecked_shl",
                        "unchecked_shr", "unchecked_sub", "undecorated",
                        "underscore_const_names", "underscore_imports",
                        "underscore_lifetimes", "uniform_paths", "unit",
                        "universal_impl_trait", "unix", "unlikely", "unmarked_api",
                        "unnamed_fields", "unpin", "unqualified_local_imports",
                        "unreachable", "unreachable_2015", "unreachable_2015_macro",
                        "unreachable_2021", "unreachable_code",
                        "unreachable_display", "unreachable_macro",
                        "unrestricted_attribute_tokens", "unsafe_attributes",
                        "unsafe_binders", "unsafe_block_in_unsafe_fn",
                        "unsafe_cell", "unsafe_cell_raw_get", "unsafe_eii",
                        "unsafe_extern_blocks", "unsafe_fields",
                        "unsafe_no_drop_flag", "unsafe_pinned", "unsafe_unpin",
                        "unsafety", "unsize", "unsized_const_param_ty",
                        "unsized_const_params", "unsized_fn_params",
                        "unsized_locals", "unsized_tuple_coercion", "unstable",
                        "unstable_feature_bound",
                        "this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead?",
                        "untagged_unions", "unused_imports", "unwind",
                        "unwind_attributes", "unwind_safe_trait", "unwrap",
                        "unwrap_binder", "unwrap_or", "update", "use_cloned",
                        "use_extern_macros", "use_nested_groups", "used",
                        "used_with_arg", "using", "usize", "usize_legacy_const_max",
                        "usize_legacy_const_min", "usize_legacy_fn_max_value",
                        "usize_legacy_fn_min_value", "usize_legacy_mod", "v1",
                        "v8plus", "va_arg", "va_copy", "va_end", "va_list",
                        "va_start", "val", "validity", "value", "values", "var",
                        "variadic", "variant_count", "variants", "vec", "vector",
                        "verbatim", "version", "vfp2", "vis",
                        "visible_private_types", "volatile", "volatile_copy_memory",
                        "volatile_copy_nonoverlapping_memory", "volatile_load",
                        "volatile_set_memory", "volatile_store", "vreg",
                        "vreg_low16", "vsreg", "vsx", "vtable_align", "vtable_size",
                        "warn", "wasip2", "wasm32", "wasm64", "wasm_abi",
                        "wasm_import_module", "wasm_target_feature", "weak",
                        "weak_odr", "where_clause_attrs", "while_let",
                        "whole-archive", "width", "windows", "windows_subsystem",
                        "with_negative_coherence", "wrap_binder", "wrapping_add",
                        "wrapping_div", "wrapping_mul", "wrapping_rem",
                        "wrapping_rem_euclid", "wrapping_sub", "wreg",
                        "write_box_via_move", "write_bytes", "write_fmt",
                        "write_macro", "write_str", "write_via_move",
                        "writeln_macro", "x86", "x86_64", "x86_amx_intrinsics",
                        "x87_reg", "x87_target_feature", "xer", "xmm_reg",
                        "xop_target_feature", "xtensa", "yeet_desugar_details",
                        "yeet_expr", "yes", "yield_expr", "ymm_reg", "yreg", "zca",
                        "zfh", "zfhmin", "zmm_reg", "ztso", "0", "1", "2", "3", "4",
                        "5", "6", "7", "8", "9", "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_uninit,
1221        maybe_uninit_uninit,
1222        maybe_uninit_zeroed,
1223        mem_align_const,
1224        mem_discriminant,
1225        mem_drop,
1226        mem_forget,
1227        mem_size_const,
1228        mem_swap,
1229        mem_uninitialized,
1230        mem_variant_count,
1231        mem_zeroed,
1232        member_constraints,
1233        memory,
1234        memtag,
1235        message,
1236        meta,
1237        meta_sized,
1238        metadata_type,
1239        mgca_type_const_syntax,
1240        min_const_fn,
1241        min_const_generics,
1242        min_const_unsafe_fn,
1243        min_exhaustive_patterns,
1244        min_generic_const_args,
1245        min_specialization,
1246        min_type_alias_impl_trait,
1247        minimumf16,
1248        minimumf32,
1249        minimumf64,
1250        minimumf128,
1251        minnumf16,
1252        minnumf32,
1253        minnumf64,
1254        minnumf128,
1255        mips,
1256        mips32r6,
1257        mips64,
1258        mips64r6,
1259        mips_target_feature,
1260        mir_assume,
1261        mir_basic_block,
1262        mir_call,
1263        mir_cast_ptr_to_ptr,
1264        mir_cast_transmute,
1265        mir_cast_unsize,
1266        mir_checked,
1267        mir_debuginfo,
1268        mir_discriminant,
1269        mir_drop,
1270        mir_field,
1271        mir_goto,
1272        mir_make_place,
1273        mir_move,
1274        mir_offset,
1275        mir_ptr_metadata,
1276        mir_retag,
1277        mir_return,
1278        mir_return_to,
1279        mir_set_discriminant,
1280        mir_static,
1281        mir_static_mut,
1282        mir_storage_dead,
1283        mir_storage_live,
1284        mir_tail_call,
1285        mir_unreachable,
1286        mir_unwind_cleanup,
1287        mir_unwind_continue,
1288        mir_unwind_resume,
1289        mir_unwind_terminate,
1290        mir_unwind_terminate_reason,
1291        mir_unwind_unreachable,
1292        mir_variant,
1293        miri,
1294        mmx_reg,
1295        modifiers,
1296        module,
1297        module_path,
1298        more_maybe_bounds,
1299        more_qualified_paths,
1300        more_struct_aliases,
1301        movbe_target_feature,
1302        move_ref_pattern,
1303        move_size_limit,
1304        movrs_target_feature,
1305        msp430,
1306        mul,
1307        mul_assign,
1308        mul_with_overflow,
1309        multiple_supertrait_upcastable,
1310        must_not_suspend,
1311        must_use,
1312        mut_preserve_binding_mode_2024,
1313        mut_ref,
1314        mutable,
1315        naked,
1316        naked_asm,
1317        naked_functions,
1318        naked_functions_rustic_abi,
1319        naked_functions_target_feature,
1320        name,
1321        names,
1322        native_link_modifiers,
1323        native_link_modifiers_as_needed,
1324        native_link_modifiers_bundle,
1325        native_link_modifiers_verbatim,
1326        native_link_modifiers_whole_archive,
1327        natvis_file,
1328        ne,
1329        needs_allocator,
1330        needs_drop,
1331        needs_panic_runtime,
1332        neg,
1333        negate_unsigned,
1334        negative_bounds,
1335        negative_impls,
1336        neon,
1337        nested,
1338        never,
1339        never_patterns,
1340        never_type,
1341        never_type_fallback,
1342        new,
1343        new_binary,
1344        new_debug,
1345        new_debug_noop,
1346        new_display,
1347        new_lower_exp,
1348        new_lower_hex,
1349        new_octal,
1350        new_pointer,
1351        new_range,
1352        new_unchecked,
1353        new_upper_exp,
1354        new_upper_hex,
1355        next,
1356        nll,
1357        no,
1358        no_builtins,
1359        no_core,
1360        no_coverage,
1361        no_crate_inject,
1362        no_debug,
1363        no_default_passes,
1364        no_implicit_prelude,
1365        no_inline,
1366        no_link,
1367        no_main,
1368        no_mangle,
1369        no_sanitize,
1370        no_stack_check,
1371        no_std,
1372        nomem,
1373        non_ascii_idents,
1374        non_exhaustive,
1375        non_exhaustive_omitted_patterns_lint,
1376        non_lifetime_binders,
1377        non_modrs_mods,
1378        nonblocking,
1379        none,
1380        nontemporal_store,
1381        noop_method_borrow,
1382        noop_method_clone,
1383        noop_method_deref,
1384        noprefix,
1385        noreturn,
1386        nostack,
1387        not,
1388        notable_trait,
1389        note,
1390        null,
1391        nvptx64,
1392        nvptx_target_feature,
1393        object_safe_for_dispatch,
1394        of,
1395        off,
1396        offload,
1397        offset,
1398        offset_of,
1399        offset_of_enum,
1400        offset_of_nested,
1401        offset_of_slice,
1402        ok_or_else,
1403        old_name,
1404        omit_gdb_pretty_printer_section,
1405        on,
1406        on_const,
1407        on_unimplemented,
1408        opaque,
1409        opaque_generic_const_args,
1410        opaque_module_name_placeholder: "<opaque>",
1411        ops,
1412        opt_out_copy,
1413        optimize,
1414        optimize_attribute,
1415        optimized,
1416        optin_builtin_traits,
1417        option,
1418        option_env,
1419        options,
1420        or,
1421        or_patterns,
1422        ord_cmp_method,
1423        other,
1424        out,
1425        output,
1426        overflow_checks,
1427        overlapping_marker_traits,
1428        owned_box,
1429        packed,
1430        packed_bundled_libs,
1431        panic,
1432        panic_2015,
1433        panic_2021,
1434        panic_abort,
1435        panic_bounds_check,
1436        panic_cannot_unwind,
1437        panic_const_add_overflow,
1438        panic_const_async_fn_resumed,
1439        panic_const_async_fn_resumed_drop,
1440        panic_const_async_fn_resumed_panic,
1441        panic_const_async_gen_fn_resumed,
1442        panic_const_async_gen_fn_resumed_drop,
1443        panic_const_async_gen_fn_resumed_panic,
1444        panic_const_coroutine_resumed,
1445        panic_const_coroutine_resumed_drop,
1446        panic_const_coroutine_resumed_panic,
1447        panic_const_div_by_zero,
1448        panic_const_div_overflow,
1449        panic_const_gen_fn_none,
1450        panic_const_gen_fn_none_drop,
1451        panic_const_gen_fn_none_panic,
1452        panic_const_mul_overflow,
1453        panic_const_neg_overflow,
1454        panic_const_rem_by_zero,
1455        panic_const_rem_overflow,
1456        panic_const_shl_overflow,
1457        panic_const_shr_overflow,
1458        panic_const_sub_overflow,
1459        panic_display,
1460        panic_fmt,
1461        panic_handler,
1462        panic_impl,
1463        panic_implementation,
1464        panic_in_cleanup,
1465        panic_info,
1466        panic_invalid_enum_construction,
1467        panic_location,
1468        panic_misaligned_pointer_dereference,
1469        panic_nounwind,
1470        panic_null_pointer_dereference,
1471        panic_runtime,
1472        panic_str_2015,
1473        panic_unwind,
1474        panicking,
1475        param_attrs,
1476        parent_label,
1477        partial_cmp,
1478        partial_ord,
1479        passes,
1480        pat,
1481        pat_param,
1482        patchable_function_entry,
1483        path,
1484        pattern_complexity_limit,
1485        pattern_parentheses,
1486        pattern_type,
1487        pattern_type_range_trait,
1488        pattern_types,
1489        phantom_data,
1490        phase,
1491        pic,
1492        pie,
1493        pin,
1494        pin_ergonomics,
1495        pin_v2,
1496        platform_intrinsics,
1497        plugin,
1498        plugin_registrar,
1499        plugins,
1500        pointee,
1501        pointee_sized,
1502        pointee_trait,
1503        pointer,
1504        poll,
1505        post_cleanup: "post-cleanup",
1506        post_dash_lto: "post-lto",
1507        postfix_match,
1508        powerpc,
1509        powerpc64,
1510        powerpc_target_feature,
1511        powf16,
1512        powf32,
1513        powf64,
1514        powf128,
1515        powif16,
1516        powif32,
1517        powif64,
1518        powif128,
1519        pre_dash_lto: "pre-lto",
1520        precise_capturing,
1521        precise_capturing_in_traits,
1522        precise_pointer_size_matching,
1523        predicates,
1524        pref_align_of,
1525        prefetch_read_data,
1526        prefetch_read_instruction,
1527        prefetch_write_data,
1528        prefetch_write_instruction,
1529        prefix_nops,
1530        preg,
1531        prelude,
1532        prelude_import,
1533        preserves_flags,
1534        prfchw_target_feature,
1535        proc_dash_macro: "proc-macro",
1536        proc_macro,
1537        proc_macro_attribute,
1538        proc_macro_derive,
1539        proc_macro_expr,
1540        proc_macro_gen,
1541        proc_macro_hygiene,
1542        proc_macro_internals,
1543        proc_macro_mod,
1544        proc_macro_non_items,
1545        proc_macro_path_invoc,
1546        profiler_runtime,
1547        ptr,
1548        ptr_cast,
1549        ptr_cast_const,
1550        ptr_cast_mut,
1551        ptr_const_is_null,
1552        ptr_copy,
1553        ptr_copy_nonoverlapping,
1554        ptr_from_ref,
1555        ptr_guaranteed_cmp,
1556        ptr_is_null,
1557        ptr_mask,
1558        ptr_metadata,
1559        ptr_null,
1560        ptr_null_mut,
1561        ptr_offset_from,
1562        ptr_offset_from_unsigned,
1563        ptr_read,
1564        ptr_read_unaligned,
1565        ptr_replace,
1566        ptr_swap,
1567        ptr_swap_nonoverlapping,
1568        ptr_write,
1569        ptr_write_bytes,
1570        ptr_write_unaligned,
1571        ptr_write_volatile,
1572        pub_macro_rules,
1573        pub_restricted,
1574        public,
1575        pure,
1576        pushpop_unsafe,
1577        qreg,
1578        qreg_low4,
1579        qreg_low8,
1580        quad_precision_float,
1581        question_mark,
1582        quote,
1583        range_inclusive_new,
1584        raw_dash_dylib: "raw-dylib",
1585        raw_dylib,
1586        raw_dylib_elf,
1587        raw_eq,
1588        raw_identifiers,
1589        raw_ref_op,
1590        re_rebalance_coherence,
1591        read_via_copy,
1592        readonly,
1593        realloc,
1594        realtime,
1595        reason,
1596        reborrow,
1597        receiver,
1598        receiver_target,
1599        recursion_limit,
1600        reexport_test_harness_main,
1601        ref_pat_eat_one_layer_2024,
1602        ref_pat_eat_one_layer_2024_structural,
1603        ref_pat_everywhere,
1604        ref_unwind_safe_trait,
1605        reference,
1606        reflect,
1607        reg,
1608        reg16,
1609        reg32,
1610        reg64,
1611        reg_abcd,
1612        reg_addr,
1613        reg_byte,
1614        reg_data,
1615        reg_iw,
1616        reg_nonzero,
1617        reg_pair,
1618        reg_ptr,
1619        reg_upper,
1620        register_attr,
1621        register_tool,
1622        relaxed_adts,
1623        relaxed_struct_unsize,
1624        relocation_model,
1625        rem,
1626        rem_assign,
1627        repr,
1628        repr128,
1629        repr_align,
1630        repr_align_enum,
1631        repr_packed,
1632        repr_simd,
1633        repr_transparent,
1634        require,
1635        reserve_x18: "reserve-x18",
1636        residual,
1637        result,
1638        result_ffi_guarantees,
1639        return_position_impl_trait_in_trait,
1640        return_type_notation,
1641        riscv32,
1642        riscv64,
1643        riscv_target_feature,
1644        rlib,
1645        ropi,
1646        ropi_rwpi: "ropi-rwpi",
1647        rotate_left,
1648        rotate_right,
1649        round_ties_even_f16,
1650        round_ties_even_f32,
1651        round_ties_even_f64,
1652        round_ties_even_f128,
1653        roundf16,
1654        roundf32,
1655        roundf64,
1656        roundf128,
1657        rtm_target_feature,
1658        runtime,
1659        rust,
1660        rust_2015,
1661        rust_2018,
1662        rust_2018_preview,
1663        rust_2021,
1664        rust_2024,
1665        rust_analyzer,
1666        rust_begin_unwind,
1667        rust_cold_cc,
1668        rust_eh_catch_typeinfo,
1669        rust_eh_personality,
1670        rust_future,
1671        rust_logo,
1672        rust_out,
1673        rust_preserve_none_cc,
1674        rustc,
1675        rustc_abi,
1676        // FIXME(#82232, #143834): temporary name to mitigate `#[align]` nameres ambiguity
1677        rustc_align,
1678        rustc_align_static,
1679        rustc_allocator,
1680        rustc_allocator_zeroed,
1681        rustc_allocator_zeroed_variant,
1682        rustc_allow_const_fn_unstable,
1683        rustc_allow_incoherent_impl,
1684        rustc_allowed_through_unstable_modules,
1685        rustc_as_ptr,
1686        rustc_attrs,
1687        rustc_autodiff,
1688        rustc_builtin_macro,
1689        rustc_capture_analysis,
1690        rustc_clean,
1691        rustc_coherence_is_core,
1692        rustc_coinductive,
1693        rustc_confusables,
1694        rustc_const_stable,
1695        rustc_const_stable_indirect,
1696        rustc_const_unstable,
1697        rustc_conversion_suggestion,
1698        rustc_deallocator,
1699        rustc_def_path,
1700        rustc_default_body_unstable,
1701        rustc_delayed_bug_from_inside_query,
1702        rustc_deny_explicit_impl,
1703        rustc_deprecated_safe_2024,
1704        rustc_diagnostic_item,
1705        rustc_diagnostic_macros,
1706        rustc_do_not_const_check,
1707        rustc_doc_primitive,
1708        rustc_driver,
1709        rustc_dummy,
1710        rustc_dump_def_parents,
1711        rustc_dump_item_bounds,
1712        rustc_dump_predicates,
1713        rustc_dump_user_args,
1714        rustc_dump_vtable,
1715        rustc_dyn_incompatible_trait,
1716        rustc_effective_visibility,
1717        rustc_eii_foreign_item,
1718        rustc_evaluate_where_clauses,
1719        rustc_expected_cgu_reuse,
1720        rustc_force_inline,
1721        rustc_has_incoherent_inherent_impls,
1722        rustc_hidden_type_of_opaques,
1723        rustc_if_this_changed,
1724        rustc_inherit_overflow_checks,
1725        rustc_insignificant_dtor,
1726        rustc_intrinsic,
1727        rustc_intrinsic_const_stable_indirect,
1728        rustc_layout,
1729        rustc_layout_scalar_valid_range_end,
1730        rustc_layout_scalar_valid_range_start,
1731        rustc_legacy_const_generics,
1732        rustc_lint_opt_deny_field_access,
1733        rustc_lint_opt_ty,
1734        rustc_lint_query_instability,
1735        rustc_lint_untracked_query_information,
1736        rustc_macro_transparency,
1737        rustc_main,
1738        rustc_mir,
1739        rustc_must_implement_one_of,
1740        rustc_never_returns_null_ptr,
1741        rustc_never_type_options,
1742        rustc_no_implicit_autorefs,
1743        rustc_no_implicit_bounds,
1744        rustc_no_mir_inline,
1745        rustc_non_const_trait_method,
1746        rustc_nonnull_optimization_guaranteed,
1747        rustc_nounwind,
1748        rustc_objc_class,
1749        rustc_objc_selector,
1750        rustc_object_lifetime_default,
1751        rustc_offload_kernel,
1752        rustc_on_unimplemented,
1753        rustc_outlives,
1754        rustc_paren_sugar,
1755        rustc_partition_codegened,
1756        rustc_partition_reused,
1757        rustc_pass_by_value,
1758        rustc_pass_indirectly_in_non_rustic_abis,
1759        rustc_peek,
1760        rustc_peek_liveness,
1761        rustc_peek_maybe_init,
1762        rustc_peek_maybe_uninit,
1763        rustc_preserve_ub_checks,
1764        rustc_private,
1765        rustc_proc_macro_decls,
1766        rustc_promotable,
1767        rustc_pub_transparent,
1768        rustc_reallocator,
1769        rustc_regions,
1770        rustc_reservation_impl,
1771        rustc_scalable_vector,
1772        rustc_should_not_be_called_on_const_items,
1773        rustc_simd_monomorphize_lane_limit,
1774        rustc_skip_during_method_dispatch,
1775        rustc_specialization_trait,
1776        rustc_std_internal_symbol,
1777        rustc_strict_coherence,
1778        rustc_symbol_name,
1779        rustc_test_marker,
1780        rustc_then_this_would_need,
1781        rustc_trivial_field_reads,
1782        rustc_unsafe_specialization_marker,
1783        rustc_variance,
1784        rustc_variance_of_opaques,
1785        rustdoc,
1786        rustdoc_internals,
1787        rustdoc_missing_doc_code_examples,
1788        rustfmt,
1789        rvalue_static_promotion,
1790        rwpi,
1791        s390x,
1792        s390x_target_feature,
1793        s390x_target_feature_vector,
1794        safety,
1795        sanitize,
1796        sanitizer_cfi_generalize_pointers,
1797        sanitizer_cfi_normalize_integers,
1798        sanitizer_runtime,
1799        saturating_add,
1800        saturating_sub,
1801        sdylib,
1802        search_unbox,
1803        select_unpredictable,
1804        self_in_typedefs,
1805        self_struct_ctor,
1806        semiopaque,
1807        sha2,
1808        sha3,
1809        sha512_sm_x86,
1810        shadow_call_stack,
1811        shallow,
1812        shl,
1813        shl_assign,
1814        shorter_tail_lifetimes,
1815        should_panic,
1816        show,
1817        shr,
1818        shr_assign,
1819        signed,
1820        simd,
1821        simd_add,
1822        simd_and,
1823        simd_arith_offset,
1824        simd_as,
1825        simd_bitmask,
1826        simd_bitreverse,
1827        simd_bswap,
1828        simd_carryless_mul,
1829        simd_cast,
1830        simd_cast_ptr,
1831        simd_ceil,
1832        simd_ctlz,
1833        simd_ctpop,
1834        simd_cttz,
1835        simd_div,
1836        simd_eq,
1837        simd_expose_provenance,
1838        simd_extract,
1839        simd_extract_dyn,
1840        simd_fabs,
1841        simd_fcos,
1842        simd_fexp,
1843        simd_fexp2,
1844        simd_ffi,
1845        simd_flog,
1846        simd_flog2,
1847        simd_flog10,
1848        simd_floor,
1849        simd_fma,
1850        simd_fmax,
1851        simd_fmin,
1852        simd_fsin,
1853        simd_fsqrt,
1854        simd_funnel_shl,
1855        simd_funnel_shr,
1856        simd_gather,
1857        simd_ge,
1858        simd_gt,
1859        simd_insert,
1860        simd_insert_dyn,
1861        simd_le,
1862        simd_lt,
1863        simd_masked_load,
1864        simd_masked_store,
1865        simd_mul,
1866        simd_ne,
1867        simd_neg,
1868        simd_or,
1869        simd_reduce_add_ordered,
1870        simd_reduce_add_unordered,
1871        simd_reduce_all,
1872        simd_reduce_and,
1873        simd_reduce_any,
1874        simd_reduce_max,
1875        simd_reduce_min,
1876        simd_reduce_mul_ordered,
1877        simd_reduce_mul_unordered,
1878        simd_reduce_or,
1879        simd_reduce_xor,
1880        simd_relaxed_fma,
1881        simd_rem,
1882        simd_round,
1883        simd_round_ties_even,
1884        simd_saturating_add,
1885        simd_saturating_sub,
1886        simd_scatter,
1887        simd_select,
1888        simd_select_bitmask,
1889        simd_shl,
1890        simd_shr,
1891        simd_shuffle,
1892        simd_shuffle_const_generic,
1893        simd_splat,
1894        simd_sub,
1895        simd_trunc,
1896        simd_with_exposed_provenance,
1897        simd_xor,
1898        since,
1899        sinf16,
1900        sinf32,
1901        sinf64,
1902        sinf128,
1903        size,
1904        size_of,
1905        size_of_val,
1906        sized,
1907        sized_hierarchy,
1908        slice,
1909        slice_from_raw_parts,
1910        slice_from_raw_parts_mut,
1911        slice_get_unchecked,
1912        slice_len_fn,
1913        slice_patterns,
1914        slicing_syntax,
1915        soft,
1916        sparc,
1917        sparc64,
1918        sparc_target_feature,
1919        spe_acc,
1920        specialization,
1921        speed,
1922        spirv,
1923        spotlight,
1924        sqrtf16,
1925        sqrtf32,
1926        sqrtf64,
1927        sqrtf128,
1928        sreg,
1929        sreg_low16,
1930        sse,
1931        sse2,
1932        sse4a_target_feature,
1933        stable,
1934        staged_api,
1935        start,
1936        state,
1937        static_align,
1938        static_in_const,
1939        static_nobundle,
1940        static_recursion,
1941        staticlib,
1942        std,
1943        std_lib_injection,
1944        std_panic,
1945        std_panic_2015_macro,
1946        std_panic_macro,
1947        stmt,
1948        stmt_expr_attributes,
1949        stop_after_dataflow,
1950        store,
1951        str,
1952        str_from_utf8,
1953        str_from_utf8_mut,
1954        str_from_utf8_unchecked,
1955        str_from_utf8_unchecked_mut,
1956        str_inherent_from_utf8,
1957        str_inherent_from_utf8_mut,
1958        str_inherent_from_utf8_unchecked,
1959        str_inherent_from_utf8_unchecked_mut,
1960        strict_provenance_lints,
1961        string_deref_patterns,
1962        stringify,
1963        struct_field_attributes,
1964        struct_inherit,
1965        struct_variant,
1966        structural_match,
1967        structural_peq,
1968        sub,
1969        sub_assign,
1970        sub_with_overflow,
1971        suggestion,
1972        super_let,
1973        supertrait_item_shadowing,
1974        sym,
1975        sync,
1976        synthetic,
1977        t32,
1978        target,
1979        target_abi,
1980        target_arch,
1981        target_endian,
1982        target_env,
1983        target_family,
1984        target_feature,
1985        target_feature_11,
1986        target_feature_inline_always,
1987        target_has_atomic,
1988        target_has_atomic_equal_alignment,
1989        target_has_atomic_load_store,
1990        target_has_reliable_f16,
1991        target_has_reliable_f16_math,
1992        target_has_reliable_f128,
1993        target_has_reliable_f128_math,
1994        target_os,
1995        target_pointer_width,
1996        target_thread_local,
1997        target_vendor,
1998        tbm_target_feature,
1999        termination,
2000        termination_trait,
2001        termination_trait_test,
2002        test,
2003        test_2018_feature,
2004        test_accepted_feature,
2005        test_case,
2006        test_removed_feature,
2007        test_runner,
2008        test_unstable_lint,
2009        thread,
2010        thread_local,
2011        three_way_compare,
2012        thumb2,
2013        thumb_mode: "thumb-mode",
2014        tmm_reg,
2015        to_string,
2016        to_vec,
2017        tool_attributes,
2018        tool_lints,
2019        trace_macros,
2020        track_caller,
2021        trait_alias,
2022        trait_ty,
2023        trait_upcasting,
2024        transmute,
2025        transmute_generic_consts,
2026        transmute_opts,
2027        transmute_trait,
2028        transmute_unchecked,
2029        transparent,
2030        transparent_enums,
2031        transparent_unions,
2032        trivial_bounds,
2033        trivial_clone,
2034        truncf16,
2035        truncf32,
2036        truncf64,
2037        truncf128,
2038        try_blocks,
2039        try_blocks_heterogeneous,
2040        try_capture,
2041        try_from,
2042        try_into,
2043        try_trait_v2,
2044        try_trait_v2_residual,
2045        try_update,
2046        tt,
2047        tuple,
2048        tuple_indexing,
2049        tuple_trait,
2050        two_phase,
2051        ty,
2052        type_alias_enum_variants,
2053        type_alias_impl_trait,
2054        type_ascribe,
2055        type_ascription,
2056        type_changing_struct_update,
2057        type_id,
2058        type_id_eq,
2059        type_id_vtable,
2060        type_info,
2061        type_ir,
2062        type_ir_infer_ctxt_like,
2063        type_ir_inherent,
2064        type_ir_interner,
2065        type_length_limit,
2066        type_macros,
2067        type_name,
2068        type_of,
2069        type_privacy_lints,
2070        typed_swap_nonoverlapping,
2071        u8,
2072        u8_legacy_const_max,
2073        u8_legacy_const_min,
2074        u8_legacy_fn_max_value,
2075        u8_legacy_fn_min_value,
2076        u8_legacy_mod,
2077        u16,
2078        u16_legacy_const_max,
2079        u16_legacy_const_min,
2080        u16_legacy_fn_max_value,
2081        u16_legacy_fn_min_value,
2082        u16_legacy_mod,
2083        u32,
2084        u32_legacy_const_max,
2085        u32_legacy_const_min,
2086        u32_legacy_fn_max_value,
2087        u32_legacy_fn_min_value,
2088        u32_legacy_mod,
2089        u64,
2090        u64_legacy_const_max,
2091        u64_legacy_const_min,
2092        u64_legacy_fn_max_value,
2093        u64_legacy_fn_min_value,
2094        u64_legacy_mod,
2095        u128,
2096        u128_legacy_const_max,
2097        u128_legacy_const_min,
2098        u128_legacy_fn_max_value,
2099        u128_legacy_fn_min_value,
2100        u128_legacy_mod,
2101        ub_checks,
2102        unaligned_volatile_load,
2103        unaligned_volatile_store,
2104        unboxed_closures,
2105        unchecked_add,
2106        unchecked_div,
2107        unchecked_funnel_shl,
2108        unchecked_funnel_shr,
2109        unchecked_mul,
2110        unchecked_rem,
2111        unchecked_shl,
2112        unchecked_shr,
2113        unchecked_sub,
2114        undecorated,
2115        underscore_const_names,
2116        underscore_imports,
2117        underscore_lifetimes,
2118        uniform_paths,
2119        unit,
2120        universal_impl_trait,
2121        unix,
2122        unlikely,
2123        unmarked_api,
2124        unnamed_fields,
2125        unpin,
2126        unqualified_local_imports,
2127        unreachable,
2128        unreachable_2015,
2129        unreachable_2015_macro,
2130        unreachable_2021,
2131        unreachable_code,
2132        unreachable_display,
2133        unreachable_macro,
2134        unrestricted_attribute_tokens,
2135        unsafe_attributes,
2136        unsafe_binders,
2137        unsafe_block_in_unsafe_fn,
2138        unsafe_cell,
2139        unsafe_cell_raw_get,
2140        unsafe_eii,
2141        unsafe_extern_blocks,
2142        unsafe_fields,
2143        unsafe_no_drop_flag,
2144        unsafe_pinned,
2145        unsafe_unpin,
2146        unsafety,
2147        unsize,
2148        unsized_const_param_ty,
2149        unsized_const_params,
2150        unsized_fn_params,
2151        unsized_locals,
2152        unsized_tuple_coercion,
2153        unstable,
2154        unstable_feature_bound,
2155        unstable_location_reason_default: "this crate is being loaded from the sysroot, an \
2156                          unstable location; did you mean to load this crate \
2157                          from crates.io via `Cargo.toml` instead?",
2158        untagged_unions,
2159        unused_imports,
2160        unwind,
2161        unwind_attributes,
2162        unwind_safe_trait,
2163        unwrap,
2164        unwrap_binder,
2165        unwrap_or,
2166        update,
2167        use_cloned,
2168        use_extern_macros,
2169        use_nested_groups,
2170        used,
2171        used_with_arg,
2172        using,
2173        usize,
2174        usize_legacy_const_max,
2175        usize_legacy_const_min,
2176        usize_legacy_fn_max_value,
2177        usize_legacy_fn_min_value,
2178        usize_legacy_mod,
2179        v1,
2180        v8plus,
2181        va_arg,
2182        va_copy,
2183        va_end,
2184        va_list,
2185        va_start,
2186        val,
2187        validity,
2188        value,
2189        values,
2190        var,
2191        variadic,
2192        variant_count,
2193        variants,
2194        vec,
2195        vector,
2196        verbatim,
2197        version,
2198        vfp2,
2199        vis,
2200        visible_private_types,
2201        volatile,
2202        volatile_copy_memory,
2203        volatile_copy_nonoverlapping_memory,
2204        volatile_load,
2205        volatile_set_memory,
2206        volatile_store,
2207        vreg,
2208        vreg_low16,
2209        vsreg,
2210        vsx,
2211        vtable_align,
2212        vtable_size,
2213        warn,
2214        wasip2,
2215        wasm32,
2216        wasm64,
2217        wasm_abi,
2218        wasm_import_module,
2219        wasm_target_feature,
2220        weak,
2221        weak_odr,
2222        where_clause_attrs,
2223        while_let,
2224        whole_dash_archive: "whole-archive",
2225        width,
2226        windows,
2227        windows_subsystem,
2228        with_negative_coherence,
2229        wrap_binder,
2230        wrapping_add,
2231        wrapping_div,
2232        wrapping_mul,
2233        wrapping_rem,
2234        wrapping_rem_euclid,
2235        wrapping_sub,
2236        wreg,
2237        write_box_via_move,
2238        write_bytes,
2239        write_fmt,
2240        write_macro,
2241        write_str,
2242        write_via_move,
2243        writeln_macro,
2244        x86,
2245        x86_64,
2246        x86_amx_intrinsics,
2247        x87_reg,
2248        x87_target_feature,
2249        xer,
2250        xmm_reg,
2251        xop_target_feature,
2252        xtensa,
2253        yeet_desugar_details,
2254        yeet_expr,
2255        yes,
2256        yield_expr,
2257        ymm_reg,
2258        yreg,
2259        zca,
2260        zfh,
2261        zfhmin,
2262        zmm_reg,
2263        ztso,
2264        // tidy-alphabetical-end
2265    }
2266}
2267
2268/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2269/// `proc_macro`.
2270pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2271
2272#[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)]
2273pub struct Ident {
2274    /// `name` should never be the empty symbol. If you are considering that,
2275    /// you are probably conflating "empty identifier with "no identifier" and
2276    /// you should use `Option<Ident>` instead.
2277    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2278    pub name: Symbol,
2279    pub span: Span,
2280}
2281
2282impl Ident {
2283    #[inline]
2284    /// Constructs a new identifier from a symbol and a span.
2285    pub fn new(name: Symbol, span: Span) -> Ident {
2286        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);
2287        Ident { name, span }
2288    }
2289
2290    /// Constructs a new identifier with a dummy span.
2291    #[inline]
2292    pub fn with_dummy_span(name: Symbol) -> Ident {
2293        Ident::new(name, DUMMY_SP)
2294    }
2295
2296    // For dummy identifiers that are never used and absolutely must be
2297    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2298    // makes it clear that it's intended as a dummy value, and is more likely
2299    // to be detected if it accidentally does get used.
2300    #[inline]
2301    pub fn dummy() -> Ident {
2302        Ident::with_dummy_span(sym::dummy)
2303    }
2304
2305    /// Maps a string to an identifier with a dummy span.
2306    pub fn from_str(string: &str) -> Ident {
2307        Ident::with_dummy_span(Symbol::intern(string))
2308    }
2309
2310    /// Maps a string and a span to an identifier.
2311    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2312        Ident::new(Symbol::intern(string), span)
2313    }
2314
2315    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2316    pub fn with_span_pos(self, span: Span) -> Ident {
2317        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2318    }
2319
2320    /// Creates a new ident with the same span and name with leading quote removed, if any.
2321    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2322    pub fn without_first_quote(self) -> Ident {
2323        self.as_str()
2324            .strip_prefix('\'')
2325            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2326    }
2327
2328    /// "Normalize" ident for use in comparisons using "item hygiene".
2329    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2330    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2331    /// different macro 2.0 macros.
2332    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2333    pub fn normalize_to_macros_2_0(self) -> Ident {
2334        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2335    }
2336
2337    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2338    /// Identifiers with same string value become same if they came from the same non-transparent
2339    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2340    /// non-transparent macros.
2341    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2342    #[inline]
2343    pub fn normalize_to_macro_rules(self) -> Ident {
2344        Ident::new(self.name, self.span.normalize_to_macro_rules())
2345    }
2346
2347    /// Access the underlying string. This is a slowish operation because it
2348    /// requires locking the symbol interner.
2349    ///
2350    /// Note that the lifetime of the return value is a lie. See
2351    /// `Symbol::as_str()` for details.
2352    pub fn as_str(&self) -> &str {
2353        self.name.as_str()
2354    }
2355}
2356
2357impl PartialEq for Ident {
2358    #[inline]
2359    fn eq(&self, rhs: &Self) -> bool {
2360        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2361    }
2362}
2363
2364impl Hash for Ident {
2365    fn hash<H: Hasher>(&self, state: &mut H) {
2366        self.name.hash(state);
2367        self.span.ctxt().hash(state);
2368    }
2369}
2370
2371impl fmt::Debug for Ident {
2372    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2373        fmt::Display::fmt(self, f)?;
2374        fmt::Debug::fmt(&self.span.ctxt(), f)
2375    }
2376}
2377
2378/// This implementation is supposed to be used in error messages, so it's expected to be identical
2379/// to printing the original identifier token written in source code (`token_to_string`),
2380/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2381impl fmt::Display for Ident {
2382    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2383        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2384    }
2385}
2386
2387pub enum IdentPrintMode {
2388    Normal,
2389    RawIdent,
2390    RawLifetime,
2391}
2392
2393/// The most general type to print identifiers.
2394///
2395/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2396/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2397/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2398/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2399/// hygiene data, most importantly name of the crate it refers to.
2400/// As a result we print `$crate` as `crate` if it refers to the local crate
2401/// and as `::other_crate_name` if it refers to some other crate.
2402/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2403/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2404/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2405/// done for a token stream or a single token.
2406pub struct IdentPrinter {
2407    symbol: Symbol,
2408    mode: IdentPrintMode,
2409    /// Span used for retrieving the crate name to which `$crate` refers to,
2410    /// if this field is `None` then the `$crate` conversion doesn't happen.
2411    convert_dollar_crate: Option<Span>,
2412}
2413
2414impl IdentPrinter {
2415    /// The most general `IdentPrinter` constructor. Do not use this.
2416    pub fn new(
2417        symbol: Symbol,
2418        mode: IdentPrintMode,
2419        convert_dollar_crate: Option<Span>,
2420    ) -> IdentPrinter {
2421        IdentPrinter { symbol, mode, convert_dollar_crate }
2422    }
2423
2424    /// This implementation is supposed to be used when printing identifiers
2425    /// as a part of pretty-printing for larger AST pieces.
2426    /// Do not use this either.
2427    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2428        IdentPrinter::new(ident.name, mode, Some(ident.span))
2429    }
2430}
2431
2432impl fmt::Display for IdentPrinter {
2433    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2434        let s = match self.mode {
2435            IdentPrintMode::Normal
2436                if self.symbol == kw::DollarCrate
2437                    && let Some(span) = self.convert_dollar_crate =>
2438            {
2439                let converted = span.ctxt().dollar_crate_name();
2440                if !converted.is_path_segment_keyword() {
2441                    f.write_str("::")?;
2442                }
2443                converted
2444            }
2445            IdentPrintMode::Normal => self.symbol,
2446            IdentPrintMode::RawIdent => {
2447                f.write_str("r#")?;
2448                self.symbol
2449            }
2450            IdentPrintMode::RawLifetime => {
2451                f.write_str("'r#")?;
2452                let s = self
2453                    .symbol
2454                    .as_str()
2455                    .strip_prefix("'")
2456                    .expect("only lifetime idents should be passed with RawLifetime mode");
2457                Symbol::intern(s)
2458            }
2459        };
2460        s.fmt(f)
2461    }
2462}
2463
2464/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2465/// construction for "local variable hygiene" comparisons.
2466///
2467/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2468/// This ensures compile-time safety and avoids manual normalization calls.
2469#[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)]
2470pub struct MacroRulesNormalizedIdent(Ident);
2471
2472impl MacroRulesNormalizedIdent {
2473    #[inline]
2474    pub fn new(ident: Ident) -> Self {
2475        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2476    }
2477
2478    pub fn symbol(&self) -> Symbol {
2479        self.0.name
2480    }
2481
2482    pub fn ident(&self) -> Ident {
2483        self.0
2484    }
2485}
2486
2487impl fmt::Debug for MacroRulesNormalizedIdent {
2488    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2489        fmt::Debug::fmt(&self.0, f)
2490    }
2491}
2492
2493impl fmt::Display for MacroRulesNormalizedIdent {
2494    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2495        fmt::Display::fmt(&self.0, f)
2496    }
2497}
2498
2499/// An interned UTF-8 string.
2500///
2501/// Internally, a `Symbol` is implemented as an index, and all operations
2502/// (including hashing, equality, and ordering) operate on that index. The use
2503/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2504/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2505///
2506/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2507/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2508#[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)]
2509pub struct Symbol(SymbolIndex);
2510
2511// Used within both `Symbol` and `ByteSymbol`.
2512impl ::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! {
2513    #[orderable]
2514    struct SymbolIndex {}
2515}
2516
2517impl Symbol {
2518    /// Avoid this except for things like deserialization of previously
2519    /// serialized symbols, and testing. Use `intern` instead.
2520    pub const fn new(n: u32) -> Self {
2521        Symbol(SymbolIndex::from_u32(n))
2522    }
2523
2524    /// Maps a string to its interned representation.
2525    #[rustc_diagnostic_item = "SymbolIntern"]
2526    pub fn intern(str: &str) -> Self {
2527        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2528    }
2529
2530    /// Access the underlying string. This is a slowish operation because it
2531    /// requires locking the symbol interner.
2532    ///
2533    /// Note that the lifetime of the return value is a lie. It's not the same
2534    /// as `&self`, but actually tied to the lifetime of the underlying
2535    /// interner. Interners are long-lived, and there are very few of them, and
2536    /// this function is typically used for short-lived things, so in practice
2537    /// it works out ok.
2538    pub fn as_str(&self) -> &str {
2539        with_session_globals(|session_globals| unsafe {
2540            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2541        })
2542    }
2543
2544    pub fn as_u32(self) -> u32 {
2545        self.0.as_u32()
2546    }
2547
2548    pub fn is_empty(self) -> bool {
2549        self == sym::empty
2550    }
2551
2552    /// This method is supposed to be used in error messages, so it's expected to be
2553    /// identical to printing the original identifier token written in source code
2554    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2555    /// or edition, so we have to guess the rawness using the global edition.
2556    pub fn to_ident_string(self) -> String {
2557        // Avoid creating an empty identifier, because that asserts in debug builds.
2558        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2559    }
2560
2561    /// Checks if `self` is similar to any symbol in `candidates`.
2562    ///
2563    /// The returned boolean represents whether the candidate is the same symbol with a different
2564    /// casing.
2565    ///
2566    /// All the candidates are assumed to be lowercase.
2567    pub fn find_similar(
2568        self,
2569        candidates: &[Symbol],
2570    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2571        let lowercase = self.as_str().to_lowercase();
2572        let lowercase_sym = Symbol::intern(&lowercase);
2573        if candidates.contains(&lowercase_sym) {
2574            Some((lowercase_sym, true))
2575        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2576            Some((similar_sym, false))
2577        } else {
2578            None
2579        }
2580    }
2581}
2582
2583impl fmt::Debug for Symbol {
2584    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2585        fmt::Debug::fmt(self.as_str(), f)
2586    }
2587}
2588
2589impl fmt::Display for Symbol {
2590    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2591        fmt::Display::fmt(self.as_str(), f)
2592    }
2593}
2594
2595impl<CTX> HashStable<CTX> for Symbol {
2596    #[inline]
2597    fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
2598        self.as_str().hash_stable(hcx, hasher);
2599    }
2600}
2601
2602impl<CTX> ToStableHashKey<CTX> for Symbol {
2603    type KeyType = String;
2604    #[inline]
2605    fn to_stable_hash_key(&self, _: &CTX) -> String {
2606        self.as_str().to_string()
2607    }
2608}
2609
2610impl StableCompare for Symbol {
2611    const CAN_USE_UNSTABLE_SORT: bool = true;
2612
2613    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2614        self.as_str().cmp(other.as_str())
2615    }
2616}
2617
2618/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2619/// it has fewer operations defined than `Symbol`.
2620#[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)]
2621pub struct ByteSymbol(SymbolIndex);
2622
2623impl ByteSymbol {
2624    /// Avoid this except for things like deserialization of previously
2625    /// serialized symbols, and testing. Use `intern` instead.
2626    pub const fn new(n: u32) -> Self {
2627        ByteSymbol(SymbolIndex::from_u32(n))
2628    }
2629
2630    /// Maps a string to its interned representation.
2631    pub fn intern(byte_str: &[u8]) -> Self {
2632        with_session_globals(|session_globals| {
2633            session_globals.symbol_interner.intern_byte_str(byte_str)
2634        })
2635    }
2636
2637    /// Like `Symbol::as_str`.
2638    pub fn as_byte_str(&self) -> &[u8] {
2639        with_session_globals(|session_globals| unsafe {
2640            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2641        })
2642    }
2643
2644    pub fn as_u32(self) -> u32 {
2645        self.0.as_u32()
2646    }
2647}
2648
2649impl fmt::Debug for ByteSymbol {
2650    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2651        fmt::Debug::fmt(self.as_byte_str(), f)
2652    }
2653}
2654
2655impl<CTX> HashStable<CTX> for ByteSymbol {
2656    #[inline]
2657    fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
2658        self.as_byte_str().hash_stable(hcx, hasher);
2659    }
2660}
2661
2662// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2663// string with identical contents (e.g. "foo" and b"foo") are both interned,
2664// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2665// will have the same index.
2666pub(crate) struct Interner(Lock<InternerInner>);
2667
2668// The `&'static [u8]`s in this type actually point into the arena.
2669//
2670// This type is private to prevent accidentally constructing more than one
2671// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2672// between `Interner`s.
2673struct InternerInner {
2674    arena: DroplessArena,
2675    byte_strs: FxIndexSet<&'static [u8]>,
2676}
2677
2678impl Interner {
2679    // These arguments are `&str`, but because of the sharing, we are
2680    // effectively pre-interning all these strings for both `Symbol` and
2681    // `ByteSymbol`.
2682    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2683        let byte_strs = FxIndexSet::from_iter(
2684            init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes()),
2685        );
2686
2687        // The order in which duplicates are reported is irrelevant.
2688        #[expect(rustc::potential_query_instability)]
2689        if byte_strs.len() != init.len() + extra.len() {
2690            {
    ::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!(
2691                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2692                FxHashSet::intersection(
2693                    &init.iter().copied().collect(),
2694                    &extra.iter().copied().collect(),
2695                )
2696                .collect::<Vec<_>>()
2697            )
2698        }
2699
2700        Interner(Lock::new(InternerInner { arena: Default::default(), byte_strs }))
2701    }
2702
2703    fn intern_str(&self, str: &str) -> Symbol {
2704        Symbol::new(self.intern_inner(str.as_bytes()))
2705    }
2706
2707    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
2708        ByteSymbol::new(self.intern_inner(byte_str))
2709    }
2710
2711    #[inline]
2712    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
2713        let mut inner = self.0.lock();
2714        if let Some(idx) = inner.byte_strs.get_index_of(byte_str) {
2715            return idx as u32;
2716        }
2717
2718        let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
2719
2720        // SAFETY: we can extend the arena allocation to `'static` because we
2721        // only access these while the arena is still alive.
2722        let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
2723
2724        // This second hash table lookup can be avoided by using `RawEntryMut`,
2725        // but this code path isn't hot enough for it to be worth it. See
2726        // #91445 for details.
2727        let (idx, is_new) = inner.byte_strs.insert_full(byte_str);
2728        if true {
    if !is_new { ::core::panicking::panic("assertion failed: is_new") };
};debug_assert!(is_new); // due to the get_index_of check above
2729
2730        idx as u32
2731    }
2732
2733    /// Get the symbol as a string.
2734    ///
2735    /// [`Symbol::as_str()`] should be used in preference to this function.
2736    fn get_str(&self, symbol: Symbol) -> &str {
2737        let byte_str = self.get_inner(symbol.0.as_usize());
2738        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
2739        unsafe { str::from_utf8_unchecked(byte_str) }
2740    }
2741
2742    /// Get the symbol as a string.
2743    ///
2744    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
2745    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
2746        self.get_inner(symbol.0.as_usize())
2747    }
2748
2749    fn get_inner(&self, index: usize) -> &[u8] {
2750        self.0.lock().byte_strs.get_index(index).unwrap()
2751    }
2752}
2753
2754// This module has a very short name because it's used a lot.
2755/// This module contains all the defined keyword `Symbol`s.
2756///
2757/// Given that `kw` is imported, use them like `kw::keyword_name`.
2758/// For example `kw::Loop` or `kw::Break`.
2759pub mod kw {
2760    pub use super::kw_generated::*;
2761}
2762
2763// This module has a very short name because it's used a lot.
2764/// This module contains all the defined non-keyword `Symbol`s.
2765///
2766/// Given that `sym` is imported, use them like `sym::symbol_name`.
2767/// For example `sym::rustfmt` or `sym::u8`.
2768pub mod sym {
2769    // Used from a macro in `librustc_feature/accepted.rs`
2770    use super::Symbol;
2771    pub use super::kw::MacroRules as macro_rules;
2772    #[doc(inline)]
2773    pub use super::sym_generated::*;
2774
2775    // Used quite often in relation to C ABI.
2776    pub const C: Symbol = ascii_letter_digit('C').unwrap();
2777
2778    // RISC-V stuff
2779    #[expect(non_upper_case_globals)]
2780    pub const f: Symbol = ascii_letter_digit('f').unwrap();
2781    #[expect(non_upper_case_globals)]
2782    pub const d: Symbol = ascii_letter_digit('d').unwrap();
2783
2784    /// Get the symbol for an integer.
2785    ///
2786    /// The first few non-negative integers each have a static symbol and therefore
2787    /// are fast.
2788    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
2789        if let Result::Ok(idx) = n.try_into() {
2790            if idx < 10 {
2791                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
2792            }
2793        }
2794        let mut buffer = itoa::Buffer::new();
2795        let printed = buffer.format(n);
2796        Symbol::intern(printed)
2797    }
2798
2799    pub const fn ascii_letter_digit(c: char) -> Option<Symbol> {
2800        let i = c as u32;
2801        Option::Some(Symbol::new(match c {
2802            '0'..='9' => super::SYMBOL_DIGITS_BASE + (i - '0' as u32),
2803            'A'..='Z' => super::SYMBOL_UPPERCASE_LETTERS_BASE + (i - 'A' as u32),
2804            'a'..='z' => super::SYMBOL_LOWERCASE_LETTERS_BASE + (i - 'a' as u32),
2805            _ => return Option::None,
2806        }))
2807    }
2808
2809    pub fn character(c: char) -> Symbol {
2810        ascii_letter_digit(c).unwrap_or_else(|| {
2811            let mut buf: [u8; char::MAX_LEN_UTF8] = Default::default();
2812            Symbol::intern(c.encode_utf8(&mut buf))
2813        })
2814    }
2815}
2816
2817impl Symbol {
2818    fn is_special(self) -> bool {
2819        self <= kw::Underscore
2820    }
2821
2822    fn is_used_keyword_always(self) -> bool {
2823        self >= kw::As && self <= kw::While
2824    }
2825
2826    fn is_unused_keyword_always(self) -> bool {
2827        self >= kw::Abstract && self <= kw::Yield
2828    }
2829
2830    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
2831        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
2832    }
2833
2834    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2835        self == kw::Gen && edition().at_least_rust_2024()
2836            || self == kw::Try && edition().at_least_rust_2018()
2837    }
2838
2839    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2840        self.is_special()
2841            || self.is_used_keyword_always()
2842            || self.is_unused_keyword_always()
2843            || self.is_used_keyword_conditional(edition)
2844            || self.is_unused_keyword_conditional(edition)
2845    }
2846
2847    pub fn is_weak(self) -> bool {
2848        self >= kw::Auto && self <= kw::Yeet
2849    }
2850
2851    /// A keyword or reserved identifier that can be used as a path segment.
2852    pub fn is_path_segment_keyword(self) -> bool {
2853        self == kw::Super
2854            || self == kw::SelfLower
2855            || self == kw::SelfUpper
2856            || self == kw::Crate
2857            || self == kw::PathRoot
2858            || self == kw::DollarCrate
2859    }
2860
2861    /// Returns `true` if the symbol is `true` or `false`.
2862    pub fn is_bool_lit(self) -> bool {
2863        self == kw::True || self == kw::False
2864    }
2865
2866    /// Returns `true` if this symbol can be a raw identifier.
2867    pub fn can_be_raw(self) -> bool {
2868        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
2869    }
2870
2871    /// Was this symbol index predefined in the compiler's `symbols!` macro?
2872    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
2873    /// takes a `u32` argument instead of a `&self` argument. Use with care.
2874    pub fn is_predefined(index: u32) -> bool {
2875        index < PREDEFINED_SYMBOLS_COUNT
2876    }
2877}
2878
2879impl Ident {
2880    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
2881    /// unnamed method parameters, crate root module, error recovery etc.
2882    pub fn is_special(self) -> bool {
2883        self.name.is_special()
2884    }
2885
2886    /// Returns `true` if the token is a keyword used in the language.
2887    pub fn is_used_keyword(self) -> bool {
2888        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2889        self.name.is_used_keyword_always()
2890            || self.name.is_used_keyword_conditional(|| self.span.edition())
2891    }
2892
2893    /// Returns `true` if the token is a keyword reserved for possible future use.
2894    pub fn is_unused_keyword(self) -> bool {
2895        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2896        self.name.is_unused_keyword_always()
2897            || self.name.is_unused_keyword_conditional(|| self.span.edition())
2898    }
2899
2900    /// Returns `true` if the token is either a special identifier or a keyword.
2901    pub fn is_reserved(self) -> bool {
2902        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2903        self.name.is_reserved(|| self.span.edition())
2904    }
2905
2906    /// A keyword or reserved identifier that can be used as a path segment.
2907    pub fn is_path_segment_keyword(self) -> bool {
2908        self.name.is_path_segment_keyword()
2909    }
2910
2911    /// We see this identifier in a normal identifier position, like variable name or a type.
2912    /// How was it written originally? Did it use the raw form? Let's try to guess.
2913    pub fn is_raw_guess(self) -> bool {
2914        self.name.can_be_raw() && self.is_reserved()
2915    }
2916
2917    /// Given the name of a lifetime without the first quote (`'`),
2918    /// returns whether the lifetime name is reserved (therefore invalid)
2919    pub fn is_reserved_lifetime(self) -> bool {
2920        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
2921    }
2922
2923    pub fn is_raw_lifetime_guess(self) -> bool {
2924        // Check that the name isn't just a single quote.
2925        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
2926        if self.name.as_str() == "'" {
2927            return false;
2928        }
2929        let ident_without_apostrophe = self.without_first_quote();
2930        ident_without_apostrophe.name != self.name
2931            && ident_without_apostrophe.name.can_be_raw()
2932            && ident_without_apostrophe.is_reserved_lifetime()
2933    }
2934
2935    pub fn guess_print_mode(self) -> IdentPrintMode {
2936        if self.is_raw_lifetime_guess() {
2937            IdentPrintMode::RawLifetime
2938        } else if self.is_raw_guess() {
2939            IdentPrintMode::RawIdent
2940        } else {
2941            IdentPrintMode::Normal
2942        }
2943    }
2944
2945    /// Whether this would be the identifier for a tuple field like `self.0`, as
2946    /// opposed to a named field like `self.thing`.
2947    pub fn is_numeric(self) -> bool {
2948        self.as_str().bytes().all(|b| b.is_ascii_digit())
2949    }
2950}
2951
2952/// Collect all the keywords in a given edition into a vector.
2953///
2954/// *Note:* Please update this if a new keyword is added beyond the current
2955/// range.
2956pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
2957    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
2958        .filter_map(|kw| {
2959            let kw = Symbol::new(kw);
2960            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
2961                Some(kw)
2962            } else {
2963                None
2964            }
2965        })
2966        .collect()
2967}