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