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