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