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