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