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