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_launch_sized_workgroup_mem", "gt", "guard",
                        "guard_patterns", "half_open_range_patterns",
                        "half_open_range_patterns_in_slices", "hash", "hexagon",
                        "hexagon_target_feature", "hidden", "hide",
                        "homogeneous_aggregate", "html_favicon_url",
                        "html_logo_url", "html_no_source", "html_playground_url",
                        "html_root_url", "hvx", "hvx-length64b", "hvx-length128b",
                        "hwaddress", "i8", "i16", "i32", "i64", "i128", "i128_type",
                        "ident", "if_let", "if_let_guard", "if_let_rescope",
                        "if_while_or_patterns", "ignore", "immediate-abort",
                        "impl_header_lifetime_elision", "impl_lint_pass",
                        "impl_restriction", "impl_trait_in_assoc_type",
                        "impl_trait_in_bindings", "impl_trait_in_fn_trait_return",
                        "impl_trait_projections", "implied_by", "import",
                        "import_name_type", "import_shadowing",
                        "import_trait_associated_functions", "imported_main",
                        "in_band_lifetimes", "include", "include_bytes",
                        "include_str", "inclusive_range_syntax",
                        "incomplete_features", "index", "index_mut",
                        "infer_outlives_requirements",
                        "infer_static_outlives_requirements",
                        "inherent_associated_types", "initial", "inlateout",
                        "inline", "inline_const", "inline_const_pat", "inout",
                        "inputs", "instruction_set", "integer", "integral",
                        "internal", "internal_eq_trait_method_impls",
                        "internal_features", "into_async_iter_into_iter",
                        "into_future", "into_iter", "into_try_type",
                        "intra_doc_pointers", "intrinsics",
                        "irrefutable_let_patterns", "is", "is_auto",
                        "is_val_statically_known", "isa_attribute", "isize",
                        "issue", "issue_5723_bootstrap", "issue_tracker_base_url",
                        "item", "item_like_imports", "iter", "iter_mut", "iterator",
                        "iterator_collect_fn", "kcfi", "kernel_address",
                        "kernel_hwaddress", "keylocker_x86", "keyword", "kind",
                        "kreg", "kreg0", "label", "label_break_value",
                        "lahfsahf_target_feature", "lang", "lang_items",
                        "large_assignments", "last", "lateout",
                        "lazy_normalization_consts", "lazy_type_alias", "le",
                        "legacy_receiver", "len", "let_chains", "let_else", "lhs",
                        "lib", "libc", "lifetime", "lifetime_capture_rules_2024",
                        "lifetimes", "line", "link", "link_arg_attribute",
                        "link_args", "link_cfg", "link-arg", "link_llvm_intrinsics",
                        "link_name", "link_ordinal", "link_section", "linkage",
                        "linker", "linker_info", "linker_messages", "linkonce",
                        "linkonce_odr", "lint_reasons", "literal", "little", "big",
                        "load", "loaded_from_disk", "local", "local_inner_macros",
                        "log2f16", "log2f32", "log2f64", "log2f128", "log10f16",
                        "log10f32", "log10f64", "log10f128", "log_syntax", "logf16",
                        "logf32", "logf64", "logf128", "loongarch32", "loongarch64",
                        "loongarch_target_feature", "loop_break_value",
                        "loop_match", "lr", "lt", "m68k", "m68k_target_feature",
                        "mach-o", "macro_at_most_once_rep", "macro_attr",
                        "macro_attributes_in_derive_output", "macro_derive",
                        "macro_escape", "macro_export", "macro_guard_matcher",
                        "macro_lifetime_matcher", "macro_literal_matcher",
                        "macro_metavar_expr", "macro_metavar_expr_concat",
                        "macro_reexport", "macro_use", "macro_vis_matcher",
                        "macros_in_extern", "main", "managed_boxes",
                        "manually_drop", "map", "map_err", "marker",
                        "marker_trait_attr", "masked", "match_beginning_vert",
                        "match_default_bindings", "maximum_number_nsz_f16",
                        "maximum_number_nsz_f32", "maximum_number_nsz_f64",
                        "maximum_number_nsz_f128", "maximumf16", "maximumf32",
                        "maximumf64", "maximumf128", "may_dangle", "may_unwind",
                        "maybe_dangling", "maybe_uninit", "maybe_uninit_uninit",
                        "maybe_uninit_zeroed", "mem", "mem_align_const",
                        "mem_discriminant", "mem_drop", "mem_forget",
                        "mem_size_const", "mem_swap", "mem_uninitialized",
                        "mem_variant_count", "mem_zeroed", "member_constraints",
                        "memory", "memtag", "message", "meta", "meta_sized",
                        "metadata_type", "mgca_type_const_syntax",
                        "min_adt_const_params", "min_const_fn",
                        "min_const_generics", "min_const_unsafe_fn",
                        "min_exhaustive_patterns", "min_generic_const_args",
                        "min_specialization", "min_type_alias_impl_trait",
                        "minimum_number_nsz_f16", "minimum_number_nsz_f32",
                        "minimum_number_nsz_f64", "minimum_number_nsz_f128",
                        "minimumf16", "minimumf32", "minimumf64", "minimumf128",
                        "mips", "mips32r6", "mips64", "mips64r6",
                        "mips_target_feature", "mir_assume", "mir_basic_block",
                        "mir_call", "mir_cast_ptr_to_ptr", "mir_cast_transmute",
                        "mir_cast_unsize", "mir_checked", "mir_debuginfo",
                        "mir_discriminant", "mir_drop", "mir_field", "mir_goto",
                        "mir_make_place", "mir_move", "mir_offset",
                        "mir_ptr_metadata", "mir_return", "mir_return_to",
                        "mir_set_discriminant", "mir_static", "mir_static_mut",
                        "mir_storage_dead", "mir_storage_live", "mir_tail_call",
                        "mir_unreachable", "mir_unwind_cleanup",
                        "mir_unwind_continue", "mir_unwind_resume",
                        "mir_unwind_terminate", "mir_unwind_terminate_reason",
                        "mir_unwind_unreachable", "mir_variant", "miri", "mmx_reg",
                        "modifiers", "module", "module_path", "more_maybe_bounds",
                        "more_qualified_paths", "more_struct_aliases",
                        "movbe_target_feature", "move_expr", "move_ref_pattern",
                        "move_size_limit", "movrs_target_feature", "msp430", "mul",
                        "mul_assign", "mul_with_overflow",
                        "multiple_supertrait_upcastable", "must_not_suspend",
                        "must_use", "mut_preserve_binding_mode_2024", "mut_ref",
                        "mut_restriction", "mutable", "naked", "naked_asm",
                        "naked_functions", "naked_functions_rustic_abi",
                        "naked_functions_target_feature", "name", "names",
                        "native_link_modifiers", "native_link_modifiers_as_needed",
                        "native_link_modifiers_bundle",
                        "native_link_modifiers_verbatim",
                        "native_link_modifiers_whole_archive", "natvis_file", "ne",
                        "needs_allocator", "needs_drop", "needs_panic_runtime",
                        "neg", "negate_unsigned", "negative_bounds",
                        "negative_impls", "neon", "nested", "never",
                        "never_patterns", "never_type", "never_type_fallback",
                        "new", "new_binary", "new_debug", "new_debug_noop",
                        "new_display", "new_lower_exp", "new_lower_hex",
                        "new_octal", "new_pointer", "new_range", "new_unchecked",
                        "new_upper_exp", "new_upper_hex", "next", "niko", "nll",
                        "no", "no_builtins", "no_core", "no_coverage",
                        "no_crate_inject", "no_debug", "no_default_passes",
                        "no_implicit_prelude", "no_inline", "no_link", "no_main",
                        "no_mangle", "no_sanitize", "no_stack_check", "no_std",
                        "nomem", "non_ascii_idents", "non_exhaustive",
                        "non_exhaustive_omitted_patterns_lint",
                        "non_lifetime_binders", "non_modrs_mods", "nonblocking",
                        "none", "nontemporal_store", "noop_method_borrow",
                        "noop_method_clone", "noop_method_deref", "noprefix",
                        "noreturn", "nostack", "not", "notable_trait", "note",
                        "null", "nvptx64", "nvptx_target_feature",
                        "object_safe_for_dispatch", "of", "off", "offload",
                        "offset", "offset_of", "offset_of_enum", "offset_of_nested",
                        "offset_of_slice", "ok_or_else", "old_name",
                        "omit_gdb_pretty_printer_section", "on", "on_const",
                        "on_move", "on_unimplemented", "on_unknown",
                        "on_unmatch_args", "opaque", "<opaque>", "ops",
                        "opt_out_copy", "optimize", "optimize_attribute",
                        "optimized", "optin_builtin_traits", "option", "option_env",
                        "options", "or", "or_patterns", "ord_cmp_method", "other",
                        "out", "output", "overflow_checks",
                        "overlapping_marker_traits", "owned_box", "packed",
                        "packed_bundled_libs", "panic", "panic_2015", "panic_2021",
                        "panic_abort", "panic_bounds_check", "panic_cannot_unwind",
                        "panic_const_add_overflow", "panic_const_async_fn_resumed",
                        "panic_const_async_fn_resumed_drop",
                        "panic_const_async_fn_resumed_panic",
                        "panic_const_async_gen_fn_resumed",
                        "panic_const_async_gen_fn_resumed_drop",
                        "panic_const_async_gen_fn_resumed_panic",
                        "panic_const_coroutine_resumed",
                        "panic_const_coroutine_resumed_drop",
                        "panic_const_coroutine_resumed_panic",
                        "panic_const_div_by_zero", "panic_const_div_overflow",
                        "panic_const_gen_fn_none", "panic_const_gen_fn_none_drop",
                        "panic_const_gen_fn_none_panic", "panic_const_mul_overflow",
                        "panic_const_neg_overflow", "panic_const_rem_by_zero",
                        "panic_const_rem_overflow", "panic_const_shl_overflow",
                        "panic_const_shr_overflow", "panic_const_sub_overflow",
                        "panic_display", "panic_fmt", "panic_handler", "panic_impl",
                        "panic_implementation", "panic_in_cleanup", "panic_info",
                        "panic_invalid_enum_construction", "panic_location",
                        "panic_misaligned_pointer_dereference", "panic_nounwind",
                        "panic_null_pointer_dereference", "panic_runtime",
                        "panic_str_2015", "panic_unwind", "panicking",
                        "param_attrs", "parent_label", "partial_cmp", "partial_ord",
                        "passes", "pat", "pat_param", "patchable_function_entry",
                        "path", "pattern_complexity_limit", "pattern_parentheses",
                        "pattern_type", "pattern_type_range_trait", "pattern_types",
                        "phantom_data", "phase", "pic", "pie", "pin", "pin_drop",
                        "pin_ergonomics", "pin_v2", "platform_intrinsics", "plugin",
                        "plugin_registrar", "plugins", "pointee", "pointee_sized",
                        "pointee_trait", "pointer", "poll", "post-cleanup",
                        "post-lto", "postfix_match", "powerpc", "powerpc64",
                        "powerpc_target_feature", "powf16", "powf32", "powf64",
                        "powf128", "powif16", "powif32", "powif64", "powif128",
                        "pre-lto", "precise_capturing",
                        "precise_capturing_in_traits",
                        "precise_pointer_size_matching", "predicates",
                        "pref_align_of", "prefetch_read_data",
                        "prefetch_read_instruction", "prefetch_write_data",
                        "prefetch_write_instruction", "prefix_nops", "preg",
                        "prelude", "prelude_import", "preserves_flags",
                        "prfchw_target_feature", "proc-macro", "proc_macro",
                        "proc_macro_attribute", "proc_macro_derive",
                        "proc_macro_expr", "proc_macro_gen", "proc_macro_hygiene",
                        "proc_macro_internals", "proc_macro_mod",
                        "proc_macro_non_items", "proc_macro_path_invoc",
                        "profiler_runtime", "ptr", "ptr_cast", "ptr_cast_const",
                        "ptr_cast_mut", "ptr_const_is_null", "ptr_copy",
                        "ptr_copy_nonoverlapping", "ptr_from_ref",
                        "ptr_guaranteed_cmp", "ptr_is_null", "ptr_mask",
                        "ptr_metadata", "ptr_null", "ptr_null_mut",
                        "ptr_offset_from", "ptr_offset_from_unsigned", "ptr_read",
                        "ptr_read_unaligned", "ptr_replace", "ptr_swap",
                        "ptr_swap_nonoverlapping", "ptr_write", "ptr_write_bytes",
                        "ptr_write_unaligned", "ptr_write_volatile",
                        "pub_macro_rules", "pub_restricted", "public", "pure",
                        "pushpop_unsafe", "qreg", "qreg_low4", "qreg_low8",
                        "quad_precision_float", "question_mark", "quote",
                        "range_inclusive_new", "raw-dylib", "raw_dylib",
                        "raw_dylib_elf", "raw_eq", "raw_identifiers", "raw_ref_op",
                        "re_rebalance_coherence", "read_via_copy", "readonly",
                        "realloc", "realtime", "reason", "reborrow", "receiver",
                        "receiver_target", "recursion_limit",
                        "reexport_test_harness_main", "ref_pat_eat_one_layer_2024",
                        "ref_pat_eat_one_layer_2024_structural",
                        "ref_pat_everywhere", "ref_unwind_safe_trait", "reference",
                        "reflect", "reg", "reg16", "reg32", "reg64", "reg_abcd",
                        "reg_addr", "reg_byte", "reg_data", "reg_iw", "reg_nonzero",
                        "reg_pair", "reg_ptr", "reg_upper", "register_attr",
                        "register_tool", "relaxed_adts", "relaxed_struct_unsize",
                        "relocation_model", "rem", "rem_assign", "repr", "repr128",
                        "repr_align", "repr_align_enum", "repr_packed", "repr_simd",
                        "repr_transparent", "require", "reserve-x18", "residual",
                        "result", "result_ffi_guarantees", "return_address",
                        "return_position_impl_trait_in_trait",
                        "return_type_notation", "riscv32", "riscv64",
                        "riscv_target_feature", "rlib", "ropi", "ropi-rwpi",
                        "rotate_left", "rotate_right", "round_ties_even_f16",
                        "round_ties_even_f32", "round_ties_even_f64",
                        "round_ties_even_f128", "roundf16", "roundf32", "roundf64",
                        "roundf128", "rtm_target_feature", "runtime", "rust",
                        "rust_2015", "rust_2018", "rust_2018_preview", "rust_2021",
                        "rust_2024", "rust_analyzer", "rust_begin_unwind",
                        "rust_cold_cc", "rust_eh_catch_typeinfo",
                        "rust_eh_personality", "rust_future", "rust_logo",
                        "rust_out", "rust_preserve_none_cc", "rustc", "rustc_abi",
                        "rustc_align", "rustc_align_static", "rustc_allocator",
                        "rustc_allocator_zeroed", "rustc_allocator_zeroed_variant",
                        "rustc_allow_const_fn_unstable",
                        "rustc_allow_incoherent_impl",
                        "rustc_allowed_through_unstable_modules", "rustc_as_ptr",
                        "rustc_attrs", "rustc_autodiff", "rustc_builtin_macro",
                        "rustc_capture_analysis", "rustc_clean",
                        "rustc_coherence_is_core", "rustc_coinductive",
                        "rustc_confusables", "rustc_const_stable",
                        "rustc_const_stable_indirect", "rustc_const_unstable",
                        "rustc_conversion_suggestion", "rustc_deallocator",
                        "rustc_default_body_unstable",
                        "rustc_delayed_bug_from_inside_query",
                        "rustc_deny_explicit_impl", "rustc_deprecated_safe_2024",
                        "rustc_diagnostic_item", "rustc_diagnostic_macros",
                        "rustc_do_not_const_check", "rustc_doc_primitive",
                        "rustc_driver", "rustc_dummy", "rustc_dump_def_parents",
                        "rustc_dump_def_path", "rustc_dump_hidden_type_of_opaques",
                        "rustc_dump_inferred_outlives", "rustc_dump_item_bounds",
                        "rustc_dump_layout", "rustc_dump_object_lifetime_defaults",
                        "rustc_dump_predicates", "rustc_dump_symbol_name",
                        "rustc_dump_user_args", "rustc_dump_variances",
                        "rustc_dump_variances_of_opaques", "rustc_dump_vtable",
                        "rustc_dyn_incompatible_trait",
                        "rustc_effective_visibility", "rustc_eii_foreign_item",
                        "rustc_evaluate_where_clauses", "rustc_expected_cgu_reuse",
                        "rustc_force_inline", "rustc_has_incoherent_inherent_impls",
                        "rustc_if_this_changed", "rustc_inherit_overflow_checks",
                        "rustc_insignificant_dtor", "rustc_intrinsic",
                        "rustc_intrinsic_const_stable_indirect",
                        "rustc_legacy_const_generics",
                        "rustc_lint_opt_deny_field_access", "rustc_lint_opt_ty",
                        "rustc_lint_query_instability",
                        "rustc_lint_untracked_query_information",
                        "rustc_macro_transparency", "rustc_main", "rustc_mir",
                        "rustc_must_implement_one_of",
                        "rustc_must_match_exhaustively",
                        "rustc_never_returns_null_ptr", "rustc_never_type_options",
                        "rustc_no_implicit_autorefs", "rustc_no_implicit_bounds",
                        "rustc_no_mir_inline", "rustc_no_writable",
                        "rustc_non_const_trait_method",
                        "rustc_nonnull_optimization_guaranteed", "rustc_nounwind",
                        "rustc_objc_class", "rustc_objc_selector",
                        "rustc_offload_kernel", "rustc_on_unimplemented",
                        "rustc_paren_sugar", "rustc_partition_codegened",
                        "rustc_partition_reused", "rustc_pass_by_value",
                        "rustc_pass_indirectly_in_non_rustic_abis", "rustc_peek",
                        "rustc_peek_liveness", "rustc_peek_maybe_init",
                        "rustc_peek_maybe_uninit", "rustc_preserve_ub_checks",
                        "rustc_private", "rustc_proc_macro_decls",
                        "rustc_promotable", "rustc_pub_transparent",
                        "rustc_reallocator", "rustc_regions",
                        "rustc_reservation_impl", "rustc_scalable_vector",
                        "rustc_should_not_be_called_on_const_items",
                        "rustc_simd_monomorphize_lane_limit",
                        "rustc_skip_during_method_dispatch",
                        "rustc_specialization_trait", "rustc_std_internal_symbol",
                        "rustc_strict_coherence", "rustc_test_marker",
                        "rustc_then_this_would_need", "rustc_trivial_field_reads",
                        "rustc_unsafe_specialization_marker", "rustdoc",
                        "rustdoc_internals", "rustdoc_missing_doc_code_examples",
                        "rustfmt", "rvalue_static_promotion", "rwpi", "s390x",
                        "s390x_target_feature", "s390x_target_feature_vector",
                        "safety", "sanitize", "sanitizer_cfi_generalize_pointers",
                        "sanitizer_cfi_normalize_integers", "sanitizer_runtime",
                        "saturating_add", "saturating_sub", "sdylib",
                        "search_unbox", "select_unpredictable", "self_in_typedefs",
                        "self_struct_ctor", "semiopaque", "sha2", "sha3",
                        "sha512_sm_x86", "shadow_call_stack", "shallow", "shl",
                        "shl_assign", "shorter_tail_lifetimes", "should_panic",
                        "show", "shr", "shr_assign", "signed", "simd", "simd_add",
                        "simd_and", "simd_arith_offset", "simd_as", "simd_bitmask",
                        "simd_bitreverse", "simd_bswap", "simd_carryless_mul",
                        "simd_cast", "simd_cast_ptr", "simd_ceil", "simd_ctlz",
                        "simd_ctpop", "simd_cttz", "simd_div", "simd_eq",
                        "simd_expose_provenance", "simd_extract",
                        "simd_extract_dyn", "simd_fabs", "simd_fcos", "simd_fexp",
                        "simd_fexp2", "simd_ffi", "simd_flog", "simd_flog2",
                        "simd_flog10", "simd_floor", "simd_fma", "simd_fsin",
                        "simd_fsqrt", "simd_funnel_shl", "simd_funnel_shr",
                        "simd_gather", "simd_ge", "simd_gt", "simd_insert",
                        "simd_insert_dyn", "simd_le", "simd_lt", "simd_masked_load",
                        "simd_masked_store", "simd_maximum_number_nsz",
                        "simd_minimum_number_nsz", "simd_mul", "simd_ne",
                        "simd_neg", "simd_or", "simd_reduce_add_ordered",
                        "simd_reduce_add_unordered", "simd_reduce_all",
                        "simd_reduce_and", "simd_reduce_any", "simd_reduce_max",
                        "simd_reduce_min", "simd_reduce_mul_ordered",
                        "simd_reduce_mul_unordered", "simd_reduce_or",
                        "simd_reduce_xor", "simd_relaxed_fma", "simd_rem",
                        "simd_round", "simd_round_ties_even", "simd_saturating_add",
                        "simd_saturating_sub", "simd_scatter", "simd_select",
                        "simd_select_bitmask", "simd_shl", "simd_shr",
                        "simd_shuffle", "simd_shuffle_const_generic", "simd_splat",
                        "simd_sub", "simd_trunc", "simd_with_exposed_provenance",
                        "simd_xor", "since", "sinf16", "sinf32", "sinf64",
                        "sinf128", "size", "size_of", "size_of_type_id",
                        "size_of_val", "sized", "sized_hierarchy", "slice",
                        "slice_from_raw_parts", "slice_from_raw_parts_mut",
                        "slice_get_unchecked", "slice_len_fn", "slice_patterns",
                        "slicing_syntax", "soft-float", "sparc", "sparc64",
                        "sparc_target_feature", "spe_acc", "specialization",
                        "speed", "spirv", "spotlight", "sqrtf16", "sqrtf32",
                        "sqrtf64", "sqrtf128", "sreg", "sreg_low16", "sse", "sse2",
                        "sse4a_target_feature", "stable", "staged_api", "start",
                        "state", "static_align", "static_in_const",
                        "static_nobundle", "static_recursion", "staticlib", "std",
                        "std_lib_injection", "std_panic", "std_panic_2015_macro",
                        "std_panic_macro", "stmt", "stmt_expr_attributes",
                        "stop_after_dataflow", "store", "str", "str_from_utf8",
                        "str_from_utf8_mut", "str_from_utf8_unchecked",
                        "str_from_utf8_unchecked_mut", "str_inherent_from_utf8",
                        "str_inherent_from_utf8_mut",
                        "str_inherent_from_utf8_unchecked",
                        "str_inherent_from_utf8_unchecked_mut",
                        "strict_provenance_lints", "string_deref_patterns",
                        "stringify", "struct_field_attributes", "struct_inherit",
                        "struct_variant", "structural_match", "structural_peq",
                        "sub", "sub_assign", "sub_with_overflow", "suggestion",
                        "super_let", "supertrait_item_shadowing", "sve_cast",
                        "sve_tuple_create2", "sve_tuple_create3",
                        "sve_tuple_create4", "sve_tuple_get", "sve_tuple_set",
                        "sym", "sync", "synthetic", "t32", "target", "target_abi",
                        "target_arch", "target_endian", "target_env",
                        "target_family", "target_feature", "target_feature_11",
                        "target_feature_inline_always", "target_has_atomic",
                        "target_has_atomic_load_store",
                        "target_has_atomic_primitive_alignment",
                        "target_has_reliable_f16", "target_has_reliable_f16_math",
                        "target_has_reliable_f128", "target_has_reliable_f128_math",
                        "target_object_format", "target_os", "target_pointer_width",
                        "target_thread_local", "target_vendor",
                        "tbm_target_feature", "termination", "termination_trait",
                        "termination_trait_test", "test", "test_2018_feature",
                        "test_accepted_feature", "test_case",
                        "test_incomplete_feature", "test_removed_feature",
                        "test_runner", "test_unstable_lint", "thread",
                        "thread_local", "three_way_compare", "thumb2", "thumb-mode",
                        "tmm_reg", "to_owned_method", "to_string", "to_vec",
                        "tool_attributes", "tool_lints", "trace_macros",
                        "track_caller", "trait_alias", "trait_ty",
                        "trait_upcasting", "transmute", "transmute_generic_consts",
                        "transmute_opts", "transmute_trait", "transmute_unchecked",
                        "transparent", "transparent_enums", "transparent_unions",
                        "trivial_bounds", "trivial_clone", "truncf16", "truncf32",
                        "truncf64", "truncf128", "try_blocks",
                        "try_blocks_heterogeneous", "try_capture", "try_from",
                        "try_into", "try_trait_v2", "try_trait_v2_residual",
                        "try_update", "tt", "tuple", "tuple_indexing",
                        "tuple_trait", "two_phase", "ty",
                        "type_alias_enum_variants", "type_alias_impl_trait",
                        "type_ascribe", "type_ascription",
                        "type_changing_struct_update", "type_id", "type_id_eq",
                        "type_id_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", "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_launch_sized_workgroup_mem,
