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