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