Skip to main content

rustc_span/
symbol.rs

1//! An "interner" is a data structure that associates values with usize tags and
2//! allows bidirectional lookup; i.e., given a value, one can easily find the
3//! type, and vice versa.
4
5use std::hash::{Hash, Hasher};
6use std::{fmt, str};
7
8use rustc_arena::DroplessArena;
9use rustc_data_structures::fx::{FxHashSet, FxIndexSet};
10use rustc_data_structures::stable_hasher::{
11    StableCompare, StableHash, StableHashCtxt, StableHasher, ToStableHashKey,
12};
13use rustc_data_structures::sync::Lock;
14use rustc_macros::{Decodable, Encodable, StableHash, symbols};
15
16use crate::edit_distance::find_best_match_for_name;
17use crate::{DUMMY_SP, Edition, Span, with_session_globals};
18
19#[cfg(test)]
20mod tests;
21
22// The proc macro code for this is in `compiler/rustc_macros/src/symbols.rs`.
23impl Interner {
    #[doc =
    r" Creates an `Interner` with the predefined symbols from the `symbols!` macro and"]
    #[doc = r" any extra symbols provided by external drivers such as Clippy"]
    pub(crate) fn with_extra_symbols(extra_symbols: &[&'static str]) -> Self {
        Interner::prefill(&["$crate", "{{root}}", "_", "as", "break", "const",
                        "continue", "crate", "else", "enum", "extern", "false",
                        "fn", "for", "if", "impl", "in", "let", "loop", "match",
                        "mod", "move", "mut", "pub", "ref", "return", "self",
                        "Self", "static", "struct", "super", "trait", "true",
                        "type", "unsafe", "use", "where", "while", "abstract",
                        "become", "box", "do", "final", "macro", "override", "priv",
                        "typeof", "unsized", "virtual", "yield", "async", "await",
                        "dyn", "gen", "try", "'static", "'_", "auto", "builtin",
                        "catch", "contract_ensures", "contract_requires", "default",
                        "macro_rules", "raw", "reuse", "safe", "union", "yeet",
                        "Abi", "AcqRel", "Acquire", "Active", "ActiveOnly",
                        "Alignment", "Arc", "ArcWeak", "Array", "AsMut", "AsRef",
                        "AssertParamIsClone", "AssertParamIsCopy",
                        "AssertParamIsEq", "AsyncGenFinished", "AsyncGenPending",
                        "AsyncGenReady", "Atomic", "BTreeMap", "Bool", "Borrow",
                        "BorrowMut", "Break", "BuildHasher", "CStr",
                        "CallOnceFuture", "CallRefFuture", "Capture", "Cell",
                        "Char", "Cleanup", "Clone", "CoercePointee",
                        "CoercePointeeValidated", "CoerceUnsized", "Const",
                        "ConstParamTy", "ConstParamTy_", "Context", "Continue",
                        "ControlFlow", "Copy", "Cow", "Debug", "Default", "Deref",
                        "DispatchFromDyn", "Display", "Dual", "DualOnly", "Dualv",
                        "DualvOnly", "Duplicated", "DuplicatedOnly", "DynTrait",
                        "Enum", "Eq", "Equal", "Err", "ExternC", "ExternRust",
                        "Float", "FmtArgumentsNew", "Fn", "FnMut", "FnOnce",
                        "FnPtr", "Formatter", "Forward", "From", "FromIterator",
                        "FromResidual", "GlobalAlloc", "Hash", "HashMap", "HashSet",
                        "Hasher", "InCleanup", "IndexOutput", "Input", "Int",
                        "Into", "IntoFuture", "IntoIterator", "IntoIteratorItem",
                        "IrTyKind", "Item", "ItemContext", "Iterator",
                        "IteratorItem", "IteratorMap", "Layout", "Lifetime",
                        "LintPass", "LocalKey", "Mutex", "MutexGuard", "Named",
                        "NonNull", "NonZero", "None", "Normal", "Ok", "Option",
                        "Ord", "Ordering", "Other", "Output", "ParamSet",
                        "PartialEq", "PartialOrd", "Pending", "PinDerefMutHelper",
                        "Pointer", "Poll", "ProcMacro", "Range", "RangeCopy",
                        "RangeFrom", "RangeFromCopy", "RangeFull", "RangeInclusive",
                        "RangeInclusiveCopy", "RangeMax", "RangeMin", "RangeSub",
                        "RangeTo", "RangeToInclusive", "RangeToInclusiveCopy", "Rc",
                        "RcWeak", "Ready", "RefCell", "Reference", "Relaxed",
                        "Release", "Result", "ResumeTy", "Reverse", "Rust",
                        "RustaceansAreAwesome", "RwLock", "RwLockReadGuard",
                        "RwLockWriteGuard", "SelfTy", "Send", "SeqCst", "Sized",
                        "Slice", "SliceIndex", "Some", "Source", "SpanCtxt", "Str",
                        "String", "Struct", "StructuralPartialEq", "SymbolIntern",
                        "Sync", "SyncUnsafeCell", "Target", "This", "TokenStream",
                        "Trait", "TrivialClone", "Try", "TryCaptureGeneric",
                        "TryCapturePrintable", "TryFrom", "TryInto", "Tuple", "Ty",
                        "TyCtxt", "TyKind", "Type", "Union", "Unsize", "Vec",
                        "Wrapper", "_DECLS", "__H", "__S", "__awaitee", "__try_var",
                        "_t", "_task_context", "a32", "aarch64",
                        "aarch64_target_feature", "aarch64_unstable_target_feature",
                        "aarch64_ver_target_feature", "abi", "abi_amdgpu_kernel",
                        "abi_avr_interrupt", "abi_c_cmse_nonsecure_call",
                        "abi_cmse_nonsecure_call", "abi_custom", "abi_efiapi",
                        "abi_gpu_kernel", "abi_msp430_interrupt", "abi_ptx",
                        "abi_riscv_interrupt", "abi_sysv64", "abi_thiscall",
                        "abi_unadjusted", "abi_vectorcall", "abi_x86_interrupt",
                        "abort", "add", "add_assign", "add_with_overflow",
                        "address", "adt_const_params", "advanced_slice_patterns",
                        "adx_target_feature", "aes", "aggregate_raw_ptr", "alias",
                        "align", "align_of", "align_of_val", "alignment", "all",
                        "alloc", "alloc_error_handler", "alloc_layout",
                        "alloc_zeroed", "allocator", "allocator_api",
                        "allocator_internals", "allow", "allow_fail",
                        "allow_internal_unsafe", "allow_internal_unstable",
                        "altivec", "alu32", "always", "amdgpu",
                        "amdgpu_dispatch_ptr", "analysis", "and", "and_then",
                        "anon", "anon_assoc", "anonymous_lifetime_in_impl_trait",
                        "any", "apx_target_feature", "arbitrary_enum_discriminant",
                        "arbitrary_self_types", "arbitrary_self_types_pointers",
                        "areg", "args", "arith_offset", "arm", "arm64ec",
                        "arm::a32", "arm::t32", "arm_target_feature", "array",
                        "as-needed", "as_ref", "asm", "asm_cfg", "asm_const",
                        "asm_experimental_arch", "asm_experimental_reg", "asm_goto",
                        "asm_goto_with_outputs", "asm_sym", "asm_unwind", "assert",
                        "assert_eq", "assert_eq_macro", "assert_fields_are_eq",
                        "assert_inhabited", "assert_macro",
                        "assert_mem_uninitialized_valid", "assert_ne_macro",
                        "assert_receiver_is_total_eq", "assert_zero_valid",
                        "asserting", "associated_const_equality",
                        "associated_consts", "associated_type_bounds",
                        "associated_type_defaults", "associated_types", "assume",
                        "assume_init", "*", "async_await", "async_call",
                        "async_call_mut", "async_call_once", "async_closure",
                        "async_drop", "async_drop_in_place", "async_fn",
                        "async_fn_in_dyn_trait", "async_fn_in_trait",
                        "async_fn_kind_helper", "async_fn_kind_upvars",
                        "async_fn_mut", "async_fn_once", "async_fn_once_output",
                        "async_fn_track_caller", "async_fn_traits",
                        "async_for_loop", "async_gen_internals", "async_iterator",
                        "async_iterator_poll_next", "async_trait_bounds",
                        "atomic_and", "atomic_cxchg", "atomic_cxchgweak",
                        "atomic_fence", "atomic_load", "atomic_max", "atomic_min",
                        "atomic_nand", "atomic_or", "atomic_singlethreadfence",
                        "atomic_store", "atomic_umax", "atomic_umin", "atomic_xadd",
                        "atomic_xchg", "atomic_xor", "atomic_xsub", "atomics",
                        "att_syntax", "attr", "attr_literals", "attribute",
                        "attributes", "audit_that", "augmented_assignments",
                        "auto_cfg", "auto_traits", "autodiff", "autodiff_forward",
                        "autodiff_reverse", "automatically_derived",
                        "available_externally", "avr", "avr_target_feature", "avx",
                        "avx10_target_feature", "avx512_target_feature", "avx512bw",
                        "avx512f", "await_macro", "backchain", "backend_repr",
                        "bang", "begin_panic", "bench", "bevy_ecs", "bikeshed",
                        "bikeshed_guaranteed_no_drop", "bin",
                        "bind_by_move_pattern_guards", "bindings_after_at",
                        "bitand", "bitand_assign", "bitor", "bitor_assign",
                        "bitreverse", "bits", "bitxor", "bitxor_assign",
                        "black_box", "block", "blocking", "bool",
                        "borrowck_graphviz_format", "borrowck_graphviz_postflow",
                        "box_new", "box_patterns", "box_syntax", "boxed_slice",
                        "bpf", "bpf_target_feature", "braced_empty_structs",
                        "branch", "breakpoint", "bridge", "bswap", "built",
                        "builtin_syntax", "bundle", "c_dash_variadic",
                        "c_str_literals", "c_unwind", "c_variadic",
                        "c_variadic_experimental_arch",
                        "c_variadic_naked_functions", "c_void", "call", "call_mut",
                        "call_once", "call_once_future", "call_ref_future",
                        "caller", "caller_location", "capture_disjoint_fields",
                        "carrying_mul_add", "carryless_mul", "catch_unwind",
                        "cause", "cdylib", "ceilf16", "ceilf32", "ceilf64",
                        "ceilf128", "cfg", "cfg_accessible", "cfg_attr",
                        "cfg_attr_multi", "<cfg_attr_trace>",
                        "cfg_boolean_literals", "cfg_contract_checks",
                        "cfg_doctest", "cfg_emscripten_wasm_eh", "cfg_eval",
                        "cfg_overflow_checks", "cfg_panic", "cfg_relocation_model",
                        "cfg_sanitize", "cfg_sanitizer_cfi", "cfg_select",
                        "cfg_target_abi", "cfg_target_compact",
                        "cfg_target_feature", "cfg_target_has_atomic",
                        "cfg_target_has_atomic_equal_alignment",
                        "cfg_target_has_reliable_f16_f128",
                        "cfg_target_object_format", "cfg_target_thread_local",
                        "cfg_target_vendor", "<cfg_trace>", "cfg_ub_checks",
                        "cfg_version", "cfi", "cfi_encoding", "char", "client",
                        "clippy", "clobber_abi", "clone", "clone_closures",
                        "clone_fn", "clone_from", "closure",
                        "closure_lifetime_binder", "closure_to_fn_coercion",
                        "closure_track_caller", "cmp", "cmp_ord_max", "cmp_ord_min",
                        "cmp_partialeq_eq", "cmp_partialeq_ne",
                        "cmp_partialord_cmp", "cmp_partialord_ge",
                        "cmp_partialord_gt", "cmp_partialord_le",
                        "cmp_partialord_lt", "cmpxchg16b_target_feature",
                        "cmse_nonsecure_entry", "coerce_pointee_validated",
                        "coerce_shared", "coerce_unsized", "coff", "cold",
                        "cold_path", "collapse_debuginfo", "column", "common",
                        "compare_bytes", "compare_exchange",
                        "compare_exchange_weak", "compile_error", "compiler",
                        "compiler_builtins", "compiler_copy", "compiler_fence",
                        "compiler_move", "concat", "concat_bytes",
                        "conservative_impl_trait", "console", "const_allocate",
                        "const_async_blocks", "const_block_items",
                        "const_c_variadic", "const_closures",
                        "const_compare_raw_pointers", "const_constructor",
                        "const_continue", "const_deallocate", "const_destruct",
                        "const_eval_limit", "const_eval_select",
                        "const_evaluatable_checked", "const_extern_fn", "const_fn",
                        "const_fn_floating_point_arithmetic",
                        "const_fn_fn_ptr_basics", "const_fn_trait_bound",
                        "const_fn_transmute", "const_fn_union", "const_fn_unsize",
                        "const_for", "const_format_args", "const_generics",
                        "const_generics_defaults", "const_if_match",
                        "const_impl_trait", "const_in_array_repeat_expressions",
                        "const_indexing", "const_let", "const_loop",
                        "const_make_global", "const_mut_refs", "const_panic",
                        "const_panic_fmt", "const_param_ty",
                        "const_precise_live_drops", "const_ptr_cast",
                        "const_raw_ptr_deref", "const_raw_ptr_to_usize_cast",
                        "const_refs_to_cell", "const_refs_to_static",
                        "const_trait_bound_opt_out", "const_trait_impl",
                        "const_try", "<const_ty>", "constant", "constructor",
                        "contract_build_check_ensures", "contract_check_ensures",
                        "contract_check_requires", "contract_checks", "contracts",
                        "contracts_ensures", "contracts_internals",
                        "contracts_requires", "convert", "copy", "copy_closures",
                        "copy_nonoverlapping", "copysignf16", "copysignf32",
                        "copysignf64", "copysignf128", "core", "core_panic",
                        "core_panic_2015_macro", "core_panic_macro", "coroutine",
                        "coroutine_clone", "coroutine_resume", "coroutine_return",
                        "coroutine_state", "coroutine_yield", "coroutines",
                        "cosf16", "cosf32", "cosf64", "cosf128", "count",
                        "coverage", "coverage_attribute", "cr", "crate_in_paths",
                        "crate_local", "crate_name", "crate_type",
                        "crate_visibility_modifier", "crt-static", "csky",
                        "csky_target_feature", "cstr_type", "cstring_type", "ctlz",
                        "ctlz_nonzero", "ctpop", "ctr", "cttz", "cttz_nonzero",
                        "custom_attribute", "custom_code_classes_in_docs",
                        "custom_derive", "custom_inner_attributes", "custom_mir",
                        "custom_test_frameworks", "d32", "dbg_macro", "dead_code",
                        "dealloc", "debug", "debug_assert_eq_macro",
                        "debug_assert_macro", "debug_assert_ne_macro",
                        "debug_assertions", "debug_struct_fields_finish",
                        "debug_tuple_fields_finish", "debugger_visualizer",
                        "decl_macro", "declare_lint_pass", "decorated",
                        "default_alloc_error_handler", "default_field_values",
                        "default_fn", "default_lib_allocator",
                        "default_method_body_is_const", "default_trait1",
                        "default_trait2", "default_trait3", "default_trait4",
                        "default_type_parameter_fallback", "default_type_params",
                        "define_opaque", "deny", "deprecated", "deprecated_safe",
                        "deprecated_suggestion", "deref", "deref_method",
                        "deref_mut", "deref_patterns", "deref_pure", "deref_target",
                        "derive", "derive_const", "118304", "derive_default_enum",
                        "derive_from", "derive_smart_pointer", "destruct",
                        "destructuring_assignment", "diagnostic",
                        "diagnostic_namespace", "diagnostic_on_const",
                        "diagnostic_on_move", "diagnostic_on_unknown",
                        "diagnostic_on_unmatch_args", "dialect", "direct",
                        "discriminant_kind", "discriminant_type",
                        "discriminant_value", "disjoint_bitor", "dispatch_from_dyn",
                        "div", "div_assign", "diverging_block_default", "dl",
                        "do_not_recommend", "doc", "doc_alias", "doc_auto_cfg",
                        "doc_cfg", "doc_cfg_hide", "doc_keyword", "doc_masked",
                        "doc_notable_trait", "doc_primitive", "doc_spotlight",
                        "doctest", "dotdot_in_tuple_patterns",
                        "dotdoteq_in_patterns", "dreg", "dreg_low8", "dreg_low16",
                        "drop", "drop_in_place", "drop_types_in_const",
                        "dropck_eyepatch", "dropck_parametricity", "<!dummy!>",
                        "dummy_cgu_name", "dylib", "dyn_compatible_for_dispatch",
                        "dyn_metadata", "dyn_star", "dyn_trait", "dynamic-no-pic",
                        "edition_panic", "effective_target_features", "effects",
                        "eh_catch_typeinfo", "eh_personality", "eii",
                        "eii_declaration", "eii_internals", "eii_shared_macro",
                        "element_ty", "elf", "", "{}", "emscripten_wasm_eh",
                        "enable", "end", "entry_nops", "env", "eq",
                        "ergonomic_clones", "ermsb_target_feature", "exact_div",
                        "except", "exception-handling", "exclusive_range_pattern",
                        "exhaustive_integer_patterns", "exhaustive_patterns",
                        "existential_type", "exp2f16", "exp2f32", "exp2f64",
                        "exp2f128", "expect", "expected", "expf16", "expf32",
                        "expf64", "expf128", "explicit_extern_abis",
                        "explicit_generic_args_with_impl_trait",
                        "explicit_tail_calls", "export_name", "export_stable",
                        "export-symbols", "expr", "expr_2021",
                        "expr_fragment_specifier_2024",
                        "extended_key_value_attributes",
                        "extended_varargs_abi_support", "extern_absolute_paths",
                        "extern_crate_item_prelude", "extern_crate_self",
                        "extern_in_paths", "extern_item_impls", "extern_prelude",
                        "extern_system_varargs", "extern_types", "extern_weak",
                        "external", "external_doc", "f16", "f16_nan",
                        "f16c_target_feature", "f32", "f32_nan", "f64", "f64_nan",
                        "f128", "f128_nan", "fabs", "fadd_algebraic", "fadd_fast",
                        "fake_variadic", "fallback", "fdiv_algebraic", "fdiv_fast",
                        "feature", "fence", "🦀", "fetch_update", "ffi_const",
                        "ffi_pure", "ffi_returns_twice", "field", "field_base",
                        "field_init_shorthand", "field_of", "field_offset",
                        "field_projections", "field_representing_type",
                        "field_representing_type_raw", "field_type", "fields",
                        "file", "final_associated_functions",
                        "float_to_int_unchecked", "floorf16", "floorf32",
                        "floorf64", "floorf128", "fma4_target_feature", "fmaf16",
                        "fmaf32", "fmaf64", "fmaf128", "fmt", "fmt_debug",
                        "fmul_algebraic", "fmul_fast", "fmuladdf16", "fmuladdf32",
                        "fmuladdf64", "fmuladdf128", "fn_align", "fn_body",
                        "fn_delegation", "fn_must_use", "fn_mut", "fn_once",
                        "fn_once_output", "fn_ptr_addr", "fn_ptr_trait", "forbid",
                        "force_target_feature", "forget", "format_args",
                        "format_args_capture", "format_args_nl", "format_argument",
                        "format_arguments", "format_macro", "framework", "freeze",
                        "freeze_impls", "freg", "frem_algebraic", "frem_fast",
                        "from", "from_desugaring", "from_iter", "from_output",
                        "from_residual", "from_size_align_unchecked",
                        "from_size_alignment_unchecked", "from_str",
                        "from_str_nonconst", "from_usize", "from_yeet",
                        "frontmatter", "fsub_algebraic", "fsub_fast", "full",
                        "fundamental", "fused_iterator", "future_output",
                        "future_trait", "fxsr", "gdb_script_file", "ge",
                        "gen_blocks", "gen_future", "generator_clone", "generators",
                        "generic_arg_infer", "generic_assert",
                        "generic_associated_types",
                        "generic_associated_types_extended", "generic_const_args",
                        "generic_const_exprs", "generic_const_items",
                        "generic_const_parameter_types", "generic_param_attrs",
                        "generic_pattern_types", "generics", "get_context",
                        "global_alloc_ty", "global_allocator", "global_asm",
                        "global_registration", "globs",
                        "gpu_launch_sized_workgroup_mem", "gt", "guard",
                        "guard_patterns", "half_open_range_patterns",
                        "half_open_range_patterns_in_slices", "hash", "hexagon",
                        "hexagon_target_feature", "hidden", "hide",
                        "homogeneous_aggregate", "html_favicon_url",
                        "html_logo_url", "html_no_source", "html_playground_url",
                        "html_root_url", "hvx", "hvx-length64b", "hvx-length128b",
                        "hwaddress", "i8", "i16", "i32", "i64", "i128", "i128_type",
                        "ident", "if_let", "if_let_guard", "if_let_rescope",
                        "if_while_or_patterns", "ignore", "immediate-abort",
                        "impl_header_lifetime_elision", "impl_lint_pass",
                        "impl_restriction", "impl_trait_in_assoc_type",
                        "impl_trait_in_bindings", "impl_trait_in_fn_trait_return",
                        "impl_trait_projections", "implied_by", "import",
                        "import_name_type", "import_shadowing",
                        "import_trait_associated_functions", "imported_main",
                        "in_band_lifetimes", "include", "include_bytes",
                        "include_str", "inclusive_range_syntax",
                        "incomplete_features", "index", "index_mut",
                        "infer_outlives_requirements",
                        "infer_static_outlives_requirements",
                        "inherent_associated_types", "initial", "inlateout",
                        "inline", "inline_const", "inline_const_pat", "inout",
                        "inputs", "instruction_set", "integer", "integral",
                        "internal", "internal_eq_trait_method_impls",
                        "internal_features", "into_async_iter_into_iter",
                        "into_future", "into_iter", "into_try_type",
                        "intra_doc_pointers", "intrinsics",
                        "irrefutable_let_patterns", "is", "is_auto",
                        "is_val_statically_known", "isa_attribute", "isize",
                        "issue", "issue_5723_bootstrap", "issue_tracker_base_url",
                        "item", "item_like_imports", "iter", "iter_mut", "iterator",
                        "iterator_collect_fn", "kcfi", "kernel_address",
                        "kernel_hwaddress", "keylocker_x86", "keyword", "kind",
                        "kreg", "kreg0", "label", "label_break_value",
                        "lahfsahf_target_feature", "lang", "lang_items",
                        "large_assignments", "last", "lateout",
                        "lazy_normalization_consts", "lazy_type_alias", "le",
                        "legacy_receiver", "len", "let_chains", "let_else", "lhs",
                        "lib", "libc", "lifetime", "lifetime_capture_rules_2024",
                        "lifetimes", "line", "link", "link_arg_attribute",
                        "link_args", "link_cfg", "link-arg", "link_llvm_intrinsics",
                        "link_name", "link_ordinal", "link_section", "linkage",
                        "linker", "linker_info", "linker_messages", "linkonce",
                        "linkonce_odr", "lint_reasons", "literal", "little", "big",
                        "load", "loaded_from_disk", "local", "local_inner_macros",
                        "log2f16", "log2f32", "log2f64", "log2f128", "log10f16",
                        "log10f32", "log10f64", "log10f128", "log_syntax", "logf16",
                        "logf32", "logf64", "logf128", "loongarch32", "loongarch64",
                        "loongarch_target_feature", "loop_break_value",
                        "loop_match", "lr", "lt", "m68k", "m68k_target_feature",
                        "mach-o", "macro_at_most_once_rep", "macro_attr",
                        "macro_attributes_in_derive_output", "macro_derive",
                        "macro_escape", "macro_export", "macro_guard_matcher",
                        "macro_lifetime_matcher", "macro_literal_matcher",
                        "macro_metavar_expr", "macro_metavar_expr_concat",
                        "macro_reexport", "macro_use", "macro_vis_matcher",
                        "macros_in_extern", "main", "managed_boxes",
                        "manually_drop", "map", "map_err", "marker",
                        "marker_trait_attr", "masked", "match_beginning_vert",
                        "match_default_bindings", "maximum_number_nsz_f16",
                        "maximum_number_nsz_f32", "maximum_number_nsz_f64",
                        "maximum_number_nsz_f128", "maximumf16", "maximumf32",
                        "maximumf64", "maximumf128", "may_dangle", "may_unwind",
                        "maybe_dangling", "maybe_uninit", "maybe_uninit_uninit",
                        "maybe_uninit_zeroed", "mem", "mem_align_const",
                        "mem_discriminant", "mem_drop", "mem_forget",
                        "mem_size_const", "mem_swap", "mem_uninitialized",
                        "mem_variant_count", "mem_zeroed", "member_constraints",
                        "memory", "memtag", "message", "meta", "meta_sized",
                        "metadata_type", "mgca_type_const_syntax",
                        "min_adt_const_params", "min_const_fn",
                        "min_const_generics", "min_const_unsafe_fn",
                        "min_exhaustive_patterns", "min_generic_const_args",
                        "min_specialization", "min_type_alias_impl_trait",
                        "minimum_number_nsz_f16", "minimum_number_nsz_f32",
                        "minimum_number_nsz_f64", "minimum_number_nsz_f128",
                        "minimumf16", "minimumf32", "minimumf64", "minimumf128",
                        "mips", "mips32r6", "mips64", "mips64r6",
                        "mips_target_feature", "mir_assume", "mir_basic_block",
                        "mir_call", "mir_cast_ptr_to_ptr", "mir_cast_transmute",
                        "mir_cast_unsize", "mir_checked", "mir_debuginfo",
                        "mir_discriminant", "mir_drop", "mir_field", "mir_goto",
                        "mir_make_place", "mir_move", "mir_offset",
                        "mir_ptr_metadata", "mir_return", "mir_return_to",
                        "mir_set_discriminant", "mir_static", "mir_static_mut",
                        "mir_storage_dead", "mir_storage_live", "mir_tail_call",
                        "mir_unreachable", "mir_unwind_cleanup",
                        "mir_unwind_continue", "mir_unwind_resume",
                        "mir_unwind_terminate", "mir_unwind_terminate_reason",
                        "mir_unwind_unreachable", "mir_variant", "miri", "mmx_reg",
                        "modifiers", "module", "module_path", "more_maybe_bounds",
                        "more_qualified_paths", "more_struct_aliases",
                        "movbe_target_feature", "move_ref_pattern",
                        "move_size_limit", "movrs_target_feature", "msp430", "mul",
                        "mul_assign", "mul_with_overflow",
                        "multiple_supertrait_upcastable", "must_not_suspend",
                        "must_use", "mut_preserve_binding_mode_2024", "mut_ref",
                        "mutable", "naked", "naked_asm", "naked_functions",
                        "naked_functions_rustic_abi",
                        "naked_functions_target_feature", "name", "names",
                        "native_link_modifiers", "native_link_modifiers_as_needed",
                        "native_link_modifiers_bundle",
                        "native_link_modifiers_verbatim",
                        "native_link_modifiers_whole_archive", "natvis_file", "ne",
                        "needs_allocator", "needs_drop", "needs_panic_runtime",
                        "neg", "negate_unsigned", "negative_bounds",
                        "negative_impls", "neon", "nested", "never",
                        "never_patterns", "never_type", "never_type_fallback",
                        "new", "new_binary", "new_debug", "new_debug_noop",
                        "new_display", "new_lower_exp", "new_lower_hex",
                        "new_octal", "new_pointer", "new_range", "new_unchecked",
                        "new_upper_exp", "new_upper_hex", "next", "niko", "nll",
                        "no", "no_builtins", "no_core", "no_coverage",
                        "no_crate_inject", "no_debug", "no_default_passes",
                        "no_implicit_prelude", "no_inline", "no_link", "no_main",
                        "no_mangle", "no_sanitize", "no_stack_check", "no_std",
                        "nomem", "non_ascii_idents", "non_exhaustive",
                        "non_exhaustive_omitted_patterns_lint",
                        "non_lifetime_binders", "non_modrs_mods", "nonblocking",
                        "none", "nontemporal_store", "noop_method_borrow",
                        "noop_method_clone", "noop_method_deref", "noprefix",
                        "noreturn", "nostack", "not", "notable_trait", "note",
                        "null", "nvptx64", "nvptx_target_feature",
                        "object_safe_for_dispatch", "of", "off", "offload",
                        "offset", "offset_of", "offset_of_enum", "offset_of_nested",
                        "offset_of_slice", "ok_or_else", "old_name",
                        "omit_gdb_pretty_printer_section", "on", "on_const",
                        "on_move", "on_unimplemented", "on_unknown",
                        "on_unmatch_args", "opaque", "<opaque>", "ops",
                        "opt_out_copy", "optimize", "optimize_attribute",
                        "optimized", "optin_builtin_traits", "option", "option_env",
                        "options", "or", "or_patterns", "ord_cmp_method", "other",
                        "out", "output", "overflow_checks",
                        "overlapping_marker_traits", "owned_box", "packed",
                        "packed_bundled_libs", "panic", "panic_2015", "panic_2021",
                        "panic_abort", "panic_bounds_check", "panic_cannot_unwind",
                        "panic_const_add_overflow", "panic_const_async_fn_resumed",
                        "panic_const_async_fn_resumed_drop",
                        "panic_const_async_fn_resumed_panic",
                        "panic_const_async_gen_fn_resumed",
                        "panic_const_async_gen_fn_resumed_drop",
                        "panic_const_async_gen_fn_resumed_panic",
                        "panic_const_coroutine_resumed",
                        "panic_const_coroutine_resumed_drop",
                        "panic_const_coroutine_resumed_panic",
                        "panic_const_div_by_zero", "panic_const_div_overflow",
                        "panic_const_gen_fn_none", "panic_const_gen_fn_none_drop",
                        "panic_const_gen_fn_none_panic", "panic_const_mul_overflow",
                        "panic_const_neg_overflow", "panic_const_rem_by_zero",
                        "panic_const_rem_overflow", "panic_const_shl_overflow",
                        "panic_const_shr_overflow", "panic_const_sub_overflow",
                        "panic_display", "panic_fmt", "panic_handler", "panic_impl",
                        "panic_implementation", "panic_in_cleanup", "panic_info",
                        "panic_invalid_enum_construction", "panic_location",
                        "panic_misaligned_pointer_dereference", "panic_nounwind",
                        "panic_null_pointer_dereference", "panic_runtime",
                        "panic_str_2015", "panic_unwind", "panicking",
                        "param_attrs", "parent_label", "partial_cmp", "partial_ord",
                        "passes", "pat", "pat_param", "patchable_function_entry",
                        "path", "pattern_complexity_limit", "pattern_parentheses",
                        "pattern_type", "pattern_type_range_trait", "pattern_types",
                        "phantom_data", "phase", "pic", "pie", "pin",
                        "pin_ergonomics", "pin_v2", "platform_intrinsics", "plugin",
                        "plugin_registrar", "plugins", "pointee", "pointee_sized",
                        "pointee_trait", "pointer", "poll", "post-cleanup",
                        "post-lto", "postfix_match", "powerpc", "powerpc64",
                        "powerpc_target_feature", "powf16", "powf32", "powf64",
                        "powf128", "powif16", "powif32", "powif64", "powif128",
                        "pre-lto", "precise_capturing",
                        "precise_capturing_in_traits",
                        "precise_pointer_size_matching", "predicates",
                        "pref_align_of", "prefetch_read_data",
                        "prefetch_read_instruction", "prefetch_write_data",
                        "prefetch_write_instruction", "prefix_nops", "preg",
                        "prelude", "prelude_import", "preserves_flags",
                        "prfchw_target_feature", "proc-macro", "proc_macro",
                        "proc_macro_attribute", "proc_macro_derive",
                        "proc_macro_expr", "proc_macro_gen", "proc_macro_hygiene",
                        "proc_macro_internals", "proc_macro_mod",
                        "proc_macro_non_items", "proc_macro_path_invoc",
                        "profiler_runtime", "ptr", "ptr_cast", "ptr_cast_const",
                        "ptr_cast_mut", "ptr_const_is_null", "ptr_copy",
                        "ptr_copy_nonoverlapping", "ptr_from_ref",
                        "ptr_guaranteed_cmp", "ptr_is_null", "ptr_mask",
                        "ptr_metadata", "ptr_null", "ptr_null_mut",
                        "ptr_offset_from", "ptr_offset_from_unsigned", "ptr_read",
                        "ptr_read_unaligned", "ptr_replace", "ptr_swap",
                        "ptr_swap_nonoverlapping", "ptr_write", "ptr_write_bytes",
                        "ptr_write_unaligned", "ptr_write_volatile",
                        "pub_macro_rules", "pub_restricted", "public", "pure",
                        "pushpop_unsafe", "qreg", "qreg_low4", "qreg_low8",
                        "quad_precision_float", "question_mark", "quote",
                        "range_inclusive_new", "raw-dylib", "raw_dylib",
                        "raw_dylib_elf", "raw_eq", "raw_identifiers", "raw_ref_op",
                        "re_rebalance_coherence", "read_via_copy", "readonly",
                        "realloc", "realtime", "reason", "reborrow", "receiver",
                        "receiver_target", "recursion_limit",
                        "reexport_test_harness_main", "ref_pat_eat_one_layer_2024",
                        "ref_pat_eat_one_layer_2024_structural",
                        "ref_pat_everywhere", "ref_unwind_safe_trait", "reference",
                        "reflect", "reg", "reg16", "reg32", "reg64", "reg_abcd",
                        "reg_addr", "reg_byte", "reg_data", "reg_iw", "reg_nonzero",
                        "reg_pair", "reg_ptr", "reg_upper", "register_attr",
                        "register_tool", "relaxed_adts", "relaxed_struct_unsize",
                        "relocation_model", "rem", "rem_assign", "repr", "repr128",
                        "repr_align", "repr_align_enum", "repr_packed", "repr_simd",
                        "repr_transparent", "require", "reserve-x18", "residual",
                        "result", "result_ffi_guarantees",
                        "return_position_impl_trait_in_trait",
                        "return_type_notation", "riscv32", "riscv64",
                        "riscv_target_feature", "rlib", "ropi", "ropi-rwpi",
                        "rotate_left", "rotate_right", "round_ties_even_f16",
                        "round_ties_even_f32", "round_ties_even_f64",
                        "round_ties_even_f128", "roundf16", "roundf32", "roundf64",
                        "roundf128", "rtm_target_feature", "runtime", "rust",
                        "rust_2015", "rust_2018", "rust_2018_preview", "rust_2021",
                        "rust_2024", "rust_analyzer", "rust_begin_unwind",
                        "rust_cold_cc", "rust_eh_catch_typeinfo",
                        "rust_eh_personality", "rust_future", "rust_logo",
                        "rust_out", "rust_preserve_none_cc", "rustc", "rustc_abi",
                        "rustc_align", "rustc_align_static", "rustc_allocator",
                        "rustc_allocator_zeroed", "rustc_allocator_zeroed_variant",
                        "rustc_allow_const_fn_unstable",
                        "rustc_allow_incoherent_impl",
                        "rustc_allowed_through_unstable_modules", "rustc_as_ptr",
                        "rustc_attrs", "rustc_autodiff", "rustc_builtin_macro",
                        "rustc_capture_analysis", "rustc_clean",
                        "rustc_coherence_is_core", "rustc_coinductive",
                        "rustc_confusables", "rustc_const_stable",
                        "rustc_const_stable_indirect", "rustc_const_unstable",
                        "rustc_conversion_suggestion", "rustc_deallocator",
                        "rustc_default_body_unstable",
                        "rustc_delayed_bug_from_inside_query",
                        "rustc_deny_explicit_impl", "rustc_deprecated_safe_2024",
                        "rustc_diagnostic_item", "rustc_diagnostic_macros",
                        "rustc_do_not_const_check", "rustc_doc_primitive",
                        "rustc_driver", "rustc_dummy", "rustc_dump_def_parents",
                        "rustc_dump_def_path", "rustc_dump_hidden_type_of_opaques",
                        "rustc_dump_inferred_outlives", "rustc_dump_item_bounds",
                        "rustc_dump_layout", "rustc_dump_object_lifetime_defaults",
                        "rustc_dump_predicates", "rustc_dump_symbol_name",
                        "rustc_dump_user_args", "rustc_dump_variances",
                        "rustc_dump_variances_of_opaques", "rustc_dump_vtable",
                        "rustc_dyn_incompatible_trait",
                        "rustc_effective_visibility", "rustc_eii_foreign_item",
                        "rustc_evaluate_where_clauses", "rustc_expected_cgu_reuse",
                        "rustc_force_inline", "rustc_has_incoherent_inherent_impls",
                        "rustc_if_this_changed", "rustc_inherit_overflow_checks",
                        "rustc_insignificant_dtor", "rustc_intrinsic",
                        "rustc_intrinsic_const_stable_indirect",
                        "rustc_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_owned_method", "to_string", "to_vec",
                        "tool_attributes", "tool_lints", "trace_macros",
                        "track_caller", "trait_alias", "trait_ty",
                        "trait_upcasting", "transmute", "transmute_generic_consts",
                        "transmute_opts", "transmute_trait", "transmute_unchecked",
                        "transparent", "transparent_enums", "transparent_unions",
                        "trivial_bounds", "trivial_clone", "truncf16", "truncf32",
                        "truncf64", "truncf128", "try_blocks",
                        "try_blocks_heterogeneous", "try_capture", "try_from",
                        "try_into", "try_trait_v2", "try_trait_v2_residual",
                        "try_update", "tt", "tuple", "tuple_indexing",
                        "tuple_trait", "two_phase", "ty",
                        "type_alias_enum_variants", "type_alias_impl_trait",
                        "type_ascribe", "type_ascription",
                        "type_changing_struct_update", "type_id", "type_id_eq",
                        "type_id_vtable", "type_info", "type_ir",
                        "type_ir_infer_ctxt_like", "type_ir_inherent",
                        "type_ir_interner", "type_length_limit", "type_macros",
                        "type_name", "type_of", "type_privacy_lints",
                        "typed_swap_nonoverlapping", "u8", "u8_legacy_const_max",
                        "u8_legacy_const_min", "u8_legacy_fn_max_value",
                        "u8_legacy_fn_min_value", "u8_legacy_mod", "u16",
                        "u16_legacy_const_max", "u16_legacy_const_min",
                        "u16_legacy_fn_max_value", "u16_legacy_fn_min_value",
                        "u16_legacy_mod", "u32", "u32_legacy_const_max",
                        "u32_legacy_const_min", "u32_legacy_fn_max_value",
                        "u32_legacy_fn_min_value", "u32_legacy_mod", "u64",
                        "u64_legacy_const_max", "u64_legacy_const_min",
                        "u64_legacy_fn_max_value", "u64_legacy_fn_min_value",
                        "u64_legacy_mod", "u128", "u128_legacy_const_max",
                        "u128_legacy_const_min", "u128_legacy_fn_max_value",
                        "u128_legacy_fn_min_value", "u128_legacy_mod", "ub_checks",
                        "unaligned_volatile_load", "unaligned_volatile_store",
                        "unboxed_closures", "unchecked_add", "unchecked_div",
                        "unchecked_funnel_shl", "unchecked_funnel_shr",
                        "unchecked_mul", "unchecked_rem", "unchecked_shl",
                        "unchecked_shr", "unchecked_sub", "undecorated",
                        "underscore_const_names", "underscore_imports",
                        "underscore_lifetimes", "uniform_paths", "unit",
                        "universal_impl_trait", "unix", "unlikely", "unmarked_api",
                        "unnamed_fields", "unpin", "unqualified_local_imports",
                        "unreachable", "unreachable_2015", "unreachable_2015_macro",
                        "unreachable_2021", "unreachable_code",
                        "unreachable_display", "unreachable_macro",
                        "unrestricted_attribute_tokens", "unsafe_attributes",
                        "unsafe_binders", "unsafe_block_in_unsafe_fn",
                        "unsafe_cell", "unsafe_cell_raw_get", "unsafe_eii",
                        "unsafe_extern_blocks", "unsafe_fields",
                        "unsafe_no_drop_flag", "unsafe_pinned", "unsafe_unpin",
                        "unsafety", "unsize", "unsized_const_param_ty",
                        "unsized_const_params", "unsized_fn_params",
                        "unsized_locals", "unsized_tuple_coercion", "unstable",
                        "unstable_feature_bound",
                        "this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead?",
                        "unstable_removed", "untagged_unions", "unused_imports",
                        "unwind", "unwind_attributes", "unwind_safe_trait",
                        "unwrap", "unwrap_binder", "unwrap_or", "update",
                        "use_cloned", "use_extern_macros", "use_nested_groups",
                        "used", "used_with_arg", "using", "usize",
                        "usize_legacy_const_max", "usize_legacy_const_min",
                        "usize_legacy_fn_max_value", "usize_legacy_fn_min_value",
                        "usize_legacy_mod", "v1", "v8plus", "va_arg", "va_arg_safe",
                        "va_copy", "va_end", "va_list", "va_start", "val",
                        "validity", "value", "values", "var", "variadic",
                        "variant_count", "variants", "vec", "vector", "verbatim",
                        "version", "vfp2", "view_types", "vis",
                        "visible_private_types", "volatile", "volatile_copy_memory",
                        "volatile_copy_nonoverlapping_memory", "volatile_load",
                        "volatile_set_memory", "volatile_store", "vreg",
                        "vreg_low16", "vreg_pair", "vsreg", "vsx", "vtable_align",
                        "vtable_size", "warn", "wasip2", "wasm", "wasm32", "wasm64",
                        "wasm_abi", "wasm_import_module", "wasm_target_feature",
                        "weak", "weak_odr", "where_clause_attrs", "while_let",
                        "whole-archive", "width", "windows", "windows_subsystem",
                        "with_negative_coherence", "wrap_binder", "wrapping_add",
                        "wrapping_div", "wrapping_mul", "wrapping_rem",
                        "wrapping_rem_euclid", "wrapping_sub", "wreg",
                        "write_box_via_move", "write_bytes", "write_fmt",
                        "write_macro", "write_str", "write_via_move",
                        "writeln_macro", "x86", "x86_64", "x86_amx_intrinsics",
                        "x87_reg", "x87_target_feature", "xcoff", "xer", "xmm_reg",
                        "xop_target_feature", "xtensa", "yeet_desugar_details",
                        "yeet_expr", "yes", "yield_expr", "ymm_reg", "yreg", "zca",
                        "zfh", "zfhmin", "zmm_reg", "ztso", "0", "1", "2", "3", "4",
                        "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G",
                        "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
                        "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e",
                        "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
                        "r", "s", "t", "u", "v", "w", "x", "y", "z",
                        "1.97.0-nightly"], extra_symbols)
    }
}symbols! {
24    // This list includes things that are definitely keywords (e.g. `if`), a
25    // few things that are definitely not keywords (e.g. `{{root}}`) and things
26    // where there is disagreement between people and/or documents (such as the
27    // Rust Reference) about whether it is a keyword (e.g. `_`).
28    //
29    // If you modify this list, adjust any relevant `Symbol::{is,can_be}_*`
30    // predicates and `used_keywords`. Also consider adding new keywords to the
31    // `ui/parser/raw/raw-idents.rs` test.
32    Keywords {
33        // Special reserved identifiers used internally for unnamed method
34        // parameters, crate root module, etc.
35        // Matching predicates: `is_special`/`is_reserved`
36        //
37        // tidy-alphabetical-start
38        DollarCrate:        "$crate",
39        PathRoot:           "{{root}}",
40        Underscore:         "_",
41        // tidy-alphabetical-end
42
43        // Keywords that are used in stable Rust.
44        // Matching predicates: `is_used_keyword_always`/`is_reserved`
45        // tidy-alphabetical-start
46        As:                 "as",
47        Break:              "break",
48        Const:              "const",
49        Continue:           "continue",
50        Crate:              "crate",
51        Else:               "else",
52        Enum:               "enum",
53        Extern:             "extern",
54        False:              "false",
55        Fn:                 "fn",
56        For:                "for",
57        If:                 "if",
58        Impl:               "impl",
59        In:                 "in",
60        Let:                "let",
61        Loop:               "loop",
62        Match:              "match",
63        Mod:                "mod",
64        Move:               "move",
65        Mut:                "mut",
66        Pub:                "pub",
67        Ref:                "ref",
68        Return:             "return",
69        SelfLower:          "self",
70        SelfUpper:          "Self",
71        Static:             "static",
72        Struct:             "struct",
73        Super:              "super",
74        Trait:              "trait",
75        True:               "true",
76        Type:               "type",
77        Unsafe:             "unsafe",
78        Use:                "use",
79        Where:              "where",
80        While:              "while",
81        // tidy-alphabetical-end
82
83        // Keywords that are used in unstable Rust or reserved for future use.
84        // Matching predicates: `is_unused_keyword_always`/`is_reserved`
85        // tidy-alphabetical-start
86        Abstract:           "abstract",
87        Become:             "become",
88        Box:                "box",
89        Do:                 "do",
90        Final:              "final",
91        Macro:              "macro",
92        Override:           "override",
93        Priv:               "priv",
94        Typeof:             "typeof",
95        Unsized:            "unsized",
96        Virtual:            "virtual",
97        Yield:              "yield",
98        // tidy-alphabetical-end
99
100        // Edition-specific keywords that are used in stable Rust.
101        // Matching predicates: `is_used_keyword_conditional`/`is_reserved` (if
102        // the edition suffices)
103        // tidy-alphabetical-start
104        Async:              "async", // >= 2018 Edition only
105        Await:              "await", // >= 2018 Edition only
106        Dyn:                "dyn", // >= 2018 Edition only
107        // tidy-alphabetical-end
108
109        // Edition-specific keywords that are used in unstable Rust or reserved for future use.
110        // Matching predicates: `is_unused_keyword_conditional`/`is_reserved` (if
111        // the edition suffices)
112        // tidy-alphabetical-start
113        Gen:                "gen", // >= 2024 Edition only
114        Try:                "try", // >= 2018 Edition only
115        // tidy-alphabetical-end
116
117        // "Lifetime keywords": regular keywords with a leading `'`.
118        // Matching predicates: none
119        // tidy-alphabetical-start
120        StaticLifetime:     "'static",
121        UnderscoreLifetime: "'_",
122        // tidy-alphabetical-end
123
124        // Weak keywords, have special meaning only in specific contexts.
125        // Matching predicates: `is_weak`
126        // tidy-alphabetical-start
127        Auto:               "auto",
128        Builtin:            "builtin",
129        Catch:              "catch",
130        ContractEnsures:    "contract_ensures",
131        ContractRequires:   "contract_requires",
132        Default:            "default",
133        MacroRules:         "macro_rules",
134        Raw:                "raw",
135        Reuse:              "reuse",
136        Safe:               "safe",
137        Union:              "union",
138        Yeet:               "yeet",
139        // tidy-alphabetical-end
140    }
141
142    // Pre-interned symbols that can be referred to with `rustc_span::sym::*`.
143    //
144    // The symbol is the stringified identifier unless otherwise specified, in
145    // which case the name should mention the non-identifier punctuation.
146    // E.g. `sym::proc_dash_macro` represents "proc-macro", and it shouldn't be
147    // called `sym::proc_macro` because then it's easy to mistakenly think it
148    // represents "proc_macro".
149    //
150    // As well as the symbols listed, there are symbols for the strings
151    // "0", "1", ..., "9", which are accessible via `sym::integer`.
152    //
153    // There is currently no checking that all symbols are used; that would be
154    // nice to have.
155    Symbols {
156        // tidy-alphabetical-start
157        Abi,
158        AcqRel,
159        Acquire,
160        Active,
161        ActiveOnly,
162        Alignment,
163        Arc,
164        ArcWeak,
165        Array,
166        AsMut,
167        AsRef,
168        AssertParamIsClone,
169        AssertParamIsCopy,
170        AssertParamIsEq,
171        AsyncGenFinished,
172        AsyncGenPending,
173        AsyncGenReady,
174        Atomic,
175        BTreeMap,
176        Bool,
177        Borrow,
178        BorrowMut,
179        Break,
180        BuildHasher,
181        CStr,
182        CallOnceFuture,
183        CallRefFuture,
184        Capture,
185        Cell,
186        Char,
187        Cleanup,
188        Clone,
189        CoercePointee,
190        CoercePointeeValidated,
191        CoerceUnsized,
192        Const,
193        ConstParamTy,
194        ConstParamTy_,
195        Context,
196        Continue,
197        ControlFlow,
198        Copy,
199        Cow,
200        Debug,
201        Default,
202        Deref,
203        DispatchFromDyn,
204        Display,
205        Dual,
206        DualOnly,
207        Dualv,
208        DualvOnly,
209        Duplicated,
210        DuplicatedOnly,
211        DynTrait,
212        Enum,
213        Eq,
214        Equal,
215        Err,
216        ExternC,
217        ExternRust,
218        Float,
219        FmtArgumentsNew,
220        Fn,
221        FnMut,
222        FnOnce,
223        FnPtr,
224        Formatter,
225        Forward,
226        From,
227        FromIterator,
228        FromResidual,
229        GlobalAlloc,
230        Hash,
231        HashMap,
232        HashSet,
233        Hasher,
234        InCleanup,
235        IndexOutput,
236        Input,
237        Int,
238        Into,
239        IntoFuture,
240        IntoIterator,
241        IntoIteratorItem,
242        IrTyKind,
243        Item,
244        ItemContext,
245        Iterator,
246        IteratorItem,
247        IteratorMap,
248        Layout,
249        Lifetime,
250        LintPass,
251        LocalKey,
252        Mutex,
253        MutexGuard,
254        Named,
255        NonNull,
256        NonZero,
257        None,
258        Normal,
259        Ok,
260        Option,
261        Ord,
262        Ordering,
263        Other,
264        Output,
265        ParamSet,
266        PartialEq,
267        PartialOrd,
268        Pending,
269        PinDerefMutHelper,
270        Pointer,
271        Poll,
272        ProcMacro,
273        Range,
274        RangeCopy,
275        RangeFrom,
276        RangeFromCopy,
277        RangeFull,
278        RangeInclusive,
279        RangeInclusiveCopy,
280        RangeMax,
281        RangeMin,
282        RangeSub,
283        RangeTo,
284        RangeToInclusive,
285        RangeToInclusiveCopy,
286        Rc,
287        RcWeak,
288        Ready,
289        RefCell,
290        Reference,
291        Relaxed,
292        Release,
293        Result,
294        ResumeTy,
295        Reverse,
296        Rust,
297        RustaceansAreAwesome,
298        RwLock,
299        RwLockReadGuard,
300        RwLockWriteGuard,
301        SelfTy,
302        Send,
303        SeqCst,
304        Sized,
305        Slice,
306        SliceIndex,
307        Some,
308        Source,
309        SpanCtxt,
310        Str,
311        String,
312        Struct,
313        StructuralPartialEq,
314        SymbolIntern,
315        Sync,
316        SyncUnsafeCell,
317        Target,
318        This,
319        TokenStream,
320        Trait,
321        TrivialClone,
322        Try,
323        TryCaptureGeneric,
324        TryCapturePrintable,
325        TryFrom,
326        TryInto,
327        Tuple,
328        Ty,
329        TyCtxt,
330        TyKind,
331        Type,
332        Union,
333        Unsize,
334        Vec,
335        Wrapper,
336        _DECLS,
337        __H,
338        __S,
339        __awaitee,
340        __try_var,
341        _t,
342        _task_context,
343        a32,
344        aarch64,
345        aarch64_target_feature,
346        aarch64_unstable_target_feature,
347        aarch64_ver_target_feature,
348        abi,
349        abi_amdgpu_kernel,
350        abi_avr_interrupt,
351        abi_c_cmse_nonsecure_call,
352        abi_cmse_nonsecure_call,
353        abi_custom,
354        abi_efiapi,
355        abi_gpu_kernel,
356        abi_msp430_interrupt,
357        abi_ptx,
358        abi_riscv_interrupt,
359        abi_sysv64,
360        abi_thiscall,
361        abi_unadjusted,
362        abi_vectorcall,
363        abi_x86_interrupt,
364        abort,
365        add,
366        add_assign,
367        add_with_overflow,
368        address,
369        adt_const_params,
370        advanced_slice_patterns,
371        adx_target_feature,
372        aes,
373        aggregate_raw_ptr,
374        alias,
375        align,
376        align_of,
377        align_of_val,
378        alignment,
379        all,
380        alloc,
381        alloc_error_handler,
382        alloc_layout,
383        alloc_zeroed,
384        allocator,
385        allocator_api,
386        allocator_internals,
387        allow,
388        allow_fail,
389        allow_internal_unsafe,
390        allow_internal_unstable,
391        altivec,
392        alu32,
393        always,
394        amdgpu,
395        amdgpu_dispatch_ptr,
396        analysis,
397        and,
398        and_then,
399        anon,
400        anon_assoc,
401        anonymous_lifetime_in_impl_trait,
402        any,
403        apx_target_feature,
404        arbitrary_enum_discriminant,
405        arbitrary_self_types,
406        arbitrary_self_types_pointers,
407        areg,
408        args,
409        arith_offset,
410        arm,
411        arm64ec,
412        arm_a32: "arm::a32",
413        arm_t32: "arm::t32",
414        arm_target_feature,
415        array,
416        as_dash_needed: "as-needed",
417        as_ref,
418        asm,
419        asm_cfg,
420        asm_const,
421        asm_experimental_arch,
422        asm_experimental_reg,
423        asm_goto,
424        asm_goto_with_outputs,
425        asm_sym,
426        asm_unwind,
427        assert,
428        assert_eq,
429        assert_eq_macro,
430        assert_fields_are_eq,
431        assert_inhabited,
432        assert_macro,
433        assert_mem_uninitialized_valid,
434        assert_ne_macro,
435        assert_receiver_is_total_eq,
436        assert_zero_valid,
437        asserting,
438        associated_const_equality,
439        associated_consts,
440        associated_type_bounds,
441        associated_type_defaults,
442        associated_types,
443        assume,
444        assume_init,
445        asterisk: "*",
446        async_await,
447        async_call,
448        async_call_mut,
449        async_call_once,
450        async_closure,
451        async_drop,
452        async_drop_in_place,
453        async_fn,
454        async_fn_in_dyn_trait,
455        async_fn_in_trait,
456        async_fn_kind_helper,
457        async_fn_kind_upvars,
458        async_fn_mut,
459        async_fn_once,
460        async_fn_once_output,
461        async_fn_track_caller,
462        async_fn_traits,
463        async_for_loop,
464        async_gen_internals,
465        async_iterator,
466        async_iterator_poll_next,
467        async_trait_bounds,
468        atomic_and,
469        atomic_cxchg,
470        atomic_cxchgweak,
471        atomic_fence,
472        atomic_load,
473        atomic_max,
474        atomic_min,
475        atomic_nand,
476        atomic_or,
477        atomic_singlethreadfence,
478        atomic_store,
479        atomic_umax,
480        atomic_umin,
481        atomic_xadd,
482        atomic_xchg,
483        atomic_xor,
484        atomic_xsub,
485        atomics,
486        att_syntax,
487        attr,
488        attr_literals,
489        attribute,
490        attributes,
491        audit_that,
492        augmented_assignments,
493        auto_cfg,
494        auto_traits,
495        autodiff,
496        autodiff_forward,
497        autodiff_reverse,
498        automatically_derived,
499        available_externally,
500        avr,
501        avr_target_feature,
502        avx,
503        avx10_target_feature,
504        avx512_target_feature,
505        avx512bw,
506        avx512f,
507        await_macro,
508        backchain,
509        backend_repr,
510        bang,
511        begin_panic,
512        bench,
513        bevy_ecs,
514        bikeshed,
515        bikeshed_guaranteed_no_drop,
516        bin,
517        bind_by_move_pattern_guards,
518        bindings_after_at,
519        bitand,
520        bitand_assign,
521        bitor,
522        bitor_assign,
523        bitreverse,
524        bits,
525        bitxor,
526        bitxor_assign,
527        black_box,
528        block,
529        blocking,
530        bool,
531        borrowck_graphviz_format,
532        borrowck_graphviz_postflow,
533        box_new,
534        box_patterns,
535        box_syntax,
536        boxed_slice,
537        bpf,
538        bpf_target_feature,
539        braced_empty_structs,
540        branch,
541        breakpoint,
542        bridge,
543        bswap,
544        built,
545        builtin_syntax,
546        bundle,
547        c_dash_variadic,
548        c_str_literals,
549        c_unwind,
550        c_variadic,
551        c_variadic_experimental_arch,
552        c_variadic_naked_functions,
553        c_void,
554        call,
555        call_mut,
556        call_once,
557        call_once_future,
558        call_ref_future,
559        caller,
560        caller_location,
561        capture_disjoint_fields,
562        carrying_mul_add,
563        carryless_mul,
564        catch_unwind,
565        cause,
566        cdylib,
567        ceilf16,
568        ceilf32,
569        ceilf64,
570        ceilf128,
571        cfg,
572        cfg_accessible,
573        cfg_attr,
574        cfg_attr_multi,
575        cfg_attr_trace: "<cfg_attr_trace>", // must not be a valid identifier
576        cfg_boolean_literals,
577        cfg_contract_checks,
578        cfg_doctest,
579        cfg_emscripten_wasm_eh,
580        cfg_eval,
581        cfg_overflow_checks,
582        cfg_panic,
583        cfg_relocation_model,
584        cfg_sanitize,
585        cfg_sanitizer_cfi,
586        cfg_select,
587        cfg_target_abi,
588        cfg_target_compact,
589        cfg_target_feature,
590        cfg_target_has_atomic,
591        cfg_target_has_atomic_equal_alignment,
592        cfg_target_has_reliable_f16_f128,
593        cfg_target_object_format,
594        cfg_target_thread_local,
595        cfg_target_vendor,
596        cfg_trace: "<cfg_trace>", // must not be a valid identifier
597        cfg_ub_checks,
598        cfg_version,
599        cfi,
600        cfi_encoding,
601        char,
602        client,
603        clippy,
604        clobber_abi,
605        clone,
606        clone_closures,
607        clone_fn,
608        clone_from,
609        closure,
610        closure_lifetime_binder,
611        closure_to_fn_coercion,
612        closure_track_caller,
613        cmp,
614        cmp_ord_max,
615        cmp_ord_min,
616        cmp_partialeq_eq,
617        cmp_partialeq_ne,
618        cmp_partialord_cmp,
619        cmp_partialord_ge,
620        cmp_partialord_gt,
621        cmp_partialord_le,
622        cmp_partialord_lt,
623        cmpxchg16b_target_feature,
624        cmse_nonsecure_entry,
625        coerce_pointee_validated,
626        coerce_shared,
627        coerce_unsized,
628        coff,
629        cold,
630        cold_path,
631        collapse_debuginfo,
632        column,
633        common,
634        compare_bytes,
635        compare_exchange,
636        compare_exchange_weak,
637        compile_error,
638        compiler,
639        compiler_builtins,
640        compiler_copy,
641        compiler_fence,
642        compiler_move,
643        concat,
644        concat_bytes,
645        conservative_impl_trait,
646        console,
647        const_allocate,
648        const_async_blocks,
649        const_block_items,
650        const_c_variadic,
651        const_closures,
652        const_compare_raw_pointers,
653        const_constructor,
654        const_continue,
655        const_deallocate,
656        const_destruct,
657        const_eval_limit,
658        const_eval_select,
659        const_evaluatable_checked,
660        const_extern_fn,
661        const_fn,
662        const_fn_floating_point_arithmetic,
663        const_fn_fn_ptr_basics,
664        const_fn_trait_bound,
665        const_fn_transmute,
666        const_fn_union,
667        const_fn_unsize,
668        const_for,
669        const_format_args,
670        const_generics,
671        const_generics_defaults,
672        const_if_match,
673        const_impl_trait,
674        const_in_array_repeat_expressions,
675        const_indexing,
676        const_let,
677        const_loop,
678        const_make_global,
679        const_mut_refs,
680        const_panic,
681        const_panic_fmt,
682        const_param_ty,
683        const_precise_live_drops,
684        const_ptr_cast,
685        const_raw_ptr_deref,
686        const_raw_ptr_to_usize_cast,
687        const_refs_to_cell,
688        const_refs_to_static,
689        const_trait_bound_opt_out,
690        const_trait_impl,
691        const_try,
692        const_ty_placeholder: "<const_ty>",
693        constant,
694        constructor,
695        contract_build_check_ensures,
696        contract_check_ensures,
697        contract_check_requires,
698        contract_checks,
699        contracts,
700        contracts_ensures,
701        contracts_internals,
702        contracts_requires,
703        convert,
704        copy,
705        copy_closures,
706        copy_nonoverlapping,
707        copysignf16,
708        copysignf32,
709        copysignf64,
710        copysignf128,
711        core,
712        core_panic,
713        core_panic_2015_macro,
714        core_panic_macro,
715        coroutine,
716        coroutine_clone,
717        coroutine_resume,
718        coroutine_return,
719        coroutine_state,
720        coroutine_yield,
721        coroutines,
722        cosf16,
723        cosf32,
724        cosf64,
725        cosf128,
726        count,
727        coverage,
728        coverage_attribute,
729        cr,
730        crate_in_paths,
731        crate_local,
732        crate_name,
733        crate_type,
734        crate_visibility_modifier,
735        crt_dash_static: "crt-static",
736        csky,
737        csky_target_feature,
738        cstr_type,
739        cstring_type,
740        ctlz,
741        ctlz_nonzero,
742        ctpop,
743        ctr,
744        cttz,
745        cttz_nonzero,
746        custom_attribute,
747        custom_code_classes_in_docs,
748        custom_derive,
749        custom_inner_attributes,
750        custom_mir,
751        custom_test_frameworks,
752        d32,
753        dbg_macro,
754        dead_code,
755        dealloc,
756        debug,
757        debug_assert_eq_macro,
758        debug_assert_macro,
759        debug_assert_ne_macro,
760        debug_assertions,
761        debug_struct_fields_finish,
762        debug_tuple_fields_finish,
763        debugger_visualizer,
764        decl_macro,
765        declare_lint_pass,
766        decorated,
767        default_alloc_error_handler,
768        default_field_values,
769        default_fn,
770        default_lib_allocator,
771        default_method_body_is_const,
772        // --------------------------
773        // Lang items which are used only for experiments with auto traits with default bounds.
774        // These lang items are not actually defined in core/std. Experiment is a part of
775        // `MCP: Low level components for async drop`(https://github.com/rust-lang/compiler-team/issues/727)
776        default_trait1,
777        default_trait2,
778        default_trait3,
779        default_trait4,
780        // --------------------------
781        default_type_parameter_fallback,
782        default_type_params,
783        define_opaque,
784        deny,
785        deprecated,
786        deprecated_safe,
787        deprecated_suggestion,
788        deref,
789        deref_method,
790        deref_mut,
791        deref_patterns,
792        deref_pure,
793        deref_target,
794        derive,
795        derive_const,
796        derive_const_issue: "118304",
797        derive_default_enum,
798        derive_from,
799        derive_smart_pointer,
800        destruct,
801        destructuring_assignment,
802        diagnostic,
803        diagnostic_namespace,
804        diagnostic_on_const,
805        diagnostic_on_move,
806        diagnostic_on_unknown,
807        diagnostic_on_unmatch_args,
808        dialect,
809        direct,
810        discriminant_kind,
811        discriminant_type,
812        discriminant_value,
813        disjoint_bitor,
814        dispatch_from_dyn,
815        div,
816        div_assign,
817        diverging_block_default,
818        dl,
819        do_not_recommend,
820        doc,
821        doc_alias,
822        doc_auto_cfg,
823        doc_cfg,
824        doc_cfg_hide,
825        doc_keyword,
826        doc_masked,
827        doc_notable_trait,
828        doc_primitive,
829        doc_spotlight,
830        doctest,
831        dotdot_in_tuple_patterns,
832        dotdoteq_in_patterns,
833        dreg,
834        dreg_low8,
835        dreg_low16,
836        drop,
837        drop_in_place,
838        drop_types_in_const,
839        dropck_eyepatch,
840        dropck_parametricity,
841        dummy: "<!dummy!>", // use this instead of `sym::empty` for symbols that won't be used
842        dummy_cgu_name,
843        dylib,
844        dyn_compatible_for_dispatch,
845        dyn_metadata,
846        dyn_star,
847        dyn_trait,
848        dynamic_no_pic: "dynamic-no-pic",
849        edition_panic,
850        effective_target_features,
851        effects,
852        eh_catch_typeinfo,
853        eh_personality,
854        eii,
855        eii_declaration,
856        eii_internals,
857        eii_shared_macro,
858        element_ty,
859        elf,
860        // Notes about `sym::empty`:
861        // - It should only be used when it genuinely means "empty symbol". Use
862        //   `Option<Symbol>` when "no symbol" is a possibility.
863        // - For dummy symbols that are never used and absolutely must be
864        //   present, it's better to use `sym::dummy` than `sym::empty`, because
865        //   it's clearer that it's intended as a dummy value, and more likely
866        //   to be detected if it accidentally does get used.
867        empty: "",
868        empty_braces: "{}",
869        emscripten_wasm_eh,
870        enable,
871        end,
872        entry_nops,
873        env,
874        env_CFG_RELEASE: env!("CFG_RELEASE"),
875        eq,
876        ergonomic_clones,
877        ermsb_target_feature,
878        exact_div,
879        except,
880        exception_handling: "exception-handling",
881        exclusive_range_pattern,
882        exhaustive_integer_patterns,
883        exhaustive_patterns,
884        existential_type,
885        exp2f16,
886        exp2f32,
887        exp2f64,
888        exp2f128,
889        expect,
890        expected,
891        expf16,
892        expf32,
893        expf64,
894        expf128,
895        explicit_extern_abis,
896        explicit_generic_args_with_impl_trait,
897        explicit_tail_calls,
898        export_name,
899        export_stable,
900        export_symbols: "export-symbols",
901        expr,
902        expr_2021,
903        expr_fragment_specifier_2024,
904        extended_key_value_attributes,
905        extended_varargs_abi_support,
906        extern_absolute_paths,
907        extern_crate_item_prelude,
908        extern_crate_self,
909        extern_in_paths,
910        extern_item_impls,
911        extern_prelude,
912        extern_system_varargs,
913        extern_types,
914        extern_weak,
915        external,
916        external_doc,
917        f16,
918        f16_nan,
919        f16c_target_feature,
920        f32,
921        f32_nan,
922        f64,
923        f64_nan,
924        f128,
925        f128_nan,
926        fabs,
927        fadd_algebraic,
928        fadd_fast,
929        fake_variadic,
930        fallback,
931        fdiv_algebraic,
932        fdiv_fast,
933        feature,
934        fence,
935        ferris: "🦀",
936        fetch_update,
937        ffi_const,
938        ffi_pure,
939        ffi_returns_twice,
940        field,
941        field_base,
942        field_init_shorthand,
943        field_of,
944        field_offset,
945        field_projections,
946        field_representing_type,
947        field_representing_type_raw,
948        field_type,
949        fields,
950        file,
951        final_associated_functions,
952        float_to_int_unchecked,
953        floorf16,
954        floorf32,
955        floorf64,
956        floorf128,
957        fma4_target_feature,
958        fmaf16,
959        fmaf32,
960        fmaf64,
961        fmaf128,
962        fmt,
963        fmt_debug,
964        fmul_algebraic,
965        fmul_fast,
966        fmuladdf16,
967        fmuladdf32,
968        fmuladdf64,
969        fmuladdf128,
970        fn_align,
971        fn_body,
972        fn_delegation,
973        fn_must_use,
974        fn_mut,
975        fn_once,
976        fn_once_output,
977        fn_ptr_addr,
978        fn_ptr_trait,
979        forbid,
980        force_target_feature,
981        forget,
982        format_args,
983        format_args_capture,
984        format_args_nl,
985        format_argument,
986        format_arguments,
987        format_macro,
988        framework,
989        freeze,
990        freeze_impls,
991        freg,
992        frem_algebraic,
993        frem_fast,
994        from,
995        from_desugaring,
996        from_iter,
997        from_output,
998        from_residual,
999        from_size_align_unchecked,
1000        from_size_alignment_unchecked,
1001        from_str,
1002        from_str_nonconst,
1003        from_usize,
1004        from_yeet,
1005        frontmatter,
1006        fsub_algebraic,
1007        fsub_fast,
1008        full,
1009        fundamental,
1010        fused_iterator,
1011        future_output,
1012        future_trait,
1013        fxsr,
1014        gdb_script_file,
1015        ge,
1016        gen_blocks,
1017        gen_future,
1018        generator_clone,
1019        generators,
1020        generic_arg_infer,
1021        generic_assert,
1022        generic_associated_types,
1023        generic_associated_types_extended,
1024        generic_const_args,
1025        generic_const_exprs,
1026        generic_const_items,
1027        generic_const_parameter_types,
1028        generic_param_attrs,
1029        generic_pattern_types,
1030        generics,
1031        get_context,
1032        global_alloc_ty,
1033        global_allocator,
1034        global_asm,
1035        global_registration,
1036        globs,
1037        gpu_launch_sized_workgroup_mem,
1038        gt,
1039        guard,
1040        guard_patterns,
1041        half_open_range_patterns,
1042        half_open_range_patterns_in_slices,
1043        hash,
1044        hexagon,
1045        hexagon_target_feature,
1046        hidden,
1047        hide,
1048        homogeneous_aggregate,
1049        html_favicon_url,
1050        html_logo_url,
1051        html_no_source,
1052        html_playground_url,
1053        html_root_url,
1054        hvx,
1055        hvx_length64b: "hvx-length64b",
1056        hvx_length128b: "hvx-length128b",
1057        hwaddress,
1058        i8,
1059        i16,
1060        i32,
1061        i64,
1062        i128,
1063        i128_type,
1064        ident,
1065        if_let,
1066        if_let_guard,
1067        if_let_rescope,
1068        if_while_or_patterns,
1069        ignore,
1070        immediate_abort: "immediate-abort",
1071        impl_header_lifetime_elision,
1072        impl_lint_pass,
1073        impl_restriction,
1074        impl_trait_in_assoc_type,
1075        impl_trait_in_bindings,
1076        impl_trait_in_fn_trait_return,
1077        impl_trait_projections,
1078        implied_by,
1079        import,
1080        import_name_type,
1081        import_shadowing,
1082        import_trait_associated_functions,
1083        imported_main,
1084        in_band_lifetimes,
1085        include,
1086        include_bytes,
1087        include_str,
1088        inclusive_range_syntax,
1089        incomplete_features,
1090        index,
1091        index_mut,
1092        infer_outlives_requirements,
1093        infer_static_outlives_requirements,
1094        inherent_associated_types,
1095        initial,
1096        inlateout,
1097        inline,
1098        inline_const,
1099        inline_const_pat,
1100        inout,
1101        inputs,
1102        instruction_set,
1103        integer_: "integer", // underscore to avoid clashing with the function `sym::integer` below
1104        integral,
1105        internal,
1106        internal_eq_trait_method_impls,
1107        internal_features,
1108        into_async_iter_into_iter,
1109        into_future,
1110        into_iter,
1111        into_try_type,
1112        intra_doc_pointers,
1113        intrinsics,
1114        irrefutable_let_patterns,
1115        is,
1116        is_auto,
1117        is_val_statically_known,
1118        isa_attribute,
1119        isize,
1120        issue,
1121        issue_5723_bootstrap,
1122        issue_tracker_base_url,
1123        item,
1124        item_like_imports,
1125        iter,
1126        iter_mut,
1127        iterator,
1128        iterator_collect_fn,
1129        kcfi,
1130        kernel_address,
1131        kernel_hwaddress,
1132        keylocker_x86,
1133        keyword,
1134        kind,
1135        kreg,
1136        kreg0,
1137        label,
1138        label_break_value,
1139        lahfsahf_target_feature,
1140        lang,
1141        lang_items,
1142        large_assignments,
1143        last,
1144        lateout,
1145        lazy_normalization_consts,
1146        lazy_type_alias,
1147        le,
1148        legacy_receiver,
1149        len,
1150        let_chains,
1151        let_else,
1152        lhs,
1153        lib,
1154        libc,
1155        lifetime,
1156        lifetime_capture_rules_2024,
1157        lifetimes,
1158        line,
1159        link,
1160        link_arg_attribute,
1161        link_args,
1162        link_cfg,
1163        link_dash_arg: "link-arg",
1164        link_llvm_intrinsics,
1165        link_name,
1166        link_ordinal,
1167        link_section,
1168        linkage,
1169        linker,
1170        linker_info,
1171        linker_messages,
1172        linkonce,
1173        linkonce_odr,
1174        lint_reasons,
1175        literal,
1176        little, big,
1177        load,
1178        loaded_from_disk,
1179        local,
1180        local_inner_macros,
1181        log2f16,
1182        log2f32,
1183        log2f64,
1184        log2f128,
1185        log10f16,
1186        log10f32,
1187        log10f64,
1188        log10f128,
1189        log_syntax,
1190        logf16,
1191        logf32,
1192        logf64,
1193        logf128,
1194        loongarch32,
1195        loongarch64,
1196        loongarch_target_feature,
1197        loop_break_value,
1198        loop_match,
1199        lr,
1200        lt,
1201        m68k,
1202        m68k_target_feature,
1203        macho: "mach-o",
1204        macro_at_most_once_rep,
1205        macro_attr,
1206        macro_attributes_in_derive_output,
1207        macro_derive,
1208        macro_escape,
1209        macro_export,
1210        macro_guard_matcher,
1211        macro_lifetime_matcher,
1212        macro_literal_matcher,
1213        macro_metavar_expr,
1214        macro_metavar_expr_concat,
1215        macro_reexport,
1216        macro_use,
1217        macro_vis_matcher,
1218        macros_in_extern,
1219        main,
1220        managed_boxes,
1221        manually_drop,
1222        map,
1223        map_err,
1224        marker,
1225        marker_trait_attr,
1226        masked,
1227        match_beginning_vert,
1228        match_default_bindings,
1229        maximum_number_nsz_f16,
1230        maximum_number_nsz_f32,
1231        maximum_number_nsz_f64,
1232        maximum_number_nsz_f128,
1233        maximumf16,
1234        maximumf32,
1235        maximumf64,
1236        maximumf128,
1237        may_dangle,
1238        may_unwind,
1239        maybe_dangling,
1240        maybe_uninit,
1241        maybe_uninit_uninit,
1242        maybe_uninit_zeroed,
1243        mem,
1244        mem_align_const,
1245        mem_discriminant,
1246        mem_drop,
1247        mem_forget,
1248        mem_size_const,
1249        mem_swap,
1250        mem_uninitialized,
1251        mem_variant_count,
1252        mem_zeroed,
1253        member_constraints,
1254        memory,
1255        memtag,
1256        message,
1257        meta,
1258        meta_sized,
1259        metadata_type,
1260        mgca_type_const_syntax,
1261        min_adt_const_params,
1262        min_const_fn,
1263        min_const_generics,
1264        min_const_unsafe_fn,
1265        min_exhaustive_patterns,
1266        min_generic_const_args,
1267        min_specialization,
1268        min_type_alias_impl_trait,
1269        minimum_number_nsz_f16,
1270        minimum_number_nsz_f32,
1271        minimum_number_nsz_f64,
1272        minimum_number_nsz_f128,
1273        minimumf16,
1274        minimumf32,
1275        minimumf64,
1276        minimumf128,
1277        mips,
1278        mips32r6,
1279        mips64,
1280        mips64r6,
1281        mips_target_feature,
1282        mir_assume,
1283        mir_basic_block,
1284        mir_call,
1285        mir_cast_ptr_to_ptr,
1286        mir_cast_transmute,
1287        mir_cast_unsize,
1288        mir_checked,
1289        mir_debuginfo,
1290        mir_discriminant,
1291        mir_drop,
1292        mir_field,
1293        mir_goto,
1294        mir_make_place,
1295        mir_move,
1296        mir_offset,
1297        mir_ptr_metadata,
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_owned_method,
2050        to_string,
2051        to_vec,
2052        tool_attributes,
2053        tool_lints,
2054        trace_macros,
2055        track_caller,
2056        trait_alias,
2057        trait_ty,
2058        trait_upcasting,
2059        transmute,
2060        transmute_generic_consts,
2061        transmute_opts,
2062        transmute_trait,
2063        transmute_unchecked,
2064        transparent,
2065        transparent_enums,
2066        transparent_unions,
2067        trivial_bounds,
2068        trivial_clone,
2069        truncf16,
2070        truncf32,
2071        truncf64,
2072        truncf128,
2073        try_blocks,
2074        try_blocks_heterogeneous,
2075        try_capture,
2076        try_from,
2077        try_into,
2078        try_trait_v2,
2079        try_trait_v2_residual,
2080        try_update,
2081        tt,
2082        tuple,
2083        tuple_indexing,
2084        tuple_trait,
2085        two_phase,
2086        ty,
2087        type_alias_enum_variants,
2088        type_alias_impl_trait,
2089        type_ascribe,
2090        type_ascription,
2091        type_changing_struct_update,
2092        type_id,
2093        type_id_eq,
2094        type_id_vtable,
2095        type_info,
2096        type_ir,
2097        type_ir_infer_ctxt_like,
2098        type_ir_inherent,
2099        type_ir_interner,
2100        type_length_limit,
2101        type_macros,
2102        type_name,
2103        type_of,
2104        type_privacy_lints,
2105        typed_swap_nonoverlapping,
2106        u8,
2107        u8_legacy_const_max,
2108        u8_legacy_const_min,
2109        u8_legacy_fn_max_value,
2110        u8_legacy_fn_min_value,
2111        u8_legacy_mod,
2112        u16,
2113        u16_legacy_const_max,
2114        u16_legacy_const_min,
2115        u16_legacy_fn_max_value,
2116        u16_legacy_fn_min_value,
2117        u16_legacy_mod,
2118        u32,
2119        u32_legacy_const_max,
2120        u32_legacy_const_min,
2121        u32_legacy_fn_max_value,
2122        u32_legacy_fn_min_value,
2123        u32_legacy_mod,
2124        u64,
2125        u64_legacy_const_max,
2126        u64_legacy_const_min,
2127        u64_legacy_fn_max_value,
2128        u64_legacy_fn_min_value,
2129        u64_legacy_mod,
2130        u128,
2131        u128_legacy_const_max,
2132        u128_legacy_const_min,
2133        u128_legacy_fn_max_value,
2134        u128_legacy_fn_min_value,
2135        u128_legacy_mod,
2136        ub_checks,
2137        unaligned_volatile_load,
2138        unaligned_volatile_store,
2139        unboxed_closures,
2140        unchecked_add,
2141        unchecked_div,
2142        unchecked_funnel_shl,
2143        unchecked_funnel_shr,
2144        unchecked_mul,
2145        unchecked_rem,
2146        unchecked_shl,
2147        unchecked_shr,
2148        unchecked_sub,
2149        undecorated,
2150        underscore_const_names,
2151        underscore_imports,
2152        underscore_lifetimes,
2153        uniform_paths,
2154        unit,
2155        universal_impl_trait,
2156        unix,
2157        unlikely,
2158        unmarked_api,
2159        unnamed_fields,
2160        unpin,
2161        unqualified_local_imports,
2162        unreachable,
2163        unreachable_2015,
2164        unreachable_2015_macro,
2165        unreachable_2021,
2166        unreachable_code,
2167        unreachable_display,
2168        unreachable_macro,
2169        unrestricted_attribute_tokens,
2170        unsafe_attributes,
2171        unsafe_binders,
2172        unsafe_block_in_unsafe_fn,
2173        unsafe_cell,
2174        unsafe_cell_raw_get,
2175        unsafe_eii,
2176        unsafe_extern_blocks,
2177        unsafe_fields,
2178        unsafe_no_drop_flag,
2179        unsafe_pinned,
2180        unsafe_unpin,
2181        unsafety,
2182        unsize,
2183        unsized_const_param_ty,
2184        unsized_const_params,
2185        unsized_fn_params,
2186        unsized_locals,
2187        unsized_tuple_coercion,
2188        unstable,
2189        unstable_feature_bound,
2190        unstable_location_reason_default: "this crate is being loaded from the sysroot, an \
2191                          unstable location; did you mean to load this crate \
2192                          from crates.io via `Cargo.toml` instead?",
2193        unstable_removed,
2194        untagged_unions,
2195        unused_imports,
2196        unwind,
2197        unwind_attributes,
2198        unwind_safe_trait,
2199        unwrap,
2200        unwrap_binder,
2201        unwrap_or,
2202        update,
2203        use_cloned,
2204        use_extern_macros,
2205        use_nested_groups,
2206        used,
2207        used_with_arg,
2208        using,
2209        usize,
2210        usize_legacy_const_max,
2211        usize_legacy_const_min,
2212        usize_legacy_fn_max_value,
2213        usize_legacy_fn_min_value,
2214        usize_legacy_mod,
2215        v1,
2216        v8plus,
2217        va_arg,
2218        va_arg_safe,
2219        va_copy,
2220        va_end,
2221        va_list,
2222        va_start,
2223        val,
2224        validity,
2225        value,
2226        values,
2227        var,
2228        variadic,
2229        variant_count,
2230        variants,
2231        vec,
2232        vector,
2233        verbatim,
2234        version,
2235        vfp2,
2236        view_types,
2237        vis,
2238        visible_private_types,
2239        volatile,
2240        volatile_copy_memory,
2241        volatile_copy_nonoverlapping_memory,
2242        volatile_load,
2243        volatile_set_memory,
2244        volatile_store,
2245        vreg,
2246        vreg_low16,
2247        vreg_pair,
2248        vsreg,
2249        vsx,
2250        vtable_align,
2251        vtable_size,
2252        warn,
2253        wasip2,
2254        wasm,
2255        wasm32,
2256        wasm64,
2257        wasm_abi,
2258        wasm_import_module,
2259        wasm_target_feature,
2260        weak,
2261        weak_odr,
2262        where_clause_attrs,
2263        while_let,
2264        whole_dash_archive: "whole-archive",
2265        width,
2266        windows,
2267        windows_subsystem,
2268        with_negative_coherence,
2269        wrap_binder,
2270        wrapping_add,
2271        wrapping_div,
2272        wrapping_mul,
2273        wrapping_rem,
2274        wrapping_rem_euclid,
2275        wrapping_sub,
2276        wreg,
2277        write_box_via_move,
2278        write_bytes,
2279        write_fmt,
2280        write_macro,
2281        write_str,
2282        write_via_move,
2283        writeln_macro,
2284        x86,
2285        x86_64,
2286        x86_amx_intrinsics,
2287        x87_reg,
2288        x87_target_feature,
2289        xcoff,
2290        xer,
2291        xmm_reg,
2292        xop_target_feature,
2293        xtensa,
2294        yeet_desugar_details,
2295        yeet_expr,
2296        yes,
2297        yield_expr,
2298        ymm_reg,
2299        yreg,
2300        zca,
2301        zfh,
2302        zfhmin,
2303        zmm_reg,
2304        ztso,
2305        // tidy-alphabetical-end
2306    }
2307}
2308
2309/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2310/// `proc_macro`.
2311pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2312
2313#[derive(#[automatically_derived]
impl ::core::marker::Copy for Ident { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Ident {
    #[inline]
    fn clone(&self) -> Ident {
        let _: ::core::clone::AssertParamIsClone<Symbol>;
        let _: ::core::clone::AssertParamIsClone<Span>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::Eq for Ident {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<Symbol>;
        let _: ::core::cmp::AssertParamIsEq<Span>;
    }
}Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hasher::StableHash for Ident {
            #[inline]
            fn stable_hash<__Hcx: ::rustc_data_structures::stable_hasher::StableHashCtxt>(&self,
                __hcx: &mut __Hcx,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                match *self {
                    Ident { name: ref __binding_0, span: ref __binding_1 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                        { __binding_1.stable_hash(__hcx, __hasher); }
                    }
                }
            }
        }
    };StableHash, const _: () =
    {
        impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
            for Ident {
            fn encode(&self, __encoder: &mut __E) {
                match *self {
                    Ident { name: ref __binding_0, span: ref __binding_1 } => {
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_0,
                            __encoder);
                        ::rustc_serialize::Encodable::<__E>::encode(__binding_1,
                            __encoder);
                    }
                }
            }
        }
    };Encodable, const _: () =
    {
        impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
            for Ident {
            fn decode(__decoder: &mut __D) -> Self {
                Ident {
                    name: ::rustc_serialize::Decodable::decode(__decoder),
                    span: ::rustc_serialize::Decodable::decode(__decoder),
                }
            }
        }
    };Decodable)]