1044        gt,
1045        guard,
1046        guard_patterns,
1047        half_open_range_patterns,
1048        half_open_range_patterns_in_slices,
1049        hash,
1050        hexagon,
1051        hexagon_target_feature,
1052        hidden,
1053        hide,
1054        homogeneous_aggregate,
1055        html_favicon_url,
1056        html_logo_url,
1057        html_no_source,
1058        html_playground_url,
1059        html_root_url,
1060        hvx,
1061        hvx_length64b: "hvx-length64b",
1062        hvx_length128b: "hvx-length128b",
1063        hwaddress,
1064        i8,
1065        i16,
1066        i32,
1067        i64,
1068        i128,
1069        i128_type,
1070        ident,
1071        if_let,
1072        if_let_guard,
1073        if_let_rescope,
1074        if_while_or_patterns,
1075        ignore,
1076        immediate_abort: "immediate-abort",
1077        impl_header_lifetime_elision,
1078        impl_lint_pass,
1079        impl_restriction,
1080        impl_trait_in_assoc_type,
1081        impl_trait_in_bindings,
1082        impl_trait_in_fn_trait_return,
1083        impl_trait_projections,
1084        implied_by,
1085        import,
1086        import_name_type,
1087        import_shadowing,
1088        import_trait_associated_functions,
1089        imported_main,
1090        in_band_lifetimes,
1091        include,
1092        include_bytes,
1093        include_str,
1094        inclusive_range_syntax,
1095        incomplete_features,
1096        index,
1097        index_mut,
1098        infer_outlives_requirements,
1099        infer_static_outlives_requirements,
1100        inherent_associated_types,
1101        initial,
1102        inlateout,
1103        inline,
1104        inline_const,
1105        inline_const_pat,
1106        inout,
1107        inputs,
1108        instruction_set,
1109        integer_: "integer", // underscore to avoid clashing with the function `sym::integer` below
1110        integral,
1111        internal,
1112        internal_eq_trait_method_impls,
1113        internal_features,
1114        into_async_iter_into_iter,
1115        into_future,
1116        into_iter,
1117        into_try_type,
1118        intra_doc_pointers,
1119        intrinsics,
1120        irrefutable_let_patterns,
1121        is,
1122        is_auto,
1123        is_val_statically_known,
1124        isa_attribute,
1125        isize,
1126        issue,
1127        issue_5723_bootstrap,
1128        issue_tracker_base_url,
1129        item,
1130        item_like_imports,
1131        iter,
1132        iter_mut,
1133        iterator,
1134        iterator_collect_fn,
1135        kcfi,
1136        kernel_address,
1137        kernel_hwaddress,
1138        keylocker_x86,
1139        keyword,
1140        kind,
1141        kreg,
1142        kreg0,
1143        label,
1144        label_break_value,
1145        lahfsahf_target_feature,
1146        lang,
1147        lang_items,
1148        large_assignments,
1149        last,
1150        lateout,
1151        lazy_normalization_consts,
1152        lazy_type_alias,
1153        le,
1154        legacy_receiver,
1155        len,
1156        let_chains,
1157        let_else,
1158        lhs,
1159        lib,
1160        libc,
1161        lifetime,
1162        lifetime_capture_rules_2024,
1163        lifetimes,
1164        line,
1165        link,
1166        link_arg_attribute,
1167        link_args,
1168        link_cfg,
1169        link_dash_arg: "link-arg",
1170        link_llvm_intrinsics,
1171        link_name,
1172        link_ordinal,
1173        link_section,
1174        linkage,
1175        linker,
1176        linker_info,
1177        linker_messages,
1178        linkonce,
1179        linkonce_odr,
1180        lint_reasons,
1181        literal,
1182        little, big,
1183        load,
1184        loaded_from_disk,
1185        local,
1186        local_inner_macros,
1187        log2f16,
1188        log2f32,
1189        log2f64,
1190        log2f128,
1191        log10f16,
1192        log10f32,
1193        log10f64,
1194        log10f128,
1195        log_syntax,
1196        logf16,
1197        logf32,
1198        logf64,
1199        logf128,
1200        loongarch32,
1201        loongarch64,
1202        loongarch_target_feature,
1203        loop_break_value,
1204        loop_match,
1205        lr,
1206        lt,
1207        m68k,
1208        m68k_target_feature,
1209        macho: "mach-o",
1210        macro_at_most_once_rep,
1211        macro_attr,
1212        macro_attributes_in_derive_output,
1213        macro_derive,
1214        macro_escape,
1215        macro_export,
1216        macro_guard_matcher,
1217        macro_lifetime_matcher,
1218        macro_literal_matcher,
1219        macro_metavar_expr,
1220        macro_metavar_expr_concat,
1221        macro_reexport,
1222        macro_use,
1223        macro_vis_matcher,
1224        macros_in_extern,
1225        main,
1226        managed_boxes,
1227        manually_drop,
1228        map,
1229        map_err,
1230        marker,
1231        marker_trait_attr,
1232        masked,
1233        match_beginning_vert,
1234        match_default_bindings,
1235        maximum_number_nsz_f16,
1236        maximum_number_nsz_f32,
1237        maximum_number_nsz_f64,
1238        maximum_number_nsz_f128,
1239        maximumf16,
1240        maximumf32,
1241        maximumf64,
1242        maximumf128,
1243        may_dangle,
1244        may_unwind,
1245        maybe_dangling,
1246        maybe_uninit,
1247        maybe_uninit_uninit,
1248        maybe_uninit_zeroed,
1249        mem,
1250        mem_align_const,
1251        mem_discriminant,
1252        mem_drop,
1253        mem_forget,
1254        mem_size_const,
1255        mem_swap,
1256        mem_uninitialized,
1257        mem_variant_count,
1258        mem_zeroed,
1259        member_constraints,
1260        memory,
1261        memtag,
1262        message,
1263        meta,
1264        meta_sized,
1265        metadata_type,
1266        mgca_type_const_syntax,
1267        min_adt_const_params,
1268        min_const_fn,
1269        min_const_generics,
1270        min_const_unsafe_fn,
1271        min_exhaustive_patterns,
1272        min_generic_const_args,
1273        min_specialization,
1274        min_type_alias_impl_trait,
1275        minimum_number_nsz_f16,
1276        minimum_number_nsz_f32,
1277        minimum_number_nsz_f64,
1278        minimum_number_nsz_f128,
1279        minimumf16,
1280        minimumf32,
1281        minimumf64,
1282        minimumf128,
1283        mips,
1284        mips32r6,
1285        mips64,
1286        mips64r6,
1287        mips_target_feature,
1288        mir_assume,
1289        mir_basic_block,
1290        mir_call,
1291        mir_cast_ptr_to_ptr,
1292        mir_cast_transmute,
1293        mir_cast_unsize,
1294        mir_checked,
1295        mir_debuginfo,
1296        mir_discriminant,
1297        mir_drop,
1298        mir_field,
1299        mir_goto,
1300        mir_make_place,
1301        mir_move,
1302        mir_offset,
1303        mir_ptr_metadata,
1304        mir_return,
1305        mir_return_to,
1306        mir_set_discriminant,
1307        mir_static,
1308        mir_static_mut,
1309        mir_storage_dead,
1310        mir_storage_live,
1311        mir_tail_call,
1312        mir_unreachable,
1313        mir_unwind_cleanup,
1314        mir_unwind_continue,
1315        mir_unwind_resume,
1316        mir_unwind_terminate,
1317        mir_unwind_terminate_reason,
1318        mir_unwind_unreachable,
1319        mir_variant,
1320        miri,
1321        mmx_reg,
1322        modifiers,
1323        module,
1324        module_path,
1325        more_maybe_bounds,
1326        more_qualified_paths,
1327        more_struct_aliases,
1328        movbe_target_feature,
1329        move_expr,
1330        move_ref_pattern,
1331        move_size_limit,
1332        movrs_target_feature,
1333        msp430,
1334        mul,
1335        mul_assign,
1336        mul_with_overflow,
1337        multiple_supertrait_upcastable,
1338        must_not_suspend,
1339        must_use,
1340        mut_preserve_binding_mode_2024,
1341        mut_ref,
1342        mut_restriction,
1343        mutable,
1344        naked,
1345        naked_asm,
1346        naked_functions,
1347        naked_functions_rustic_abi,
1348        naked_functions_target_feature,
1349        name,
1350        names,
1351        native_link_modifiers,
1352        native_link_modifiers_as_needed,
1353        native_link_modifiers_bundle,
1354        native_link_modifiers_verbatim,
1355        native_link_modifiers_whole_archive,
1356        natvis_file,
1357        ne,
1358        needs_allocator,
1359        needs_drop,
1360        needs_panic_runtime,
1361        neg,
1362        negate_unsigned,
1363        negative_bounds,
1364        negative_impls,
1365        neon,
1366        nested,
1367        never,
1368        never_patterns,
1369        never_type,
1370        never_type_fallback,
1371        new,
1372        new_binary,
1373        new_debug,
1374        new_debug_noop,
1375        new_display,
1376        new_lower_exp,
1377        new_lower_hex,
1378        new_octal,
1379        new_pointer,
1380        new_range,
1381        new_unchecked,
1382        new_upper_exp,
1383        new_upper_hex,
1384        next,
1385        niko,
1386        nll,
1387        no,
1388        no_builtins,
1389        no_core,
1390        no_coverage,
1391        no_crate_inject,
1392        no_debug,
1393        no_default_passes,
1394        no_implicit_prelude,
1395        no_inline,
1396        no_link,
1397        no_main,
1398        no_mangle,
1399        no_sanitize,
1400        no_stack_check,
1401        no_std,
1402        nomem,
1403        non_ascii_idents,
1404        non_exhaustive,
1405        non_exhaustive_omitted_patterns_lint,
1406        non_lifetime_binders,
1407        non_modrs_mods,
1408        nonblocking,
1409        none,
1410        nontemporal_store,
1411        noop_method_borrow,
1412        noop_method_clone,
1413        noop_method_deref,
1414        noprefix,
1415        noreturn,
1416        nostack,
1417        not,
1418        notable_trait,
1419        note,
1420        null,
1421        nvptx64,
1422        nvptx_target_feature,
1423        object_safe_for_dispatch,
1424        of,
1425        off,
1426        offload,
1427        offset,
1428        offset_of,
1429        offset_of_enum,
1430        offset_of_nested,
1431        offset_of_slice,
1432        ok_or_else,
1433        old_name,
1434        omit_gdb_pretty_printer_section,
1435        on,
1436        on_const,
1437        on_move,
1438        on_unimplemented,
1439        on_unknown,
1440        on_unmatch_args,
1441        opaque,
1442        opaque_module_name_placeholder: "<opaque>",
1443        ops,
1444        opt_out_copy,
1445        optimize,
1446        optimize_attribute,
1447        optimized,
1448        optin_builtin_traits,
1449        option,
1450        option_env,
1451        options,
1452        or,
1453        or_patterns,
1454        ord_cmp_method,
1455        other,
1456        out,
1457        output,
1458        overflow_checks,
1459        overlapping_marker_traits,
1460        owned_box,
1461        packed,
1462        packed_bundled_libs,
1463        panic,
1464        panic_2015,
1465        panic_2021,
1466        panic_abort,
1467        panic_bounds_check,
1468        panic_cannot_unwind,
1469        panic_const_add_overflow,
1470        panic_const_async_fn_resumed,
1471        panic_const_async_fn_resumed_drop,
1472        panic_const_async_fn_resumed_panic,
1473        panic_const_async_gen_fn_resumed,
1474        panic_const_async_gen_fn_resumed_drop,
1475        panic_const_async_gen_fn_resumed_panic,
1476        panic_const_coroutine_resumed,
1477        panic_const_coroutine_resumed_drop,
1478        panic_const_coroutine_resumed_panic,
1479        panic_const_div_by_zero,
1480        panic_const_div_overflow,
1481        panic_const_gen_fn_none,
1482        panic_const_gen_fn_none_drop,
1483        panic_const_gen_fn_none_panic,
1484        panic_const_mul_overflow,
1485        panic_const_neg_overflow,
1486        panic_const_rem_by_zero,
1487        panic_const_rem_overflow,
1488        panic_const_shl_overflow,
1489        panic_const_shr_overflow,
1490        panic_const_sub_overflow,
1491        panic_display,
1492        panic_fmt,
1493        panic_handler,
1494        panic_impl,
1495        panic_implementation,
1496        panic_in_cleanup,
1497        panic_info,
1498        panic_invalid_enum_construction,
1499        panic_location,
1500        panic_misaligned_pointer_dereference,
1501        panic_nounwind,
1502        panic_null_pointer_dereference,
1503        panic_runtime,
1504        panic_str_2015,
1505        panic_unwind,
1506        panicking,
1507        param_attrs,
1508        parent_label,
1509        partial_cmp,
1510        partial_ord,
1511        passes,
1512        pat,
1513        pat_param,
1514        patchable_function_entry,
1515        path,
1516        pattern_complexity_limit,
1517        pattern_parentheses,
1518        pattern_type,
1519        pattern_type_range_trait,
1520        pattern_types,
1521        phantom_data,
1522        phase,
1523        pic,
1524        pie,
1525        pin,
1526        pin_drop,
1527        pin_ergonomics,
1528        pin_v2,
1529        platform_intrinsics,
1530        plugin,
1531        plugin_registrar,
1532        plugins,
1533        pointee,
1534        pointee_sized,
1535        pointee_trait,
1536        pointer,
1537        poll,
1538        post_cleanup: "post-cleanup",
1539        post_dash_lto: "post-lto",
1540        postfix_match,
1541        powerpc,
1542        powerpc64,
1543        powerpc_target_feature,
1544        powf16,
1545        powf32,
1546        powf64,
1547        powf128,
1548        powif16,
1549        powif32,
1550        powif64,
1551        powif128,
1552        pre_dash_lto: "pre-lto",
1553        precise_capturing,
1554        precise_capturing_in_traits,
1555        precise_pointer_size_matching,
1556        predicates,
1557        pref_align_of,
1558        prefetch_read_data,
1559        prefetch_read_instruction,
1560        prefetch_write_data,
1561        prefetch_write_instruction,
1562        prefix_nops,
1563        preg,
1564        prelude,
1565        prelude_import,
1566        preserves_flags,
1567        prfchw_target_feature,
1568        proc_dash_macro: "proc-macro",
1569        proc_macro,
1570        proc_macro_attribute,
1571        proc_macro_derive,
1572        proc_macro_expr,
1573        proc_macro_gen,
1574        proc_macro_hygiene,
1575        proc_macro_internals,
1576        proc_macro_mod,
1577        proc_macro_non_items,
1578        proc_macro_path_invoc,
1579        profiler_runtime,
1580        ptr,
1581        ptr_cast,
1582        ptr_cast_const,
1583        ptr_cast_mut,
1584        ptr_const_is_null,
1585        ptr_copy,
1586        ptr_copy_nonoverlapping,
1587        ptr_from_ref,
1588        ptr_guaranteed_cmp,
1589        ptr_is_null,
1590        ptr_mask,
1591        ptr_metadata,
1592        ptr_null,
1593        ptr_null_mut,
1594        ptr_offset_from,
1595        ptr_offset_from_unsigned,
1596        ptr_read,
1597        ptr_read_unaligned,
1598        ptr_replace,
1599        ptr_swap,
1600        ptr_swap_nonoverlapping,
1601        ptr_write,
1602        ptr_write_bytes,
1603        ptr_write_unaligned,
1604        ptr_write_volatile,
1605        pub_macro_rules,
1606        pub_restricted,
1607        public,
1608        pure,
1609        pushpop_unsafe,
1610        qreg,
1611        qreg_low4,
1612        qreg_low8,
1613        quad_precision_float,
1614        question_mark,
1615        quote,
1616        range_inclusive_new,
1617        raw_dash_dylib: "raw-dylib",
1618        raw_dylib,
1619        raw_dylib_elf,
1620        raw_eq,
1621        raw_identifiers,
1622        raw_ref_op,
1623        re_rebalance_coherence,
1624        read_via_copy,
1625        readonly,
1626        realloc,
1627        realtime,
1628        reason,
1629        reborrow,
1630        receiver,
1631        receiver_target,
1632        recursion_limit,
1633        reexport_test_harness_main,
1634        ref_pat_eat_one_layer_2024,
1635        ref_pat_eat_one_layer_2024_structural,
1636        ref_pat_everywhere,
1637        ref_unwind_safe_trait,
1638        reference,
1639        reflect,
1640        reg,
1641        reg16,
1642        reg32,
1643        reg64,
1644        reg_abcd,
1645        reg_addr,
1646        reg_byte,
1647        reg_data,
1648        reg_iw,
1649        reg_nonzero,
1650        reg_pair,
1651        reg_ptr,
1652        reg_upper,
1653        register_attr,
1654        register_tool,
1655        relaxed_adts,
1656        relaxed_struct_unsize,
1657        relocation_model,
1658        rem,
1659        rem_assign,
1660        repr,
1661        repr128,
1662        repr_align,
1663        repr_align_enum,
1664        repr_packed,
1665        repr_simd,
1666        repr_transparent,
1667        require,
1668        reserve_x18: "reserve-x18",
1669        residual,
1670        result,
1671        result_ffi_guarantees,
1672        return_address,
1673        return_position_impl_trait_in_trait,
1674        return_type_notation,
1675        riscv32,
1676        riscv64,
1677        riscv_target_feature,
1678        rlib,
1679        ropi,
1680        ropi_rwpi: "ropi-rwpi",
1681        rotate_left,
1682        rotate_right,
1683        round_ties_even_f16,
1684        round_ties_even_f32,
1685        round_ties_even_f64,
1686        round_ties_even_f128,
1687        roundf16,
1688        roundf32,
1689        roundf64,
1690        roundf128,
1691        rtm_target_feature,
1692        runtime,
1693        rust,
1694        rust_2015,
1695        rust_2018,
1696        rust_2018_preview,
1697        rust_2021,
1698        rust_2024,
1699        rust_analyzer,
1700        rust_begin_unwind,
1701        rust_cold_cc,
1702        rust_eh_catch_typeinfo,
1703        rust_eh_personality,
1704        rust_future,
1705        rust_logo,
1706        rust_out,
1707        rust_preserve_none_cc,
1708        rustc,
1709        rustc_abi,
1710        // FIXME(#82232, #143834): temporary name to mitigate `#[align]` nameres ambiguity
1711        rustc_align,
1712        rustc_align_static,
1713        rustc_allocator,
1714        rustc_allocator_zeroed,
1715        rustc_allocator_zeroed_variant,
1716        rustc_allow_const_fn_unstable,
1717        rustc_allow_incoherent_impl,
1718        rustc_allowed_through_unstable_modules,
1719        rustc_as_ptr,
1720        rustc_attrs,
1721        rustc_autodiff,
1722        rustc_builtin_macro,
1723        rustc_capture_analysis,
1724        rustc_clean,
1725        rustc_coherence_is_core,
1726        rustc_coinductive,
1727        rustc_confusables,
1728        rustc_const_stable,
1729        rustc_const_stable_indirect,
1730        rustc_const_unstable,
1731        rustc_conversion_suggestion,
1732        rustc_deallocator,
1733        rustc_default_body_unstable,
1734        rustc_delayed_bug_from_inside_query,
1735        rustc_deny_explicit_impl,
1736        rustc_deprecated_safe_2024,
1737        rustc_diagnostic_item,
1738        rustc_diagnostic_macros,
1739        rustc_do_not_const_check,
1740        rustc_doc_primitive,
1741        rustc_driver,
1742        rustc_dummy,
1743        rustc_dump_def_parents,
1744        rustc_dump_def_path,
1745        rustc_dump_hidden_type_of_opaques,
1746        rustc_dump_inferred_outlives,
1747        rustc_dump_item_bounds,
1748        rustc_dump_layout,
1749        rustc_dump_object_lifetime_defaults,
1750        rustc_dump_predicates,
1751        rustc_dump_symbol_name,
1752        rustc_dump_user_args,
1753        rustc_dump_variances,
1754        rustc_dump_variances_of_opaques,
1755        rustc_dump_vtable,
1756        rustc_dyn_incompatible_trait,
1757        rustc_effective_visibility,
1758        rustc_eii_foreign_item,
1759        rustc_evaluate_where_clauses,
1760        rustc_expected_cgu_reuse,
1761        rustc_force_inline,
1762        rustc_has_incoherent_inherent_impls,
1763        rustc_if_this_changed,
1764        rustc_inherit_overflow_checks,
1765        rustc_insignificant_dtor,
1766        rustc_intrinsic,
1767        rustc_intrinsic_const_stable_indirect,
1768        rustc_legacy_const_generics,
1769        rustc_lint_opt_deny_field_access,
1770        rustc_lint_opt_ty,
1771        rustc_lint_query_instability,
1772        rustc_lint_untracked_query_information,
1773        rustc_macro_transparency,
1774        rustc_main,
1775        rustc_mir,
1776        rustc_must_implement_one_of,
1777        rustc_must_match_exhaustively,
1778        rustc_never_returns_null_ptr,
1779        rustc_never_type_options,
1780        rustc_no_implicit_autorefs,
1781        rustc_no_implicit_bounds,
1782        rustc_no_mir_inline,
1783        rustc_no_writable,
1784        rustc_non_const_trait_method,
1785        rustc_nonnull_optimization_guaranteed,
1786        rustc_nounwind,
1787        rustc_objc_class,
1788        rustc_objc_selector,
1789        rustc_offload_kernel,
1790        rustc_on_unimplemented,
1791        rustc_paren_sugar,
1792        rustc_partition_codegened,
1793        rustc_partition_reused,
1794        rustc_pass_by_value,
1795        rustc_pass_indirectly_in_non_rustic_abis,
1796        rustc_peek,
1797        rustc_peek_liveness,
1798        rustc_peek_maybe_init,
1799        rustc_peek_maybe_uninit,
1800        rustc_preserve_ub_checks,
1801        rustc_private,
1802        rustc_proc_macro_decls,
1803        rustc_promotable,
1804        rustc_pub_transparent,
1805        rustc_reallocator,
1806        rustc_regions,
1807        rustc_reservation_impl,
1808        rustc_scalable_vector,
1809        rustc_should_not_be_called_on_const_items,
1810        rustc_simd_monomorphize_lane_limit,
1811        rustc_skip_during_method_dispatch,
1812        rustc_specialization_trait,
1813        rustc_std_internal_symbol,
1814        rustc_strict_coherence,
1815        rustc_test_marker,
1816        rustc_then_this_would_need,
1817        rustc_trivial_field_reads,
1818        rustc_unsafe_specialization_marker,
1819        rustdoc,
1820        rustdoc_internals,
1821        rustdoc_missing_doc_code_examples,
1822        rustfmt,
1823        rvalue_static_promotion,
1824        rwpi,
1825        s390x,
1826        s390x_target_feature,
1827        s390x_target_feature_vector,
1828        safety,
1829        sanitize,
1830        sanitizer_cfi_generalize_pointers,
1831        sanitizer_cfi_normalize_integers,
1832        sanitizer_runtime,
1833        saturating_add,
1834        saturating_sub,
1835        sdylib,
1836        search_unbox,
1837        select_unpredictable,
1838        self_in_typedefs,
1839        self_struct_ctor,
1840        semiopaque,
1841        sha2,
1842        sha3,
1843        sha512_sm_x86,
1844        shadow_call_stack,
1845        shallow,
1846        shl,
1847        shl_assign,
1848        shorter_tail_lifetimes,
1849        should_panic,
1850        show,
1851        shr,
1852        shr_assign,
1853        signed,
1854        simd,
1855        simd_add,
1856        simd_and,
1857        simd_arith_offset,
1858        simd_as,
1859        simd_bitmask,
1860        simd_bitreverse,
1861        simd_bswap,
1862        simd_carryless_mul,
1863        simd_cast,
1864        simd_cast_ptr,
1865        simd_ceil,
1866        simd_ctlz,
1867        simd_ctpop,
1868        simd_cttz,
1869        simd_div,
1870        simd_eq,
1871        simd_expose_provenance,
1872        simd_extract,
1873        simd_extract_dyn,
1874        simd_fabs,
1875        simd_fcos,
1876        simd_fexp,
1877        simd_fexp2,
1878        simd_ffi,
1879        simd_flog,
1880        simd_flog2,
1881        simd_flog10,
1882        simd_floor,
1883        simd_fma,
1884        simd_fsin,
1885        simd_fsqrt,
1886        simd_funnel_shl,
1887        simd_funnel_shr,
1888        simd_gather,
1889        simd_ge,
1890        simd_gt,
1891        simd_insert,
1892        simd_insert_dyn,
1893        simd_le,
1894        simd_lt,
1895        simd_masked_load,
1896        simd_masked_store,
1897        simd_maximum_number_nsz,
1898        simd_minimum_number_nsz,
1899        simd_mul,
1900        simd_ne,
1901        simd_neg,
1902        simd_or,
1903        simd_reduce_add_ordered,
1904        simd_reduce_add_unordered,
1905        simd_reduce_all,
1906        simd_reduce_and,
1907        simd_reduce_any,
1908        simd_reduce_max,
1909        simd_reduce_min,
1910        simd_reduce_mul_ordered,
1911        simd_reduce_mul_unordered,
1912        simd_reduce_or,
1913        simd_reduce_xor,
1914        simd_relaxed_fma,
1915        simd_rem,
1916        simd_round,
1917        simd_round_ties_even,
1918        simd_saturating_add,
1919        simd_saturating_sub,
1920        simd_scatter,
1921        simd_select,
1922        simd_select_bitmask,
1923        simd_shl,
1924        simd_shr,
1925        simd_shuffle,
1926        simd_shuffle_const_generic,
1927        simd_splat,
1928        simd_sub,
1929        simd_trunc,
1930        simd_with_exposed_provenance,
1931        simd_xor,
1932        since,
1933        sinf16,
1934        sinf32,
1935        sinf64,
1936        sinf128,
1937        size,
1938        size_of,
1939        size_of_type_id,
1940        size_of_val,
1941        sized,
1942        sized_hierarchy,
1943        slice,
1944        slice_from_raw_parts,
1945        slice_from_raw_parts_mut,
1946        slice_get_unchecked,
1947        slice_len_fn,
1948        slice_patterns,
1949        slicing_syntax,
1950        soft_float: "soft-float",
1951        sparc,
1952        sparc64,
1953        sparc_target_feature,
1954        spe_acc,
1955        specialization,
1956        speed,
1957        spirv,
1958        spotlight,
1959        sqrtf16,
1960        sqrtf32,
1961        sqrtf64,
1962        sqrtf128,
1963        sreg,
1964        sreg_low16,
1965        sse,
1966        sse2,
1967        sse4a_target_feature,
1968        stable,
1969        staged_api,
1970        start,
1971        state,
1972        static_align,
1973        static_in_const,
1974        static_nobundle,
1975        static_recursion,
1976        staticlib,
1977        std,
1978        std_lib_injection,
1979        std_panic,
1980        std_panic_2015_macro,
1981        std_panic_macro,
1982        stmt,
1983        stmt_expr_attributes,
1984        stop_after_dataflow,
1985        store,
1986        str,
1987        str_from_utf8,
1988        str_from_utf8_mut,
1989        str_from_utf8_unchecked,
1990        str_from_utf8_unchecked_mut,
1991        str_inherent_from_utf8,
1992        str_inherent_from_utf8_mut,
1993        str_inherent_from_utf8_unchecked,
1994        str_inherent_from_utf8_unchecked_mut,
1995        strict_provenance_lints,
1996        string_deref_patterns,
1997        stringify,
1998        struct_field_attributes,
1999        struct_inherit,
2000        struct_variant,
2001        structural_match,
2002        structural_peq,
2003        sub,
2004        sub_assign,
2005        sub_with_overflow,
2006        suggestion,
2007        super_let,
2008        supertrait_item_shadowing,
2009        sve_cast,
2010        sve_tuple_create2,
2011        sve_tuple_create3,
2012        sve_tuple_create4,
2013        sve_tuple_get,
2014        sve_tuple_set,
2015        sym,
2016        sync,
2017        synthetic,
2018        t32,
2019        target,
2020        target_abi,
2021        target_arch,
2022        target_endian,
2023        target_env,
2024        target_family,
2025        target_feature,
2026        target_feature_11,
2027        target_feature_inline_always,
2028        target_has_atomic,
2029        target_has_atomic_load_store,
2030        target_has_atomic_primitive_alignment,
2031        target_has_reliable_f16,
2032        target_has_reliable_f16_math,
2033        target_has_reliable_f128,
2034        target_has_reliable_f128_math,
2035        target_object_format,
2036        target_os,
2037        target_pointer_width,
2038        target_thread_local,
2039        target_vendor,
2040        tbm_target_feature,
2041        termination,
2042        termination_trait,
2043        termination_trait_test,
2044        test,
2045        test_2018_feature,
2046        test_accepted_feature,
2047        test_case,
2048        test_incomplete_feature,
2049        test_removed_feature,
2050        test_runner,
2051        test_unstable_lint,
2052        thread,
2053        thread_local,
2054        three_way_compare,
2055        thumb2,
2056        thumb_mode: "thumb-mode",
2057        tmm_reg,
2058        to_owned_method,
2059        to_string,
2060        to_vec,
2061        tool_attributes,
2062        tool_lints,
2063        trace_macros,
2064        track_caller,
2065        trait_alias,
2066        trait_ty,
2067        trait_upcasting,
2068        transmute,
2069        transmute_generic_consts,
2070        transmute_opts,
2071        transmute_trait,
2072        transmute_unchecked,
2073        transparent,
2074        transparent_enums,
2075        transparent_unions,
2076        trivial_bounds,
2077        trivial_clone,
2078        truncf16,
2079        truncf32,
2080        truncf64,
2081        truncf128,
2082        try_blocks,
2083        try_blocks_heterogeneous,
2084        try_capture,
2085        try_from,
2086        try_into,
2087        try_trait_v2,
2088        try_trait_v2_residual,
2089        try_update,
2090        tt,
2091        tuple,
2092        tuple_indexing,
2093        tuple_trait,
2094        two_phase,
2095        ty,
2096        type_alias_enum_variants,
2097        type_alias_impl_trait,
2098        type_ascribe,
2099        type_ascription,
2100        type_changing_struct_update,
2101        type_id,
2102        type_id_eq,
2103        type_id_field_representing_type,
2104        type_id_fields,
2105        type_id_variants,
2106        type_id_vtable,
2107        type_info,
2108        type_ir,
2109        type_ir_infer_ctxt_like,
2110        type_ir_inherent,
2111        type_ir_interner,
2112        type_length_limit,
2113        type_macros,
2114        type_name,
2115        type_of,
2116        type_privacy_lints,
2117        typed_swap_nonoverlapping,
2118        u8,
2119        u8_legacy_const_max,
2120        u8_legacy_const_min,
2121        u8_legacy_fn_max_value,
2122        u8_legacy_fn_min_value,
2123        u8_legacy_mod,
2124        u16,
2125        u16_legacy_const_max,
2126        u16_legacy_const_min,
2127        u16_legacy_fn_max_value,
2128        u16_legacy_fn_min_value,
2129        u16_legacy_mod,
2130        u32,
2131        u32_legacy_const_max,
2132        u32_legacy_const_min,
2133        u32_legacy_fn_max_value,
2134        u32_legacy_fn_min_value,
2135        u32_legacy_mod,
2136        u64,
2137        u64_legacy_const_max,
2138        u64_legacy_const_min,
2139        u64_legacy_fn_max_value,
2140        u64_legacy_fn_min_value,
2141        u64_legacy_mod,
2142        u128,
2143        u128_legacy_const_max,
2144        u128_legacy_const_min,
2145        u128_legacy_fn_max_value,
2146        u128_legacy_fn_min_value,
2147        u128_legacy_mod,
2148        ub_checks,
2149        unaligned_volatile_load,
2150        unaligned_volatile_store,
2151        unboxed_closures,
2152        unchecked_add,
2153        unchecked_div,
2154        unchecked_funnel_shl,
2155        unchecked_funnel_shr,
2156        unchecked_mul,
2157        unchecked_rem,
2158        unchecked_shl,
2159        unchecked_shr,
2160        unchecked_sub,
2161        undecorated,
2162        underscore_const_names,
2163        underscore_imports,
2164        underscore_lifetimes,
2165        uniform_paths,
2166        unit,
2167        universal_impl_trait,
2168        unix,
2169        unlikely,
2170        unmarked_api,
2171        unnamed_fields,
2172        unpin,
2173        unqualified_local_imports,
2174        unreachable,
2175        unreachable_2015,
2176        unreachable_2015_macro,
2177        unreachable_2021,
2178        unreachable_code,
2179        unreachable_display,
2180        unreachable_macro,
2181        unrestricted_attribute_tokens,
2182        unsafe_attributes,
2183        unsafe_binders,
2184        unsafe_block_in_unsafe_fn,
2185        unsafe_cell,
2186        unsafe_cell_raw_get,
2187        unsafe_eii,
2188        unsafe_extern_blocks,
2189        unsafe_fields,
2190        unsafe_no_drop_flag,
2191        unsafe_pinned,
2192        unsafe_unpin,
2193        unsafety,
2194        unsize,
2195        unsized_const_param_ty,
2196        unsized_const_params,
2197        unsized_fn_params,
2198        unsized_locals,
2199        unsized_tuple_coercion,
2200        unstable,
2201        unstable_feature_bound,
2202        unstable_location_reason_default: "this crate is being loaded from the sysroot, an \
2203                          unstable location; did you mean to load this crate \
2204                          from crates.io via `Cargo.toml` instead?",
2205        unstable_removed,
2206        untagged_unions,
2207        unused_imports,
2208        unwind,
2209        unwind_attributes,
2210        unwind_safe_trait,
2211        unwrap,
2212        unwrap_binder,
2213        unwrap_or,
2214        update,
2215        use_cloned,
2216        use_extern_macros,
2217        use_nested_groups,
2218        used,
2219        used_with_arg,
2220        using,
2221        usize,
2222        usize_legacy_const_max,
2223        usize_legacy_const_min,
2224        usize_legacy_fn_max_value,
2225        usize_legacy_fn_min_value,
2226        usize_legacy_mod,
2227        v1,
2228        v8plus,
2229        va_arg,
2230        va_arg_safe,
2231        va_copy,
2232        va_end,
2233        va_list,
2234        va_start,
2235        val,
2236        validity,
2237        value,
2238        values,
2239        var,
2240        variadic,
2241        variant_count,
2242        variants,
2243        vec,
2244        vector,
2245        verbatim,
2246        version,
2247        vfp2,
2248        view_types,
2249        vis,
2250        visible_private_types,
2251        volatile,
2252        volatile_copy_memory,
2253        volatile_copy_nonoverlapping_memory,
2254        volatile_load,
2255        volatile_set_memory,
2256        volatile_store,
2257        vreg,
2258        vreg_low16,
2259        vreg_pair,
2260        vsreg,
2261        vsx,
2262        vtable_align,
2263        vtable_size,
2264        warn,
2265        wasip2,
2266        wasm,
2267        wasm32,
2268        wasm64,
2269        wasm_abi,
2270        wasm_import_module,
2271        wasm_target_feature,
2272        weak,
2273        weak_odr,
2274        where_clause_attrs,
2275        while_let,
2276        whole_dash_archive: "whole-archive",
2277        width,
2278        windows,
2279        windows_subsystem,
2280        with_negative_coherence,
2281        wrap_binder,
2282        wrapping_add,
2283        wrapping_div,
2284        wrapping_mul,
2285        wrapping_rem,
2286        wrapping_rem_euclid,
2287        wrapping_sub,
2288        wreg,
2289        write_box_via_move,
2290        write_bytes,
2291        write_fmt,
2292        write_macro,
2293        write_str,
2294        write_via_move,
2295        writeln_macro,
2296        x86,
2297        x86_64,
2298        x86_amx_intrinsics,
2299        x87_reg,
2300        x87_target_feature,
2301        xcoff,
2302        xer,
2303        xmm_reg,
2304        xop_target_feature,
2305        xtensa,
2306        yeet_desugar_details,
2307        yeet_expr,
2308        yes,
2309        yield_expr,
2310        ymm_reg,
2311        yreg,
2312        zca,
2313        zfh,
2314        zfhmin,
2315        zmm_reg,
2316        ztso,
2317        // tidy-alphabetical-end
2318    }
2319}
2320
2321/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2322/// `proc_macro`.
2323pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2324
2325#[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)]
2326pub struct Ident {
2327    /// `name` should never be the empty symbol. If you are considering that,
2328    /// you are probably conflating "empty identifier with "no identifier" and
2329    /// you should use `Option<Ident>` instead.
2330    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2331    pub name: Symbol,
2332    pub span: Span,
2333}
2334
2335impl Ident {
2336    #[inline]
2337    /// Constructs a new identifier from a symbol and a span.
2338    pub fn new(name: Symbol, span: Span) -> Ident {
2339        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);
2340        Ident { name, span }
2341    }
2342
2343    /// Constructs a new identifier with a dummy span.
2344    #[inline]
2345    pub fn with_dummy_span(name: Symbol) -> Ident {
2346        Ident::new(name, DUMMY_SP)
2347    }
2348
2349    // For dummy identifiers that are never used and absolutely must be
2350    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2351    // makes it clear that it's intended as a dummy value, and is more likely
2352    // to be detected if it accidentally does get used.
2353    #[inline]
2354    pub fn dummy() -> Ident {
2355        Ident::with_dummy_span(sym::dummy)
2356    }
2357
2358    /// Maps a string to an identifier with a dummy span.
2359    pub fn from_str(string: &str) -> Ident {
2360        Ident::with_dummy_span(Symbol::intern(string))
2361    }
2362
2363    /// Maps a string and a span to an identifier.
2364    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2365        Ident::new(Symbol::intern(string), span)
2366    }
2367
2368    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2369    pub fn with_span_pos(self, span: Span) -> Ident {
2370        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2371    }
2372
2373    /// Creates a new ident with the same span and name with leading quote removed, if any.
2374    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2375    pub fn without_first_quote(self) -> Ident {
2376        self.as_str()
2377            .strip_prefix('\'')
2378            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2379    }
2380
2381    /// "Normalize" ident for use in comparisons using "item hygiene".
2382    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2383    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2384    /// different macro 2.0 macros.
2385    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2386    pub fn normalize_to_macros_2_0(self) -> Ident {
2387        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2388    }
2389
2390    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2391    /// Identifiers with same string value become same if they came from the same non-transparent
2392    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2393    /// non-transparent macros.
2394    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2395    #[inline]
2396    pub fn normalize_to_macro_rules(self) -> Ident {
2397        Ident::new(self.name, self.span.normalize_to_macro_rules())
2398    }
2399
2400    /// Access the underlying string. This is a slowish operation because it
2401    /// requires locking the symbol interner.
2402    ///
2403    /// Note that the lifetime of the return value is a lie. See
2404    /// `Symbol::as_str()` for details.
2405    pub fn as_str(&self) -> &str {
2406        self.name.as_str()
2407    }
2408}
2409
2410impl PartialEq for Ident {
2411    #[inline]
2412    fn eq(&self, rhs: &Self) -> bool {
2413        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2414    }
2415}
2416
2417impl Hash for Ident {
2418    fn hash<H: Hasher>(&self, state: &mut H) {
2419        self.name.hash(state);
2420        self.span.ctxt().hash(state);
2421    }
2422}
2423
2424impl fmt::Debug for Ident {
2425    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2426        fmt::Display::fmt(self, f)?;
2427        fmt::Debug::fmt(&self.span.ctxt(), f)
2428    }
2429}
2430
2431/// This implementation is supposed to be used in error messages, so it's expected to be identical
2432/// to printing the original identifier token written in source code (`token_to_string`),
2433/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2434impl fmt::Display for Ident {
2435    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2436        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2437    }
2438}
2439
2440pub enum IdentPrintMode {
2441    Normal,
2442    RawIdent,
2443    RawLifetime,
2444}
2445
2446/// The most general type to print identifiers.
2447///
2448/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2449/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2450/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2451/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2452/// hygiene data, most importantly name of the crate it refers to.
2453/// As a result we print `$crate` as `crate` if it refers to the local crate
2454/// and as `::other_crate_name` if it refers to some other crate.
2455/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2456/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2457/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2458/// done for a token stream or a single token.
2459pub struct IdentPrinter {
2460    symbol: Symbol,
2461    mode: IdentPrintMode,
2462    /// Span used for retrieving the crate name to which `$crate` refers to,
2463    /// if this field is `None` then the `$crate` conversion doesn't happen.
2464    convert_dollar_crate: Option<Span>,
2465}
2466
2467impl IdentPrinter {
2468    /// The most general `IdentPrinter` constructor. Do not use this.
2469    pub fn new(
2470        symbol: Symbol,
2471        mode: IdentPrintMode,
2472        convert_dollar_crate: Option<Span>,
2473    ) -> IdentPrinter {
2474        IdentPrinter { symbol, mode, convert_dollar_crate }
2475    }
2476
2477    /// This implementation is supposed to be used when printing identifiers
2478    /// as a part of pretty-printing for larger AST pieces.
2479    /// Do not use this either.
2480    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2481        IdentPrinter::new(ident.name, mode, Some(ident.span))
2482    }
2483}
2484
2485impl fmt::Display for IdentPrinter {
2486    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2487        let s = match self.mode {
2488            IdentPrintMode::Normal
2489                if self.symbol == kw::DollarCrate
2490                    && let Some(span) = self.convert_dollar_crate =>
2491            {
2492                let converted = span.ctxt().dollar_crate_name();
2493                if !converted.is_path_segment_keyword() {
2494                    f.write_str("::")?;
2495                }
2496                converted
2497            }
2498            IdentPrintMode::Normal => self.symbol,
2499            IdentPrintMode::RawIdent => {
2500                f.write_str("r#")?;
2501                self.symbol
2502            }
2503            IdentPrintMode::RawLifetime => {
2504                f.write_str("'r#")?;
2505                let s = self
2506                    .symbol
2507                    .as_str()
2508                    .strip_prefix("'")
2509                    .expect("only lifetime idents should be passed with RawLifetime mode");
2510                Symbol::intern(s)
2511            }
2512        };
2513        s.fmt(f)
2514    }
2515}
2516
2517/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2518/// construction for "local variable hygiene" comparisons.
2519///
2520/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2521/// This ensures compile-time safety and avoids manual normalization calls.
2522#[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)]
2523pub struct MacroRulesNormalizedIdent(Ident);
2524
2525impl MacroRulesNormalizedIdent {
2526    #[inline]
2527    pub fn new(ident: Ident) -> Self {
2528        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2529    }
2530
2531    pub fn symbol(&self) -> Symbol {
2532        self.0.name
2533    }
2534
2535    pub fn ident(&self) -> Ident {
2536        self.0
2537    }
2538}
2539
2540impl fmt::Debug for MacroRulesNormalizedIdent {
2541    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2542        fmt::Debug::fmt(&self.0, f)
2543    }
2544}
2545
2546impl fmt::Display for MacroRulesNormalizedIdent {
2547    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2548        fmt::Display::fmt(&self.0, f)
2549    }
2550}
2551
2552/// An interned UTF-8 string.
2553///
2554/// Internally, a `Symbol` is implemented as an index, and all operations
2555/// (including hashing, equality, and ordering) operate on that index. The use
2556/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2557/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2558///
2559/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2560/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2561#[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)]
2562pub struct Symbol(SymbolIndex);
2563
2564// Used within both `Symbol` and `ByteSymbol`.
2565impl ::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! {
2566    #[orderable]
2567    struct SymbolIndex {}
2568}
2569
2570impl Symbol {
2571    /// Avoid this except for things like deserialization of previously
2572    /// serialized symbols, and testing. Use `intern` instead.
2573    pub const fn new(n: u32) -> Self {
2574        Symbol(SymbolIndex::from_u32(n))
2575    }
2576
2577    /// Maps a string to its interned representation.
2578    #[rustc_diagnostic_item = "SymbolIntern"]
2579    pub fn intern(str: &str) -> Self {
2580        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2581    }
2582
2583    /// Access the underlying string. This is a slowish operation because it
2584    /// requires locking the symbol interner.
2585    ///
2586    /// Note that the lifetime of the return value is a lie. It's not the same
2587    /// as `&self`, but actually tied to the lifetime of the underlying
2588    /// interner. Interners are long-lived, and there are very few of them, and
2589    /// this function is typically used for short-lived things, so in practice
2590    /// it works out ok.
2591    pub fn as_str(&self) -> &str {
2592        with_session_globals(|session_globals| unsafe {
2593            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2594        })
2595    }
2596
2597    pub fn as_u32(self) -> u32 {
2598        self.0.as_u32()
2599    }
2600
2601    pub fn is_empty(self) -> bool {
2602        self == sym::empty
2603    }
2604
2605    /// This method is supposed to be used in error messages, so it's expected to be
2606    /// identical to printing the original identifier token written in source code
2607    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2608    /// or edition, so we have to guess the rawness using the global edition.
2609    pub fn to_ident_string(self) -> String {
2610        // Avoid creating an empty identifier, because that asserts in debug builds.
2611        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2612    }
2613
2614    /// Checks if `self` is similar to any symbol in `candidates`.
2615    ///
2616    /// The returned boolean represents whether the candidate is the same symbol with a different
2617    /// casing.
2618    ///
2619    /// All the candidates are assumed to be lowercase.
2620    pub fn find_similar(
2621        self,
2622        candidates: &[Symbol],
2623    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2624        let lowercase = self.as_str().to_lowercase();
2625        let lowercase_sym = Symbol::intern(&lowercase);
2626        if candidates.contains(&lowercase_sym) {
2627            Some((lowercase_sym, true))
2628        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2629            Some((similar_sym, false))
2630        } else {
2631            None
2632        }
2633    }
2634}
2635
2636impl fmt::Debug for Symbol {
2637    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2638        fmt::Debug::fmt(self.as_str(), f)
2639    }
2640}
2641
2642impl fmt::Display for Symbol {
2643    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2644        fmt::Display::fmt(self.as_str(), f)
2645    }
2646}
2647
2648impl StableHash for Symbol {
2649    #[inline]
2650    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2651        self.as_str().stable_hash(hcx, hasher);
2652    }
2653}
2654
2655impl StableCompare for Symbol {
2656    const CAN_USE_UNSTABLE_SORT: bool = true;
2657
2658    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2659        self.as_str().cmp(other.as_str())
2660    }
2661}
2662
2663/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2664/// it has fewer operations defined than `Symbol`.
2665#[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)]
2666pub struct ByteSymbol(SymbolIndex);
2667
2668impl ByteSymbol {
2669    /// Avoid this except for things like deserialization of previously
2670    /// serialized symbols, and testing. Use `intern` instead.
2671    pub const fn new(n: u32) -> Self {
2672        ByteSymbol(SymbolIndex::from_u32(n))
2673    }
2674
2675    /// Maps a string to its interned representation.
2676    pub fn intern(byte_str: &[u8]) -> Self {
2677        with_session_globals(|session_globals| {
2678            session_globals.symbol_interner.intern_byte_str(byte_str)
2679        })
2680    }
2681
2682    /// Like `Symbol::as_str`.
2683    pub fn as_byte_str(&self) -> &[u8] {
2684        with_session_globals(|session_globals| unsafe {
2685            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2686        })
2687    }
2688
2689    pub fn as_u32(self) -> u32 {
2690        self.0.as_u32()
2691    }
2692}
2693
2694impl fmt::Debug for ByteSymbol {
2695    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2696        fmt::Debug::fmt(self.as_byte_str(), f)
2697    }
2698}
2699
2700impl StableHash for ByteSymbol {
2701    #[inline]
2702    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2703        self.as_byte_str().stable_hash(hcx, hasher);
2704    }
2705}
2706
2707// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2708// string with identical contents (e.g. "foo" and b"foo") are both interned,
2709// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2710// will have the same index.
2711pub(crate) struct Interner(Lock<InternerInner>);
2712
2713// The `&'static [u8]`s in this type actually point into the arena.
2714//
2715// This type is private to prevent accidentally constructing more than one
2716// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2717// between `Interner`s.
2718struct InternerInner {
2719    arena: DroplessArena,
2720    byte_strs: FxIndexSet<&'static [u8]>,
2721}
2722
2723impl Interner {
2724    // These arguments are `&str`, but because of the sharing, we are
2725    // effectively pre-interning all these strings for both `Symbol` and
2726    // `ByteSymbol`.
2727    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2728        let byte_strs = FxIndexSet::from_iter(
2729            init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes()),
2730        );
2731
2732        // The order in which duplicates are reported is irrelevant.
2733        #[expect(rustc::potential_query_instability)]
2734        if byte_strs.len() != init.len() + extra.len() {
2735            {
    ::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!(
2736                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2737                FxHashSet::intersection(
2738                    &init.iter().copied().collect(),
2739                    &extra.iter().copied().collect(),
2740                )
2741                .collect::<Vec<_>>()
2742            )
2743        }
2744
2745        Interner(Lock::new(InternerInner { arena: Default::default(), byte_strs }))
2746    }
2747
2748    fn intern_str(&self, str: &str) -> Symbol {
2749        Symbol::new(self.intern_inner(str.as_bytes()))
2750    }
2751
2752    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
2753        ByteSymbol::new(self.intern_inner(byte_str))
2754    }
2755
2756    #[inline]
2757    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
2758        let mut inner = self.0.lock();
2759        if let Some(idx) = inner.byte_strs.get_index_of(byte_str) {
2760            return idx as u32;
2761        }
2762
2763        let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
2764
2765        // SAFETY: we can extend the arena allocation to `'static` because we
2766        // only access these while the arena is still alive.
2767        let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
2768
2769        // This second hash table lookup can be avoided by using `RawEntryMut`,
2770        // but this code path isn't hot enough for it to be worth it. See
2771        // #91445 for details.
2772        let (idx, is_new) = inner.byte_strs.insert_full(byte_str);
2773        if true {
    if !is_new { ::core::panicking::panic("assertion failed: is_new") };
};debug_assert!(is_new); // due to the get_index_of check above
2774
2775        idx as u32
2776    }
2777
2778    /// Get the symbol as a string.
2779    ///
2780    /// [`Symbol::as_str()`] should be used in preference to this function.
2781    fn get_str(&self, symbol: Symbol) -> &str {
2782        let byte_str = self.get_inner(symbol.0.as_usize());
2783        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
2784        unsafe { str::from_utf8_unchecked(byte_str) }
2785    }
2786
2787    /// Get the symbol as a string.
2788    ///
2789    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
2790    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
2791        self.get_inner(symbol.0.as_usize())
2792    }
2793
2794    fn get_inner(&self, index: usize) -> &[u8] {
2795        self.0.lock().byte_strs.get_index(index).unwrap()
2796    }
2797}
2798
2799// This module has a very short name because it's used a lot.
2800/// This module contains all the defined keyword `Symbol`s.
2801///
2802/// Given that `kw` is imported, use them like `kw::keyword_name`.
2803/// For example `kw::Loop` or `kw::Break`.
2804pub mod kw {
2805    pub use super::kw_generated::*;
2806}
2807
2808// This module has a very short name because it's used a lot.
2809/// This module contains all the defined non-keyword `Symbol`s.
2810///
2811/// Given that `sym` is imported, use them like `sym::symbol_name`.
2812/// For example `sym::rustfmt` or `sym::u8`.
2813pub mod sym {
2814    // Used from a macro in `librustc_feature/accepted.rs`
2815    use super::Symbol;
2816    pub use super::kw::MacroRules as macro_rules;
2817    #[doc(inline)]
2818    pub use super::sym_generated::*;
2819
2820    // Used quite often in relation to C ABI.
2821    pub const C: Symbol = ascii_letter_digit('C').unwrap();
2822
2823    // RISC-V stuff
2824    #[expect(non_upper_case_globals)]
2825    pub const f: Symbol = ascii_letter_digit('f').unwrap();
2826    #[expect(non_upper_case_globals)]
2827    pub const d: Symbol = ascii_letter_digit('d').unwrap();
2828
2829    /// Get the symbol for an integer.
2830    ///
2831    /// The first few non-negative integers each have a static symbol and therefore
2832    /// are fast.
2833    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
2834        if let Result::Ok(idx) = n.try_into() {
2835            if idx < 10 {
2836                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
2837            }
2838        }
2839        let mut buffer = itoa::Buffer::new();
2840        let printed = buffer.format(n);
2841        Symbol::intern(printed)
2842    }
2843
2844    pub const fn ascii_letter_digit(c: char) -> Option<Symbol> {
2845        let i = c as u32;
2846        Option::Some(Symbol::new(match c {
2847            '0'..='9' => super::SYMBOL_DIGITS_BASE + (i - '0' as u32),
2848            'A'..='Z' => super::SYMBOL_UPPERCASE_LETTERS_BASE + (i - 'A' as u32),
2849            'a'..='z' => super::SYMBOL_LOWERCASE_LETTERS_BASE + (i - 'a' as u32),
2850            _ => return Option::None,
2851        }))
2852    }
2853
2854    pub fn character(c: char) -> Symbol {
2855        ascii_letter_digit(c).unwrap_or_else(|| {
2856            let mut buf: [u8; char::MAX_LEN_UTF8] = Default::default();
2857            Symbol::intern(c.encode_utf8(&mut buf))
2858        })
2859    }
2860}
2861
2862impl Symbol {
2863    fn is_special(self) -> bool {
2864        self <= kw::Underscore
2865    }
2866
2867    fn is_used_keyword_always(self) -> bool {
2868        self >= kw::As && self <= kw::While
2869    }
2870
2871    fn is_unused_keyword_always(self) -> bool {
2872        self >= kw::Abstract && self <= kw::Yield
2873    }
2874
2875    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
2876        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
2877    }
2878
2879    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2880        self == kw::Gen && edition().at_least_rust_2024()
2881            || self == kw::Try && edition().at_least_rust_2018()
2882    }
2883
2884    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2885        self.is_special()
2886            || self.is_used_keyword_always()
2887            || self.is_unused_keyword_always()
2888            || self.is_used_keyword_conditional(edition)
2889            || self.is_unused_keyword_conditional(edition)
2890    }
2891
2892    pub fn is_weak(self) -> bool {
2893        self >= kw::Auto && self <= kw::Yeet
2894    }
2895
2896    /// A keyword or reserved identifier that can be used as a path segment.
2897    pub fn is_path_segment_keyword(self) -> bool {
2898        self == kw::Super
2899            || self == kw::SelfLower
2900            || self == kw::SelfUpper
2901            || self == kw::Crate
2902            || self == kw::PathRoot
2903            || self == kw::DollarCrate
2904    }
2905
2906    /// Returns `true` if the symbol is `true` or `false`.
2907    pub fn is_bool_lit(self) -> bool {
2908        self == kw::True || self == kw::False
2909    }
2910
2911    /// Returns `true` if this symbol can be a raw identifier.
2912    pub fn can_be_raw(self) -> bool {
2913        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
2914    }
2915
2916    /// Was this symbol index predefined in the compiler's `symbols!` macro?
2917    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
2918    /// takes a `u32` argument instead of a `&self` argument. Use with care.
2919    pub fn is_predefined(index: u32) -> bool {
2920        index < PREDEFINED_SYMBOLS_COUNT
2921    }
2922}
2923
2924impl Ident {
2925    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
2926    /// unnamed method parameters, crate root module, error recovery etc.
2927    pub fn is_special(self) -> bool {
2928        self.name.is_special()
2929    }
2930
2931    /// Returns `true` if the token is a keyword used in the language.
2932    pub fn is_used_keyword(self) -> bool {
2933        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2934        self.name.is_used_keyword_always()
2935            || self.name.is_used_keyword_conditional(|| self.span.edition())
2936    }
2937
2938    /// Returns `true` if the token is a keyword reserved for possible future use.
2939    pub fn is_unused_keyword(self) -> bool {
2940        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2941        self.name.is_unused_keyword_always()
2942            || self.name.is_unused_keyword_conditional(|| self.span.edition())
2943    }
2944
2945    /// Returns `true` if the token is either a special identifier or a keyword.
2946    pub fn is_reserved(self) -> bool {
2947        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
2948        self.name.is_reserved(|| self.span.edition())
2949    }
2950
2951    /// A keyword or reserved identifier that can be used as a path segment.
2952    pub fn is_path_segment_keyword(self) -> bool {
2953        self.name.is_path_segment_keyword()
2954    }
2955
2956    /// We see this identifier in a normal identifier position, like variable name or a type.
2957    /// How was it written originally? Did it use the raw form? Let's try to guess.
2958    pub fn is_raw_guess(self) -> bool {
2959        self.name.can_be_raw() && self.is_reserved()
2960    }
2961
2962    /// Given the name of a lifetime without the first quote (`'`),
2963    /// returns whether the lifetime name is reserved (therefore invalid)
2964    pub fn is_reserved_lifetime(self) -> bool {
2965        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
2966    }
2967
2968    pub fn is_raw_lifetime_guess(self) -> bool {
2969        // Check that the name isn't just a single quote.
2970        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
2971        if self.name.as_str() == "'" {
2972            return false;
2973        }
2974        let ident_without_apostrophe = self.without_first_quote();
2975        ident_without_apostrophe.name != self.name
2976            && ident_without_apostrophe.name.can_be_raw()
2977            && ident_without_apostrophe.is_reserved_lifetime()
2978    }
2979
2980    pub fn guess_print_mode(self) -> IdentPrintMode {
2981        if self.is_raw_lifetime_guess() {
2982            IdentPrintMode::RawLifetime
2983        } else if self.is_raw_guess() {
2984            IdentPrintMode::RawIdent
2985        } else {
2986            IdentPrintMode::Normal
2987        }
2988    }
2989
2990    /// Whether this would be the identifier for a tuple field like `self.0`, as
2991    /// opposed to a named field like `self.thing`.
2992    pub fn is_numeric(self) -> bool {
2993        self.as_str().bytes().all(|b| b.is_ascii_digit())
2994    }
2995}
2996
2997/// Collect all the keywords in a given edition into a vector.
2998///
2999/// *Note:* Please update this if a new keyword is added beyond the current
3000/// range.
3001pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
3002    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
3003        .filter_map(|kw| {
3004            let kw = Symbol::new(kw);
3005            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
3006                Some(kw)
3007            } else {
3008                None
3009            }
3010        })
3011        .collect()
3012}