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