2314pub struct Ident {
2315    /// `name` should never be the empty symbol. If you are considering that,
2316    /// you are probably conflating "empty identifier with "no identifier" and
2317    /// you should use `Option<Ident>` instead.
2318    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2319    pub name: Symbol,
2320    pub span: Span,
2321}
2322
2323impl Ident {
2324    #[inline]
2325    /// Constructs a new identifier from a symbol and a span.
2326    pub fn new(name: Symbol, span: Span) -> Ident {
2327        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);
2328        Ident { name, span }
2329    }
2330
2331    /// Constructs a new identifier with a dummy span.
2332    #[inline]
2333    pub fn with_dummy_span(name: Symbol) -> Ident {
2334        Ident::new(name, DUMMY_SP)
2335    }
2336
2337    // For dummy identifiers that are never used and absolutely must be
2338    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2339    // makes it clear that it's intended as a dummy value, and is more likely
2340    // to be detected if it accidentally does get used.
2341    #[inline]
2342    pub fn dummy() -> Ident {
2343        Ident::with_dummy_span(sym::dummy)
2344    }
2345
2346    /// Maps a string to an identifier with a dummy span.
2347    pub fn from_str(string: &str) -> Ident {
2348        Ident::with_dummy_span(Symbol::intern(string))
2349    }
2350
2351    /// Maps a string and a span to an identifier.
2352    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2353        Ident::new(Symbol::intern(string), span)
2354    }
2355
2356    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2357    pub fn with_span_pos(self, span: Span) -> Ident {
2358        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2359    }
2360
2361    /// Creates a new ident with the same span and name with leading quote removed, if any.
2362    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2363    pub fn without_first_quote(self) -> Ident {
2364        self.as_str()
2365            .strip_prefix('\'')
2366            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2367    }
2368
2369    /// "Normalize" ident for use in comparisons using "item hygiene".
2370    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2371    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2372    /// different macro 2.0 macros.
2373    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2374    pub fn normalize_to_macros_2_0(self) -> Ident {
2375        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2376    }
2377
2378    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2379    /// Identifiers with same string value become same if they came from the same non-transparent
2380    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2381    /// non-transparent macros.
2382    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2383    #[inline]
2384    pub fn normalize_to_macro_rules(self) -> Ident {
2385        Ident::new(self.name, self.span.normalize_to_macro_rules())
2386    }
2387
2388    /// Access the underlying string. This is a slowish operation because it
2389    /// requires locking the symbol interner.
2390    ///
2391    /// Note that the lifetime of the return value is a lie. See
2392    /// `Symbol::as_str()` for details.
2393    pub fn as_str(&self) -> &str {
2394        self.name.as_str()
2395    }
2396}
2397
2398impl PartialEq for Ident {
2399    #[inline]
2400    fn eq(&self, rhs: &Self) -> bool {
2401        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2402    }
2403}
2404
2405impl Hash for Ident {
2406    fn hash<H: Hasher>(&self, state: &mut H) {
2407        self.name.hash(state);
2408        self.span.ctxt().hash(state);
2409    }
2410}
2411
2412impl fmt::Debug for Ident {
2413    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2414        fmt::Display::fmt(self, f)?;
2415        fmt::Debug::fmt(&self.span.ctxt(), f)
2416    }
2417}
2418
2419/// This implementation is supposed to be used in error messages, so it's expected to be identical
2420/// to printing the original identifier token written in source code (`token_to_string`),
2421/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2422impl fmt::Display for Ident {
2423    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2424        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2425    }
2426}
2427
2428pub enum IdentPrintMode {
2429    Normal,
2430    RawIdent,
2431    RawLifetime,
2432}
2433
2434/// The most general type to print identifiers.
2435///
2436/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2437/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2438/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2439/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2440/// hygiene data, most importantly name of the crate it refers to.
2441/// As a result we print `$crate` as `crate` if it refers to the local crate
2442/// and as `::other_crate_name` if it refers to some other crate.
2443/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2444/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2445/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2446/// done for a token stream or a single token.
2447pub struct IdentPrinter {
2448    symbol: Symbol,
2449    mode: IdentPrintMode,
2450    /// Span used for retrieving the crate name to which `$crate` refers to,
2451    /// if this field is `None` then the `$crate` conversion doesn't happen.
2452    convert_dollar_crate: Option<Span>,
2453}
2454
2455impl IdentPrinter {
2456    /// The most general `IdentPrinter` constructor. Do not use this.
2457    pub fn new(
2458        symbol: Symbol,
2459        mode: IdentPrintMode,
2460        convert_dollar_crate: Option<Span>,
2461    ) -> IdentPrinter {
2462        IdentPrinter { symbol, mode, convert_dollar_crate }
2463    }
2464
2465    /// This implementation is supposed to be used when printing identifiers
2466    /// as a part of pretty-printing for larger AST pieces.
2467    /// Do not use this either.
2468    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2469        IdentPrinter::new(ident.name, mode, Some(ident.span))
2470    }
2471}
2472
2473impl fmt::Display for IdentPrinter {
2474    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2475        let s = match self.mode {
2476            IdentPrintMode::Normal
2477                if self.symbol == kw::DollarCrate
2478                    && let Some(span) = self.convert_dollar_crate =>
2479            {
2480                let converted = span.ctxt().dollar_crate_name();
2481                if !converted.is_path_segment_keyword() {
2482                    f.write_str("::")?;
2483                }
2484                converted
2485            }
2486            IdentPrintMode::Normal => self.symbol,
2487            IdentPrintMode::RawIdent => {
2488                f.write_str("r#")?;
2489                self.symbol
2490            }
2491            IdentPrintMode::RawLifetime => {
2492                f.write_str("'r#")?;
2493                let s = self
2494                    .symbol
2495                    .as_str()
2496                    .strip_prefix("'")
2497                    .expect("only lifetime idents should be passed with RawLifetime mode");
2498                Symbol::intern(s)
2499            }
2500        };
2501        s.fmt(f)
2502    }
2503}
2504
2505/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2506/// construction for "local variable hygiene" comparisons.
2507///
2508/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2509/// This ensures compile-time safety and avoids manual normalization calls.
2510#[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)]
2511pub struct MacroRulesNormalizedIdent(Ident);
2512
2513impl MacroRulesNormalizedIdent {
2514    #[inline]
2515    pub fn new(ident: Ident) -> Self {
2516        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2517    }
2518
2519    pub fn symbol(&self) -> Symbol {
2520        self.0.name
2521    }
2522
2523    pub fn ident(&self) -> Ident {
2524        self.0
2525    }
2526}
2527
2528impl fmt::Debug for MacroRulesNormalizedIdent {
2529    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2530        fmt::Debug::fmt(&self.0, f)
2531    }
2532}
2533
2534impl fmt::Display for MacroRulesNormalizedIdent {
2535    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2536        fmt::Display::fmt(&self.0, f)
2537    }
2538}
2539
2540/// An interned UTF-8 string.
2541///
2542/// Internally, a `Symbol` is implemented as an index, and all operations
2543/// (including hashing, equality, and ordering) operate on that index. The use
2544/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2545/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2546///
2547/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2548/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2549#[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)]
2550pub struct Symbol(SymbolIndex);
2551
2552// Used within both `Symbol` and `ByteSymbol`.
2553impl ::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! {
2554    #[orderable]
2555    struct SymbolIndex {}
2556}
2557
2558impl Symbol {
2559    /// Avoid this except for things like deserialization of previously
2560    /// serialized symbols, and testing. Use `intern` instead.
2561    pub const fn new(n: u32) -> Self {
2562        Symbol(SymbolIndex::from_u32(n))
2563    }
2564
2565    /// Maps a string to its interned representation.
2566    #[rustc_diagnostic_item = "SymbolIntern"]
2567    pub fn intern(str: &str) -> Self {
2568        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2569    }
2570
2571    /// Access the underlying string. This is a slowish operation because it
2572    /// requires locking the symbol interner.
2573    ///
2574    /// Note that the lifetime of the return value is a lie. It's not the same
2575    /// as `&self`, but actually tied to the lifetime of the underlying
2576    /// interner. Interners are long-lived, and there are very few of them, and
2577    /// this function is typically used for short-lived things, so in practice
2578    /// it works out ok.
2579    pub fn as_str(&self) -> &str {
2580        with_session_globals(|session_globals| unsafe {
2581            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2582        })
2583    }
2584
2585    pub fn as_u32(self) -> u32 {
2586        self.0.as_u32()
2587    }
2588
2589    pub fn is_empty(self) -> bool {
2590        self == sym::empty
2591    }
2592
2593    /// This method is supposed to be used in error messages, so it's expected to be
2594    /// identical to printing the original identifier token written in source code
2595    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2596    /// or edition, so we have to guess the rawness using the global edition.
2597    pub fn to_ident_string(self) -> String {
2598        // Avoid creating an empty identifier, because that asserts in debug builds.
2599        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2600    }
2601
2602    /// Checks if `self` is similar to any symbol in `candidates`.
2603    ///
2604    /// The returned boolean represents whether the candidate is the same symbol with a different
2605    /// casing.
2606    ///
2607    /// All the candidates are assumed to be lowercase.
2608    pub fn find_similar(
2609        self,
2610        candidates: &[Symbol],
2611    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2612        let lowercase = self.as_str().to_lowercase();
2613        let lowercase_sym = Symbol::intern(&lowercase);
2614        if candidates.contains(&lowercase_sym) {
2615            Some((lowercase_sym, true))
2616        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2617            Some((similar_sym, false))
2618        } else {
2619            None
2620        }
2621    }
2622}
2623
2624impl fmt::Debug for Symbol {
2625    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2626        fmt::Debug::fmt(self.as_str(), f)
2627    }
2628}
2629
2630impl fmt::Display for Symbol {
2631    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2632        fmt::Display::fmt(self.as_str(), f)
2633    }
2634}
2635
2636impl StableHash for Symbol {
2637    #[inline]
2638    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2639        self.as_str().stable_hash(hcx, hasher);
2640    }
2641}
2642
2643impl ToStableHashKey for Symbol {
2644    type KeyType = String;
2645    #[inline]
2646    fn to_stable_hash_key<Hcx>(&self, _: &mut Hcx) -> String {
2647        self.as_str().to_string()
2648    }
2649}
2650
2651impl StableCompare for Symbol {
2652    const CAN_USE_UNSTABLE_SORT: bool = true;
2653
2654    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2655        self.as_str().cmp(other.as_str())
2656    }
2657}
2658
2659/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2660/// it has fewer operations defined than `Symbol`.
2661#[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)]
2662pub struct ByteSymbol(SymbolIndex);
2663
2664impl ByteSymbol {
2665    /// Avoid this except for things like deserialization of previously
2666    /// serialized symbols, and testing. Use `intern` instead.
2667    pub const fn new(n: u32) -> Self {
2668        ByteSymbol(SymbolIndex::from_u32(n))
2669    }
2670
2671    /// Maps a string to its interned representation.
2672    pub fn intern(byte_str: &[u8]) -> Self {
2673        with_session_globals(|session_globals| {
2674            session_globals.symbol_interner.intern_byte_str(byte_str)
2675        })
2676    }
2677
2678    /// Like `Symbol::as_str`.
2679    pub fn as_byte_str(&self) -> &[u8] {
2680        with_session_globals(|session_globals| unsafe {
2681            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2682        })
2683    }
2684
2685    pub fn as_u32(self) -> u32 {
2686        self.0.as_u32()
2687    }
2688}
2689
2690impl fmt::Debug for ByteSymbol {
2691    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2692        fmt::Debug::fmt(self.as_byte_str(), f)
2693    }
2694}
2695
2696impl StableHash for ByteSymbol {
2697    #[inline]
2698    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2699        self.as_byte_str().stable_hash(hcx, hasher);
2700    }
2701}
2702
2703// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2704// string with identical contents (e.g. "foo" and b"foo") are both interned,
2705// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2706// will have the same index.
2707pub(crate) struct Interner(Lock<InternerInner>);
2708
2709// The `&'static [u8]`s in this type actually point into the arena.
2710//
2711// This type is private to prevent accidentally constructing more than one
2712// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2713// between `Interner`s.
2714struct InternerInner {
2715    arena: DroplessArena,
2716    byte_strs: FxIndexSet<&'static [u8]>,
2717}
2718
2719impl Interner {
2720    // These arguments are `&str`, but because of the sharing, we are
2721    // effectively pre-interning all these strings for both `Symbol` and
2722    // `ByteSymbol`.
2723    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2724        let byte_strs = FxIndexSet::from_iter(
2725            init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes()),
2726        );
2727
2728        // The order in which duplicates are reported is irrelevant.
2729        #[expect(rustc::potential_query_instability)]
2730        if byte_strs.len() != init.len() + extra.len() {
2731            {
    ::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!(
2732                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2733                FxHashSet::intersection(
2734                    &init.iter().copied().collect(),
2735                    &extra.iter().copied().collect(),
2736                )
2737                .collect::<Vec<_>>()
2738            )
2739        }
2740
2741        Interner(Lock::new(InternerInner { arena: Default::default(), byte_strs }))
2742    }
2743
2744    fn intern_str(&self, str: &str) -> Symbol {
2745        Symbol::new(self.intern_inner(str.as_bytes()))
2746    }
2747
2748    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
2749        ByteSymbol::new(self.intern_inner(byte_str))
2750    }
2751
2752    #[inline]
2753    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
2754        let mut inner = self.0.lock();
2755        if let Some(idx) = inner.byte_strs.get_index_of(byte_str) {
2756            return idx as u32;
2757        }
2758
2759        let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
2760
2761        // SAFETY: we can extend the arena allocation to `'static` because we
2762        // only access these while the arena is still alive.
2763        let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
2764
2765        // This second hash table lookup can be avoided by using `RawEntryMut`,
2766        // but this code path isn't hot enough for it to be worth it. See
2767        // #91445 for details.
2768        let (idx, is_new) = inner.byte_strs.insert_full(byte_str);
2769        if true {
    if !is_new { ::core::panicking::panic("assertion failed: is_new") };
};debug_assert!(is_new); // due to the get_index_of check above
2770
2771        idx as u32
2772    }
2773
2774    /// Get the symbol as a string.
2775    ///
2776    /// [`Symbol::as_str()`] should be used in preference to this function.
2777    fn get_str(&self, symbol: Symbol) -> &str {
2778        let byte_str = self.get_inner(symbol.0.as_usize());
2779        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
2780        unsafe { str::from_utf8_unchecked(byte_str) }
2781    }
2782
2783    /// Get the symbol as a string.
2784    ///
2785    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
2786    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
2787        self.get_inner(symbol.0.as_usize())
2788    }
2789
2790    fn get_inner(&self, index: usize) -> &[u8] {
2791        self.0.lock().byte_strs.get_index(index).unwrap()
2792    }
2793}
2794
2795// This module has a very short name because it's used a lot.
2796/// This module contains all the defined keyword `Symbol`s.
2797///
2798/// Given that `kw` is imported, use them like `kw::keyword_name`.
2799/// For example `kw::Loop` or `kw::Break`.
2800pub mod kw {
2801    pub use super::kw_generated::*;
2802}
2803
2804// This module has a very short name because it's used a lot.
2805/// This module contains all the defined non-keyword `Symbol`s.
2806///
2807/// Given that `sym` is imported, use them like `sym::symbol_name`.
2808/// For example `sym::rustfmt` or `sym::u8`.
2809pub mod sym {
2810    // Used from a macro in `librustc_feature/accepted.rs`
2811    use super::Symbol;
2812    pub use super::kw::MacroRules as macro_rules;
2813    #[doc(inline)]
2814    pub use super::sym_generated::*;
2815
2816    // Used quite often in relation to C ABI.
2817    pub const C: Symbol = ascii_letter_digit('C').unwrap();
2818
2819    // RISC-V stuff
2820    #[expect(non_upper_case_globals)]
2821    pub const f: Symbol = ascii_letter_digit('f').unwrap();
2822    #[expect(non_upper_case_globals)]
2823    pub const d: Symbol = ascii_letter_digit('d').unwrap();
2824
2825    /// Get the symbol for an integer.
2826    ///
2827    /// The first few non-negative integers each have a static symbol and therefore
2828    /// are fast.
2829    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
2830        if let Result::Ok(idx) = n.try_into() {
2831            if idx < 10 {
2832                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
2833            }
2834        }
2835        let mut buffer = itoa::Buffer::new();
2836        let printed = buffer.format(n);
2837        Symbol::intern(printed)
2838    }
2839
2840    pub const fn ascii_letter_digit(c: char) -> Option<Symbol> {
2841        let i = c as u32;
2842        Option::Some(Symbol::new(match c {
2843            '0'..='9' => super::SYMBOL_DIGITS_BASE + (i - '0' as u32),
2844            'A'..='Z' => super::SYMBOL_UPPERCASE_LETTERS_BASE + (i - 'A' as u32),
2845            'a'..='z' => super::SYMBOL_LOWERCASE_LETTERS_BASE + (i - 'a' as u32),
2846            _ => return Option::None,
2847        }))
2848    }
2849
2850    pub fn character(c: char) -> Symbol {
2851        ascii_letter_digit(c).unwrap_or_else(|| {
2852            let mut buf: [u8; char::MAX_LEN_UTF8] = Default::default();
2853            Symbol::intern(c.encode_utf8(&mut buf))
2854        })
2855    }
2856}
2857
2858impl Symbol {
2859    fn is_special(self) -> bool {
2860        self <= kw::Underscore
2861    }
2862
2863    fn is_used_keyword_always(self) -> bool {
2864        self >= kw::As && self <= kw::While
2865    }
2866
2867    fn is_unused_keyword_always(self) -> bool {
2868        self >= kw::Abstract && self <= kw::Yield
2869    }
2870
2871    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
2872        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
2873    }
2874
2875    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2876        self == kw::Gen && edition().at_least_rust_2024()
2877            || self == kw::Try && edition().at_least_rust_2018()
2878    }
2879
2880    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2881        self.is_special()
2882            || self.is_used_keyword_always()
2883            || self.is_unused_keyword_always()
2884            || self.is_used_keyword_conditional(edition)
2885            || self.is_unused_keyword_conditional(edition)
2886    }
2887
2888    pub fn is_weak(self) -> bool {
2889        self >= kw::Auto && self <= kw::Yeet
2890    }
2891
2892    /// A keyword or reserved identifier that can be used as a path segment.
2893    pub fn is_path_segment_keyword(self) -> bool {
2894        self == kw::Super
2895            || self == kw::SelfLower
2896            || self == kw::SelfUpper
2897            || self == kw::Crate
2898            || self == kw::PathRoot
2899            || self == kw::DollarCrate
2900    }
2901
2902    /// Returns `true` if the symbol is `true` or `false`.
2903    pub fn is_bool_lit(self) -> bool {
2904        self == kw::True || self == kw::False
2905    }
2906
2907    /// Returns `true` if this symbol can be a raw identifier.
2908    pub fn can_be_raw(self) -> bool {
2909        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
2910    }
2911
2912    /// Was this symbol index predefined in the compiler's `symbols!` macro?
2913    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
2914    /// takes a `u32` argument instead of a `&self` argument. Use with care.
2915    pub fn is_predefined(index: u32) -> bool {
2916        index < PREDEFINED_SYMBOLS_COUNT
2917    }
2918}
2919
2920impl Ident {
2921    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
2922    /// unnamed method parameters, crate root module, error recovery etc.
2923    pub fn is_special(self) -> bool {
2924        self.name.is_special()
2925    }
2926
2927    /// Returns `true` if the token is a keyword used in the language.
2928    pub fn is_used_keyword(self) -> bool {
2929        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2930        self.name.is_used_keyword_always()
2931            || self.name.is_used_keyword_conditional(|| self.span.edition())
2932    }
2933
2934    /// Returns `true` if the token is a keyword reserved for possible future use.
2935    pub fn is_unused_keyword(self) -> bool {
2936        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2937        self.name.is_unused_keyword_always()
2938            || self.name.is_unused_keyword_conditional(|| self.span.edition())
2939    }
2940
2941    /// Returns `true` if the token is either a special identifier or a keyword.
2942    pub fn is_reserved(self) -> bool {
2943        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2944        self.name.is_reserved(|| self.span.edition())
2945    }
2946
2947    /// A keyword or reserved identifier that can be used as a path segment.
2948    pub fn is_path_segment_keyword(self) -> bool {
2949        self.name.is_path_segment_keyword()
2950    }
2951
2952    /// We see this identifier in a normal identifier position, like variable name or a type.
2953    /// How was it written originally? Did it use the raw form? Let's try to guess.
2954    pub fn is_raw_guess(self) -> bool {
2955        self.name.can_be_raw() && self.is_reserved()
2956    }
2957
2958    /// Given the name of a lifetime without the first quote (`'`),
2959    /// returns whether the lifetime name is reserved (therefore invalid)
2960    pub fn is_reserved_lifetime(self) -> bool {
2961        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
2962    }
2963
2964    pub fn is_raw_lifetime_guess(self) -> bool {
2965        // Check that the name isn't just a single quote.
2966        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
2967        if self.name.as_str() == "'" {
2968            return false;
2969        }
2970        let ident_without_apostrophe = self.without_first_quote();
2971        ident_without_apostrophe.name != self.name
2972            && ident_without_apostrophe.name.can_be_raw()
2973            && ident_without_apostrophe.is_reserved_lifetime()
2974    }
2975
2976    pub fn guess_print_mode(self) -> IdentPrintMode {
2977        if self.is_raw_lifetime_guess() {
2978            IdentPrintMode::RawLifetime
2979        } else if self.is_raw_guess() {
2980            IdentPrintMode::RawIdent
2981        } else {
2982            IdentPrintMode::Normal
2983        }
2984    }
2985
2986    /// Whether this would be the identifier for a tuple field like `self.0`, as
2987    /// opposed to a named field like `self.thing`.
2988    pub fn is_numeric(self) -> bool {
2989        self.as_str().bytes().all(|b| b.is_ascii_digit())
2990    }
2991}
2992
2993/// Collect all the keywords in a given edition into a vector.
2994///
2995/// *Note:* Please update this if a new keyword is added beyond the current
2996/// range.
2997pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
2998    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
2999        .filter_map(|kw| {
3000            let kw = Symbol::new(kw);
3001            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
3002                Some(kw)
3003            } else {
3004                None
3005            }
3006        })
3007        .collect()
3008}