Skip to main content

rustc_span/
symbol.rs

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