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