Skip to main content

rustc_span/
symbol.rs

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