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