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_hints", "loop_match", "lr", "lt", "m68k",
                        "m68k_target_feature", "mac16", "mach-o",
                        "macro_at_most_once_rep", "macro_attr",
                        "macro_attributes_in_derive_output", "macro_derive",
                        "macro_escape", "macro_export", "macro_guard_matcher",
                        "macro_lifetime_matcher", "macro_literal_matcher",
                        "macro_metavar_expr", "macro_metavar_expr_concat",
                        "macro_reexport", "macro_use", "macro_vis_matcher",
                        "macros_in_extern", "main", "managed_boxes",
                        "manually_drop", "map", "map_err", "marker",
                        "marker_trait_attr", "masked", "match_beginning_vert",
                        "match_default_bindings", "maximum_number_nsz_f16",
                        "maximum_number_nsz_f32", "maximum_number_nsz_f64",
                        "maximum_number_nsz_f128", "maximumf16", "maximumf32",
                        "maximumf64", "maximumf128", "may_dangle", "may_unwind",
                        "maybe_dangling", "maybe_uninit", "maybe_uninit_uninit",
                        "maybe_uninit_zeroed", "mem", "mem_align_const",
                        "mem_discriminant", "mem_drop", "mem_forget",
                        "mem_size_const", "mem_swap", "mem_uninitialized",
                        "mem_variant_count", "mem_zeroed", "member_constraints",
                        "memory", "memtag", "message", "meta", "meta_sized",
                        "metadata_type", "mgca_type_const_syntax",
                        "min_adt_const_params", "min_const_fn",
                        "min_const_generics", "min_const_unsafe_fn",
                        "min_exhaustive_patterns", "min_generic_const_args",
                        "min_specialization", "min_type_alias_impl_trait",
                        "minimum_number_nsz_f16", "minimum_number_nsz_f32",
                        "minimum_number_nsz_f64", "minimum_number_nsz_f128",
                        "minimumf16", "minimumf32", "minimumf64", "minimumf128",
                        "mips", "mips32r6", "mips64", "mips64r6",
                        "mips_target_feature", "mir_assume", "mir_basic_block",
                        "mir_call", "mir_cast_ptr_to_ptr", "mir_cast_transmute",
                        "mir_cast_unsize", "mir_checked", "mir_debuginfo",
                        "mir_discriminant", "mir_drop", "mir_field", "mir_goto",
                        "mir_make_place", "mir_move", "mir_offset",
                        "mir_ptr_metadata", "mir_return", "mir_return_to",
                        "mir_set_discriminant", "mir_static", "mir_static_mut",
                        "mir_storage_dead", "mir_storage_live", "mir_tail_call",
                        "mir_unreachable", "mir_unwind_cleanup",
                        "mir_unwind_continue", "mir_unwind_resume",
                        "mir_unwind_terminate", "mir_unwind_terminate_reason",
                        "mir_unwind_unreachable", "mir_variant", "miri", "misc",
                        "miscsr", "mmx_reg", "modifiers", "module", "module_path",
                        "more_maybe_bounds", "more_qualified_paths",
                        "more_struct_aliases", "movbe_target_feature", "move_expr",
                        "move_ref_pattern", "move_size_limit",
                        "movrs_target_feature", "msp430", "mul", "mul_assign",
                        "mul_with_overflow", "multiple_supertrait_upcastable",
                        "must_not_suspend", "must_use",
                        "mut_preserve_binding_mode_2024", "mut_ref",
                        "mut_restriction", "mutable", "naked", "naked_asm",
                        "naked_functions", "naked_functions_rustic_abi",
                        "naked_functions_target_feature", "name", "names",
                        "native_link_modifiers", "native_link_modifiers_as_needed",
                        "native_link_modifiers_bundle",
                        "native_link_modifiers_verbatim",
                        "native_link_modifiers_whole_archive", "natvis_file", "ne",
                        "needs_allocator", "needs_drop", "needs_panic_runtime",
                        "neg", "negate_unsigned", "negative_bounds",
                        "negative_impls", "neon", "nested", "never",
                        "never_patterns", "never_type", "never_type_fallback",
                        "new", "new_binary", "new_debug", "new_debug_noop",
                        "new_display", "new_lower_exp", "new_lower_hex",
                        "new_octal", "new_pointer", "new_range", "new_unchecked",
                        "new_upper_exp", "new_upper_hex", "next", "niko", "nll",
                        "no", "no_builtins", "no_core", "no_coverage",
                        "no_crate_inject", "no_debug", "no_default_passes",
                        "no_implicit_prelude", "no_inline", "no_link", "no_main",
                        "no_mangle", "no_sanitize", "no_stack_check", "no_std",
                        "nomem", "non_ascii_idents", "non_exhaustive",
                        "non_exhaustive_omitted_patterns_lint",
                        "non_lifetime_binders", "non_modrs_mods", "nonblocking",
                        "none", "nontemporal_store", "noop_method_borrow",
                        "noop_method_clone", "noop_method_deref", "noprefix",
                        "noreturn", "nostack", "not", "notable_trait", "note",
                        "null", "nvptx64", "nvptx_target_feature",
                        "object_safe_for_dispatch", "of", "off", "offload",
                        "offload_kernel", "offset", "offset_of", "offset_of_enum",
                        "offset_of_nested", "offset_of_slice", "ok_or_else",
                        "old_name", "omit_gdb_pretty_printer_section", "on",
                        "on_const", "on_move", "on_type_error", "on_unimplemented",
                        "on_unknown", "on_unmatched_args", "opaque", "<opaque>",
                        "ops", "opt_out_copy", "optimize", "optimize_attribute",
                        "optimized", "optin_builtin_traits", "option", "option_env",
                        "options", "or", "or_patterns", "ord_cmp_method", "other",
                        "out", "output", "overflow_checks",
                        "overlapping_marker_traits", "owned_box", "packed",
                        "packed_bundled_libs", "panic", "panic_2015", "panic_2021",
                        "panic_abort", "panic_bounds_check", "panic_cannot_unwind",
                        "panic_const_add_overflow", "panic_const_async_fn_resumed",
                        "panic_const_async_fn_resumed_drop",
                        "panic_const_async_fn_resumed_panic",
                        "panic_const_async_gen_fn_resumed",
                        "panic_const_async_gen_fn_resumed_drop",
                        "panic_const_async_gen_fn_resumed_panic",
                        "panic_const_coroutine_resumed",
                        "panic_const_coroutine_resumed_drop",
                        "panic_const_coroutine_resumed_panic",
                        "panic_const_div_by_zero", "panic_const_div_overflow",
                        "panic_const_gen_fn_none", "panic_const_gen_fn_none_drop",
                        "panic_const_gen_fn_none_panic", "panic_const_mul_overflow",
                        "panic_const_neg_overflow", "panic_const_rem_by_zero",
                        "panic_const_rem_overflow", "panic_const_shl_overflow",
                        "panic_const_shr_overflow", "panic_const_sub_overflow",
                        "panic_display", "panic_fmt", "panic_handler", "panic_impl",
                        "panic_implementation", "panic_in_cleanup", "panic_info",
                        "panic_invalid_enum_construction", "panic_location",
                        "panic_misaligned_pointer_dereference", "panic_nounwind",
                        "panic_null_pointer_dereference", "panic_runtime",
                        "panic_str_2015", "panic_unwind", "panicking",
                        "param_attrs", "parent_label", "partial_cmp", "partial_ord",
                        "passes", "pat", "pat_param", "patchable_function_entry",
                        "path", "pattern_complexity_limit", "pattern_parentheses",
                        "pattern_type", "pattern_type_range_trait", "pattern_types",
                        "phantom_data", "phase", "pic", "pie", "pin", "pin_drop",
                        "pin_ergonomics", "pin_v2", "platform_intrinsics", "plugin",
                        "plugin_registrar", "plugins", "pointee", "pointee_sized",
                        "pointee_trait", "pointer", "poll", "post-cleanup",
                        "post-lto", "postfix_match", "powerpc", "powerpc64",
                        "powerpc_target_feature", "powf16", "powf32", "powf64",
                        "powf128", "powif16", "powif32", "powif64", "powif128",
                        "pre-lto", "precise_capturing",
                        "precise_capturing_in_traits",
                        "precise_pointer_size_matching", "predicates",
                        "pref_align_of", "prefetch_read_data",
                        "prefetch_read_instruction", "prefetch_write_data",
                        "prefetch_write_instruction", "prefix_nops", "preg",
                        "prelude", "prelude_import", "preserves_flags",
                        "prfchw_target_feature", "prid", "primitive", "proc-macro",
                        "proc_macro", "proc_macro_attribute", "proc_macro_derive",
                        "proc_macro_expr", "proc_macro_gen", "proc_macro_hygiene",
                        "proc_macro_internals", "proc_macro_mod",
                        "proc_macro_non_items", "proc_macro_path_invoc",
                        "profiler_runtime", "ptr", "ptr_cast", "ptr_cast_const",
                        "ptr_cast_mut", "ptr_const_is_null", "ptr_copy",
                        "ptr_copy_nonoverlapping", "ptr_from_ref",
                        "ptr_guaranteed_cmp", "ptr_is_null", "ptr_mask",
                        "ptr_metadata", "ptr_null", "ptr_null_mut",
                        "ptr_offset_from", "ptr_offset_from_unsigned", "ptr_read",
                        "ptr_read_unaligned", "ptr_replace", "ptr_swap",
                        "ptr_swap_nonoverlapping", "ptr_write", "ptr_write_bytes",
                        "ptr_write_unaligned", "ptr_write_volatile",
                        "pub_macro_rules", "pub_restricted", "public", "pure",
                        "pushpop_unsafe", "qreg", "qreg_low4", "qreg_low8",
                        "quad_precision_float", "question_mark", "quote",
                        "range_inclusive_new", "raw-dylib", "raw_dylib",
                        "raw_dylib_elf", "raw_eq", "raw_identifiers", "raw_ref_op",
                        "re_rebalance_coherence", "read_via_copy", "readonly",
                        "realloc", "realtime", "reason", "reborrow", "receiver",
                        "receiver_target", "recursion_limit",
                        "reexport_test_harness_main", "ref_pat_eat_one_layer_2024",
                        "ref_pat_eat_one_layer_2024_structural",
                        "ref_pat_everywhere", "ref_unwind_safe_trait", "reference",
                        "reflect", "reg", "reg16", "reg32", "reg64", "reg_abcd",
                        "reg_addr", "reg_byte", "reg_data", "reg_iw", "reg_nonzero",
                        "reg_pair", "reg_ptr", "reg_upper", "register_attr",
                        "register_tool", "relaxed_adts", "relaxed_struct_unsize",
                        "relocation_model", "rem", "rem_assign", "repr", "repr128",
                        "repr_align", "repr_align_enum", "repr_packed", "repr_simd",
                        "repr_transparent", "require", "reserve-x18", "residual",
                        "result", "result_ffi_guarantees", "return_address",
                        "return_position_impl_trait_in_trait",
                        "return_type_notation", "riscv32", "riscv64",
                        "riscv_target_feature", "rlib", "ropi", "ropi-rwpi",
                        "rotate_left", "rotate_right", "round_ties_even_f16",
                        "round_ties_even_f32", "round_ties_even_f64",
                        "round_ties_even_f128", "roundf16", "roundf32", "roundf64",
                        "roundf128", "rtm_target_feature", "runtime", "rust",
                        "rust_2015", "rust_2018", "rust_2018_preview", "rust_2021",
                        "rust_2024", "rust_analyzer", "rust_begin_unwind",
                        "rust_cold_cc", "rust_eh_personality", "rust_future",
                        "rust_logo", "rust_out", "rust_preserve_none_cc",
                        "rust_tail_cc", "rustc", "rustc_abi", "rustc_align",
                        "rustc_align_static", "rustc_allocator",
                        "rustc_allocator_zeroed", "rustc_allocator_zeroed_variant",
                        "rustc_allow_const_fn_unstable",
                        "rustc_allow_incoherent_impl",
                        "rustc_allowed_through_unstable_modules", "rustc_as_ptr",
                        "rustc_attrs", "rustc_autodiff", "rustc_builtin_macro",
                        "rustc_capture_analysis", "rustc_clean",
                        "rustc_coherence_is_core", "rustc_coinductive",
                        "rustc_comptime", "rustc_confusables", "rustc_const_stable",
                        "rustc_const_stable_indirect", "rustc_const_unstable",
                        "rustc_conversion_suggestion", "rustc_deallocator",
                        "rustc_default_body_unstable",
                        "rustc_delayed_bug_from_inside_query",
                        "rustc_deny_explicit_impl", "rustc_deprecated_safe_2024",
                        "rustc_diagnostic_item", "rustc_diagnostic_macros",
                        "rustc_do_not_const_check", "rustc_doc_primitive",
                        "rustc_driver", "rustc_dummy", "rustc_dump_def_parents",
                        "rustc_dump_def_path", "rustc_dump_hidden_type_of_opaques",
                        "rustc_dump_inferred_outlives", "rustc_dump_item_bounds",
                        "rustc_dump_layout", "rustc_dump_object_lifetime_defaults",
                        "rustc_dump_predicates", "rustc_dump_symbol_name",
                        "rustc_dump_user_args", "rustc_dump_variances",
                        "rustc_dump_variances_of_opaques", "rustc_dump_vtable",
                        "rustc_dyn_incompatible_trait",
                        "rustc_effective_visibility", "rustc_eii_foreign_item",
                        "rustc_evaluate_where_clauses", "rustc_expected_cgu_reuse",
                        "rustc_force_inline", "rustc_has_incoherent_inherent_impls",
                        "rustc_if_this_changed", "rustc_inherit_overflow_checks",
                        "rustc_insignificant_dtor", "rustc_intrinsic",
                        "rustc_intrinsic_const_stable_indirect",
                        "rustc_legacy_const_generics",
                        "rustc_lint_opt_deny_field_access", "rustc_lint_opt_ty",
                        "rustc_lint_query_instability",
                        "rustc_lint_untracked_query_information",
                        "rustc_macro_transparency", "rustc_main", "rustc_mir",
                        "rustc_must_implement_one_of",
                        "rustc_must_match_exhaustively",
                        "rustc_never_returns_null_ptr", "rustc_never_type_options",
                        "rustc_no_implicit_autorefs", "rustc_no_implicit_bounds",
                        "rustc_no_mir_inline", "rustc_no_writable",
                        "rustc_non_const_trait_method",
                        "rustc_nonnull_optimization_guaranteed", "rustc_nounwind",
                        "rustc_objc_class", "rustc_objc_selector",
                        "rustc_offload_kernel", "rustc_on_unimplemented",
                        "rustc_paren_sugar", "rustc_partition_codegened",
                        "rustc_partition_reused", "rustc_pass_by_value",
                        "rustc_pass_indirectly_in_non_rustic_abis", "rustc_peek",
                        "rustc_peek_liveness", "rustc_peek_maybe_init",
                        "rustc_peek_maybe_uninit", "rustc_preserve_ub_checks",
                        "rustc_private", "rustc_proc_macro_decls",
                        "rustc_promotable", "rustc_pub_transparent",
                        "rustc_reallocator", "rustc_regions",
                        "rustc_reservation_impl", "rustc_scalable_vector",
                        "rustc_should_not_be_called_on_const_items",
                        "rustc_simd_monomorphize_lane_limit",
                        "rustc_skip_during_method_dispatch",
                        "rustc_specialization_trait", "rustc_std_internal_symbol",
                        "rustc_strict_coherence", "rustc_test_marker",
                        "rustc_then_this_would_need", "rustc_trivial_field_reads",
                        "rustc_unsafe_specialization_marker", "rustdoc",
                        "rustdoc_internals", "rustdoc_missing_doc_code_examples",
                        "rustfmt", "rvalue_static_promotion", "rvector", "rwpi",
                        "s32c1i", "s390x", "s390x_target_feature",
                        "s390x_target_feature_vector", "safety", "sanitize",
                        "sanitizer_cfi_generalize_pointers",
                        "sanitizer_cfi_normalize_integers", "sanitizer_runtime",
                        "saturating_add", "saturating_sub", "sdylib",
                        "search_unbox", "select_unpredictable", "self_in_typedefs",
                        "self_struct_ctor", "semiopaque", "sgpr32", "sgpr64",
                        "sgpr96", "sgpr128", "sgpr256", "sgpr512", "sha2", "sha3",
                        "sha512_sm_x86", "shadow_call_stack", "shallow", "shl",
                        "shl_assign", "shorter_tail_lifetimes", "should_panic",
                        "show", "shr", "shr_assign", "signed", "simd", "simd_add",
                        "simd_and", "simd_arith_offset", "simd_as", "simd_bitmask",
                        "simd_bitreverse", "simd_bswap", "simd_carryless_mul",
                        "simd_cast", "simd_cast_ptr", "simd_ceil", "simd_ctlz",
                        "simd_ctpop", "simd_cttz", "simd_div", "simd_eq",
                        "simd_expose_provenance", "simd_extract",
                        "simd_extract_dyn", "simd_fabs", "simd_fcos", "simd_fexp",
                        "simd_fexp2", "simd_ffi", "simd_flog", "simd_flog2",
                        "simd_flog10", "simd_floor", "simd_fma", "simd_fsin",
                        "simd_fsqrt", "simd_funnel_shl", "simd_funnel_shr",
                        "simd_gather", "simd_ge", "simd_gt", "simd_insert",
                        "simd_insert_dyn", "simd_le", "simd_lt", "simd_masked_load",
                        "simd_masked_store", "simd_maximum_number_nsz",
                        "simd_minimum_number_nsz", "simd_mul", "simd_ne",
                        "simd_neg", "simd_or", "simd_reduce_add_ordered",
                        "simd_reduce_add_unordered", "simd_reduce_all",
                        "simd_reduce_and", "simd_reduce_any", "simd_reduce_max",
                        "simd_reduce_min", "simd_reduce_mul_ordered",
                        "simd_reduce_mul_unordered", "simd_reduce_or",
                        "simd_reduce_xor", "simd_relaxed_fma", "simd_rem",
                        "simd_round", "simd_round_ties_even", "simd_saturating_add",
                        "simd_saturating_sub", "simd_scatter", "simd_select",
                        "simd_select_bitmask", "simd_shl", "simd_shr",
                        "simd_shuffle", "simd_shuffle_const_generic", "simd_splat",
                        "simd_sub", "simd_trunc", "simd_with_exposed_provenance",
                        "simd_xor", "since", "sinf16", "sinf32", "sinf64",
                        "sinf128", "size", "size_of", "size_of_type_id",
                        "size_of_val", "sized", "sized_hierarchy", "slice",
                        "slice_from_raw_parts", "slice_from_raw_parts_mut",
                        "slice_get_unchecked", "slice_len_fn", "slice_patterns",
                        "slicing_syntax", "soft-float", "sparc", "sparc64",
                        "sparc_target_feature", "spe_acc", "specialization",
                        "speed", "spirv", "splat", "spotlight", "sqrtf16",
                        "sqrtf32", "sqrtf64", "sqrtf128", "sreg", "sreg_low16",
                        "sse", "sse2", "sse4a_target_feature", "stable",
                        "staged_api", "start", "state", "static_align",
                        "static_in_const", "static_nobundle", "static_recursion",
                        "staticlib", "std", "std_lib_injection", "std_panic",
                        "std_panic_2015_macro", "std_panic_macro", "stmt",
                        "stmt_expr_attributes", "stop_after_dataflow", "store",
                        "str", "str_from_utf8", "str_from_utf8_mut",
                        "str_from_utf8_unchecked", "str_from_utf8_unchecked_mut",
                        "str_inherent_from_utf8", "str_inherent_from_utf8_mut",
                        "str_inherent_from_utf8_unchecked",
                        "str_inherent_from_utf8_unchecked_mut",
                        "strict_provenance_lints", "string_deref_patterns",
                        "stringify", "struct_field_attributes", "struct_inherit",
                        "struct_variant", "structural_match", "structural_peq",
                        "sub", "sub_assign", "sub_with_overflow", "suggestion",
                        "super_let", "supertrait_item_shadowing", "sve_cast",
                        "sve_tuple_create2", "sve_tuple_create3",
                        "sve_tuple_create4", "sve_tuple_get", "sve_tuple_set",
                        "sym", "sync", "synthetic", "t32", "target", "target_abi",
                        "target_arch", "target_endian", "target_env",
                        "target_family", "target_feature", "target_feature_11",
                        "target_feature_inline_always", "target_has_atomic",
                        "target_has_atomic_load_store",
                        "target_has_atomic_primitive_alignment",
                        "target_has_reliable_f16", "target_has_reliable_f16_math",
                        "target_has_reliable_f128", "target_has_reliable_f128_math",
                        "target_object_format", "target_os", "target_pointer_width",
                        "target_thread_local", "target_vendor",
                        "tbm_target_feature", "termination", "termination_trait",
                        "termination_trait_test", "test", "test_2018_feature",
                        "test_accepted_feature", "test_case",
                        "test_incomplete_feature", "test_removed_feature",
                        "test_runner", "test_unstable_lint", "thread",
                        "thread_local", "threadptr", "three_way_compare", "thumb2",
                        "thumb-mode", "time", "tmm_reg", "to_owned_method",
                        "to_string", "to_vec", "tool_attributes", "tool_lints",
                        "trace_macros", "track_caller", "trait_alias", "trait_ty",
                        "trait_upcasting", "transmute", "transmute_generic_consts",
                        "transmute_opts", "transmute_trait", "transmute_unchecked",
                        "transparent", "transparent_enums", "transparent_unions",
                        "trivial_bounds", "trivial_clone", "truncf16", "truncf32",
                        "truncf64", "truncf128", "try_blocks",
                        "try_blocks_heterogeneous", "try_capture", "try_from",
                        "try_into", "try_trait_v2", "try_trait_v2_residual",
                        "try_update", "tt", "tuple", "tuple_indexing",
                        "tuple_trait", "two_phase", "ty",
                        "type_alias_enum_variants", "type_alias_impl_trait",
                        "type_ascribe", "type_ascription",
                        "type_changing_struct_update", "type_id", "type_id_eq",
                        "type_id_field_representing_type", "type_id_fields",
                        "type_id_variants", "type_id_vtable", "type_info",
                        "type_ir", "type_ir_infer_ctxt_like", "type_ir_inherent",
                        "type_ir_interner", "type_length_limit", "type_macros",
                        "type_name", "type_of", "type_privacy_lints",
                        "typed_swap_nonoverlapping", "u8", "u8_legacy_const_max",
                        "u8_legacy_const_min", "u8_legacy_fn_max_value",
                        "u8_legacy_fn_min_value", "u8_legacy_mod", "u16",
                        "u16_legacy_const_max", "u16_legacy_const_min",
                        "u16_legacy_fn_max_value", "u16_legacy_fn_min_value",
                        "u16_legacy_mod", "u32", "u32_legacy_const_max",
                        "u32_legacy_const_min", "u32_legacy_fn_max_value",
                        "u32_legacy_fn_min_value", "u32_legacy_mod", "u64",
                        "u64_legacy_const_max", "u64_legacy_const_min",
                        "u64_legacy_fn_max_value", "u64_legacy_fn_min_value",
                        "u64_legacy_mod", "u128", "u128_legacy_const_max",
                        "u128_legacy_const_min", "u128_legacy_fn_max_value",
                        "u128_legacy_fn_min_value", "u128_legacy_mod", "ub_checks",
                        "unaligned_volatile_load", "unaligned_volatile_store",
                        "unboxed_closures", "unchecked_add", "unchecked_div",
                        "unchecked_funnel_shl", "unchecked_funnel_shr",
                        "unchecked_mul", "unchecked_rem", "unchecked_shl",
                        "unchecked_shr", "unchecked_sub", "undecorated",
                        "underscore_const_names", "underscore_imports",
                        "underscore_lifetimes", "uniform_paths", "unimplemented",
                        "unit", "universal_impl_trait", "unix", "unlikely",
                        "unmarked_api", "unnamed_enum_variants", "unnamed_fields",
                        "unpin", "unqualified_local_imports", "unreachable",
                        "unreachable_2015", "unreachable_2015_macro",
                        "unreachable_2021", "unreachable_code",
                        "unreachable_display", "unreachable_macro",
                        "unrestricted_attribute_tokens", "unroll",
                        "unsafe_attributes", "unsafe_binders",
                        "unsafe_block_in_unsafe_fn", "unsafe_cell",
                        "unsafe_cell_raw_get", "unsafe_eii", "unsafe_extern_blocks",
                        "unsafe_fields", "unsafe_no_drop_flag", "unsafe_pinned",
                        "unsafe_unpin", "unsafety", "unsize",
                        "unsized_const_param_ty", "unsized_const_params",
                        "unsized_fn_params", "unsized_locals",
                        "unsized_tuple_coercion", "unstable",
                        "unstable_feature_bound",
                        "this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead?",
                        "unstable_removed", "untagged_unions", "unused_imports",
                        "unwind", "unwind_attributes", "unwind_safe_trait",
                        "unwrap", "unwrap_binder", "unwrap_or", "update",
                        "use_cloned", "use_extern_macros", "use_nested_groups",
                        "used", "used_with_arg", "using", "usize",
                        "usize_legacy_const_max", "usize_legacy_const_min",
                        "usize_legacy_fn_max_value", "usize_legacy_fn_min_value",
                        "usize_legacy_mod", "v1", "v8plus", "va_arg", "va_arg_safe",
                        "va_copy", "va_end", "va_list", "va_start", "val",
                        "validity", "value", "values", "var", "variadic",
                        "variant_count", "variants", "vec", "vector", "verbatim",
                        "version", "vfp2", "vgpr16", "vgpr32", "vgpr64", "vgpr96",
                        "vgpr128", "vgpr160", "vgpr192", "vgpr224", "vgpr256",
                        "vgpr288", "vgpr320", "vgpr352", "vgpr384", "vgpr512",
                        "vgpr1024", "view_types", "vis", "visible_private_types",
                        "volatile", "volatile_copy_memory",
                        "volatile_copy_nonoverlapping_memory", "volatile_load",
                        "volatile_set_memory", "volatile_store", "vreg",
                        "vreg_low16", "vreg_pair", "vsreg", "vsx", "vtable_align",
                        "vtable_size", "warn", "wasip2", "wasm", "wasm32", "wasm64",
                        "wasm_abi", "wasm_import_module", "wasm_target_feature",
                        "weak", "weak_odr", "where_clause_attrs", "while_let",
                        "whole-archive", "width", "windowed", "windows",
                        "windows_subsystem", "with_negative_coherence",
                        "wrap_binder", "wrapping_add", "wrapping_div",
                        "wrapping_mul", "wrapping_rem", "wrapping_rem_euclid",
                        "wrapping_sub", "wreg", "write_box_via_move", "write_bytes",
                        "write_fmt", "write_macro", "write_str", "write_via_move",
                        "writeln_macro", "x86", "x86_64", "x86_amx_intrinsics",
                        "x87_reg", "x87_target_feature", "xcoff", "xer", "xloop",
                        "xmm_reg", "xop_target_feature", "xtensa",
                        "xtensa_target_feature", "yeet_desugar_details",
                        "yeet_expr", "yes", "yield_expr", "ymm_reg", "yreg", "zca",
                        "zfh", "zfhmin", "zmm_reg", "ztso", "0", "1", "2", "3", "4",
                        "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G",
                        "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S",
                        "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e",
                        "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q",
                        "r", "s", "t", "u", "v", "w", "x", "y", "z",
                        "1.98.0-nightly"], extra_symbols)
    }
}symbols! {
23    // This list includes things that are definitely keywords (e.g. `if`), a
24    // few things that are definitely not keywords (e.g. `{{root}}`) and things
25    // where there is disagreement between people and/or documents (such as the
26    // Rust Reference) about whether it is a keyword (e.g. `_`).
27    //
28    // If you modify this list, adjust any relevant `Symbol::{is,can_be}_*`
29    // predicates and `used_keywords`. Also consider adding new keywords to the
30    // `ui/parser/raw/raw-idents.rs` test.
31    Keywords {
32        // Special reserved identifiers used internally for unnamed method
33        // parameters, crate root module, etc.
34        // Matching predicates: `is_special`/`is_reserved`
35        //
36        // tidy-alphabetical-start
37        DollarCrate:        "$crate",
38        PathRoot:           "{{root}}",
39        Underscore:         "_",
40        // tidy-alphabetical-end
41
42        // Keywords that are used in stable Rust.
43        // Matching predicates: `is_used_keyword_always`/`is_reserved`
44        // tidy-alphabetical-start
45        As:                 "as",
46        Break:              "break",
47        Const:              "const",
48        Continue:           "continue",
49        Crate:              "crate",
50        Else:               "else",
51        Enum:               "enum",
52        Extern:             "extern",
53        False:              "false",
54        Fn:                 "fn",
55        For:                "for",
56        If:                 "if",
57        Impl:               "impl",
58        In:                 "in",
59        Let:                "let",
60        Loop:               "loop",
61        Match:              "match",
62        Mod:                "mod",
63        Move:               "move",
64        Mut:                "mut",
65        Pub:                "pub",
66        Ref:                "ref",
67        Return:             "return",
68        SelfLower:          "self",
69        SelfUpper:          "Self",
70        Static:             "static",
71        Struct:             "struct",
72        Super:              "super",
73        Trait:              "trait",
74        True:               "true",
75        Type:               "type",
76        Unsafe:             "unsafe",
77        Use:                "use",
78        Where:              "where",
79        While:              "while",
80        // tidy-alphabetical-end
81
82        // Keywords that are used in unstable Rust or reserved for future use.
83        // Matching predicates: `is_unused_keyword_always`/`is_reserved`
84        // tidy-alphabetical-start
85        Abstract:           "abstract",
86        Become:             "become",
87        Box:                "box",
88        Do:                 "do",
89        Final:              "final",
90        Macro:              "macro",
91        Override:           "override",
92        Priv:               "priv",
93        Typeof:             "typeof",
94        Unsized:            "unsized",
95        Virtual:            "virtual",
96        Yield:              "yield",
97        // tidy-alphabetical-end
98
99        // Edition-specific keywords that are used in stable Rust.
100        // Matching predicates: `is_used_keyword_conditional`/`is_reserved` (if
101        // the edition suffices)
102        // tidy-alphabetical-start
103        Async:              "async", // >= 2018 Edition only
104        Await:              "await", // >= 2018 Edition only
105        Dyn:                "dyn", // >= 2018 Edition only
106        // tidy-alphabetical-end
107
108        // Edition-specific keywords that are used in unstable Rust or reserved for future use.
109        // Matching predicates: `is_unused_keyword_conditional`/`is_reserved` (if
110        // the edition suffices)
111        // tidy-alphabetical-start
112        Gen:                "gen", // >= 2024 Edition only
113        Try:                "try", // >= 2018 Edition only
114        // tidy-alphabetical-end
115
116        // "Lifetime keywords": regular keywords with a leading `'`.
117        // Matching predicates: none
118        // tidy-alphabetical-start
119        StaticLifetime:     "'static",
120        UnderscoreLifetime: "'_",
121        // tidy-alphabetical-end
122
123        // Weak keywords, have special meaning only in specific contexts.
124        // Matching predicates: `is_weak`
125        // tidy-alphabetical-start
126        Auto:               "auto",
127        Builtin:            "builtin",
128        Catch:              "catch",
129        ContractEnsures:    "contract_ensures",
130        ContractRequires:   "contract_requires",
131        Default:            "default",
132        MacroRules:         "macro_rules",
133        Raw:                "raw",
134        Reuse:              "reuse",
135        Safe:               "safe",
136        Union:              "union",
137        Yeet:               "yeet",
138        // tidy-alphabetical-end
139    }
140
141    // Pre-interned symbols that can be referred to with `rustc_span::sym::*`.
142    //
143    // The symbol is the stringified identifier unless otherwise specified, in
144    // which case the name should mention the non-identifier punctuation.
145    // E.g. `sym::proc_dash_macro` represents "proc-macro", and it shouldn't be
146    // called `sym::proc_macro` because then it's easy to mistakenly think it
147    // represents "proc_macro".
148    //
149    // As well as the symbols listed, there are symbols for the strings
150    // "0", "1", ..., "9", which are accessible via `sym::integer`.
151    //
152    // There is currently no checking that all symbols are used; that would be
153    // nice to have.
154    Symbols {
155        // tidy-alphabetical-start
156        Abi,
157        AcqRel,
158        Acquire,
159        Active,
160        ActiveOnly,
161        Alignment,
162        Arc,
163        ArcWeak,
164        Array,
165        AsMut,
166        AsRef,
167        AssertParamIsClone,
168        AssertParamIsCopy,
169        AssertParamIsEq,
170        AsyncGenFinished,
171        AsyncGenPending,
172        AsyncGenReady,
173        Atomic,
174        BTreeMap,
175        Bool,
176        Borrow,
177        BorrowMut,
178        Break,
179        BuildHasher,
180        CStr,
181        CallOnceFuture,
182        CallRefFuture,
183        Capture,
184        Cell,
185        Char,
186        Cleanup,
187        Client,
188        Clone,
189        CoercePointee,
190        CoercePointeeValidated,
191        CoerceUnsized,
192        Const,
193        ConstParamTy,
194        ConstParamTy_,
195        Context,
196        Continue,
197        ControlFlow,
198        Copy,
199        Cow,
200        Debug,
201        Default,
202        Deref,
203        DispatchFromDyn,
204        Display,
205        Dual,
206        DualOnly,
207        Dualv,
208        DualvOnly,
209        Duplicated,
210        DuplicatedOnly,
211        DynTrait,
212        Enum,
213        Eq,
214        Equal,
215        Err,
216        Expected,
217        ExternC,
218        ExternRust,
219        Float,
220        FmtArgumentsNew,
221        Fn,
222        FnMut,
223        FnOnce,
224        FnPtr,
225        Formatter,
226        Forward,
227        Found,
228        From,
229        FromIterator,
230        FromResidual,
231        GlobalAlloc,
232        Hash,
233        HashMap,
234        HashSet,
235        Hasher,
236        InCleanup,
237        IndexOutput,
238        Input,
239        Int,
240        Into,
241        IntoFuture,
242        IntoIterator,
243        IntoIteratorItem,
244        IoBufReader,
245        IrTyKind,
246        Item,
247        ItemContext,
248        Iterator,
249        IteratorItem,
250        IteratorMap,
251        Layout,
252        Lifetime,
253        LintPass,
254        LocalKey,
255        Mutex,
256        MutexGuard,
257        Named,
258        NonNull,
259        NonZero,
260        None,
261        Normal,
262        Ok,
263        Option,
264        Ord,
265        Ordering,
266        Other,
267        Output,
268        ParamSet,
269        PartialEq,
270        PartialOrd,
271        Pending,
272        PinDerefMutHelper,
273        Pointer,
274        Poll,
275        Range,
276        RangeCopy,
277        RangeFrom,
278        RangeFromCopy,
279        RangeFull,
280        RangeInclusive,
281        RangeInclusiveCopy,
282        RangeMax,
283        RangeMin,
284        RangeSub,
285        RangeTo,
286        RangeToInclusive,
287        RangeToInclusiveCopy,
288        Rc,
289        RcWeak,
290        Ready,
291        Reborrow,
292        RefCell,
293        Reference,
294        Relaxed,
295        Release,
296        Result,
297        ResumeTy,
298        Reverse,
299        Rust,
300        // Temporary name for the rust_embed hack introduced in #145108
301        RustEmbed,
302        RustaceansAreAwesome,
303        RwLock,
304        RwLockReadGuard,
305        RwLockWriteGuard,
306        SelfTy,
307        Send,
308        SeqCst,
309        Sized,
310        Slice,
311        SliceIndex,
312        Some,
313        Source,
314        SpanCtxt,
315        StdinLock,
316        Str,
317        String,
318        Struct,
319        StructuralPartialEq,
320        SymbolIntern,
321        Sync,
322        SyncUnsafeCell,
323        Target,
324        This,
325        TokenStream,
326        TrivialClone,
327        Try,
328        TryCaptureGeneric,
329        TryCapturePrintable,
330        TryFrom,
331        TryInto,
332        Tuple,
333        Ty,
334        TyCtxt,
335        TyKind,
336        Type,
337        Union,
338        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_hints,
1222        loop_match,
1223        lr,
1224        lt,
1225        m68k,
1226        m68k_target_feature,
1227        mac16,
1228        macho: "mach-o",
1229        macro_at_most_once_rep,
1230        macro_attr,
1231        macro_attributes_in_derive_output,
1232        macro_derive,
1233        macro_escape,
1234        macro_export,
1235        macro_guard_matcher,
1236        macro_lifetime_matcher,
1237        macro_literal_matcher,
1238        macro_metavar_expr,
1239        macro_metavar_expr_concat,
1240        macro_reexport,
1241        macro_use,
1242        macro_vis_matcher,
1243        macros_in_extern,
1244        main,
1245        managed_boxes,
1246        manually_drop,
1247        map,
1248        map_err,
1249        marker,
1250        marker_trait_attr,
1251        masked,
1252        match_beginning_vert,
1253        match_default_bindings,
1254        maximum_number_nsz_f16,
1255        maximum_number_nsz_f32,
1256        maximum_number_nsz_f64,
1257        maximum_number_nsz_f128,
1258        maximumf16,
1259        maximumf32,
1260        maximumf64,
1261        maximumf128,
1262        may_dangle,
1263        may_unwind,
1264        maybe_dangling,
1265        maybe_uninit,
1266        maybe_uninit_uninit,
1267        maybe_uninit_zeroed,
1268        mem,
1269        mem_align_const,
1270        mem_discriminant,
1271        mem_drop,
1272        mem_forget,
1273        mem_size_const,
1274        mem_swap,
1275        mem_uninitialized,
1276        mem_variant_count,
1277        mem_zeroed,
1278        member_constraints,
1279        memory,
1280        memtag,
1281        message,
1282        meta,
1283        meta_sized,
1284        metadata_type,
1285        mgca_type_const_syntax,
1286        min_adt_const_params,
1287        min_const_fn,
1288        min_const_generics,
1289        min_const_unsafe_fn,
1290        min_exhaustive_patterns,
1291        min_generic_const_args,
1292        min_specialization,
1293        min_type_alias_impl_trait,
1294        minimum_number_nsz_f16,
1295        minimum_number_nsz_f32,
1296        minimum_number_nsz_f64,
1297        minimum_number_nsz_f128,
1298        minimumf16,
1299        minimumf32,
1300        minimumf64,
1301        minimumf128,
1302        mips,
1303        mips32r6,
1304        mips64,
1305        mips64r6,
1306        mips_target_feature,
1307        mir_assume,
1308        mir_basic_block,
1309        mir_call,
1310        mir_cast_ptr_to_ptr,
1311        mir_cast_transmute,
1312        mir_cast_unsize,
1313        mir_checked,
1314        mir_debuginfo,
1315        mir_discriminant,
1316        mir_drop,
1317        mir_field,
1318        mir_goto,
1319        mir_make_place,
1320        mir_move,
1321        mir_offset,
1322        mir_ptr_metadata,
1323        mir_return,
1324        mir_return_to,
1325        mir_set_discriminant,
1326        mir_static,
1327        mir_static_mut,
1328        mir_storage_dead,
1329        mir_storage_live,
1330        mir_tail_call,
1331        mir_unreachable,
1332        mir_unwind_cleanup,
1333        mir_unwind_continue,
1334        mir_unwind_resume,
1335        mir_unwind_terminate,
1336        mir_unwind_terminate_reason,
1337        mir_unwind_unreachable,
1338        mir_variant,
1339        miri,
1340        misc,
1341        miscsr,
1342        mmx_reg,
1343        modifiers,
1344        module,
1345        module_path,
1346        more_maybe_bounds,
1347        more_qualified_paths,
1348        more_struct_aliases,
1349        movbe_target_feature,
1350        move_expr,
1351        move_ref_pattern,
1352        move_size_limit,
1353        movrs_target_feature,
1354        msp430,
1355        mul,
1356        mul_assign,
1357        mul_with_overflow,
1358        multiple_supertrait_upcastable,
1359        must_not_suspend,
1360        must_use,
1361        mut_preserve_binding_mode_2024,
1362        mut_ref,
1363        mut_restriction,
1364        mutable,
1365        naked,
1366        naked_asm,
1367        naked_functions,
1368        naked_functions_rustic_abi,
1369        naked_functions_target_feature,
1370        name,
1371        names,
1372        native_link_modifiers,
1373        native_link_modifiers_as_needed,
1374        native_link_modifiers_bundle,
1375        native_link_modifiers_verbatim,
1376        native_link_modifiers_whole_archive,
1377        natvis_file,
1378        ne,
1379        needs_allocator,
1380        needs_drop,
1381        needs_panic_runtime,
1382        neg,
1383        negate_unsigned,
1384        negative_bounds,
1385        negative_impls,
1386        neon,
1387        nested,
1388        never,
1389        never_patterns,
1390        never_type,
1391        never_type_fallback,
1392        new,
1393        new_binary,
1394        new_debug,
1395        new_debug_noop,
1396        new_display,
1397        new_lower_exp,
1398        new_lower_hex,
1399        new_octal,
1400        new_pointer,
1401        new_range,
1402        new_unchecked,
1403        new_upper_exp,
1404        new_upper_hex,
1405        next,
1406        niko,
1407        nll,
1408        no,
1409        no_builtins,
1410        no_core,
1411        no_coverage,
1412        no_crate_inject,
1413        no_debug,
1414        no_default_passes,
1415        no_implicit_prelude,
1416        no_inline,
1417        no_link,
1418        no_main,
1419        no_mangle,
1420        no_sanitize,
1421        no_stack_check,
1422        no_std,
1423        nomem,
1424        non_ascii_idents,
1425        non_exhaustive,
1426        non_exhaustive_omitted_patterns_lint,
1427        non_lifetime_binders,
1428        non_modrs_mods,
1429        nonblocking,
1430        none,
1431        nontemporal_store,
1432        noop_method_borrow,
1433        noop_method_clone,
1434        noop_method_deref,
1435        noprefix,
1436        noreturn,
1437        nostack,
1438        not,
1439        notable_trait,
1440        note,
1441        null,
1442        nvptx64,
1443        nvptx_target_feature,
1444        object_safe_for_dispatch,
1445        of,
1446        off,
1447        offload,
1448        offload_kernel,
1449        offset,
1450        offset_of,
1451        offset_of_enum,
1452        offset_of_nested,
1453        offset_of_slice,
1454        ok_or_else,
1455        old_name,
1456        omit_gdb_pretty_printer_section,
1457        on,
1458        on_const,
1459        on_move,
1460        on_type_error,
1461        on_unimplemented,
1462        on_unknown,
1463        on_unmatched_args,
1464        opaque,
1465        opaque_module_name_placeholder: "<opaque>",
1466        ops,
1467        opt_out_copy,
1468        optimize,
1469        optimize_attribute,
1470        optimized,
1471        optin_builtin_traits,
1472        option,
1473        option_env,
1474        options,
1475        or,
1476        or_patterns,
1477        ord_cmp_method,
1478        other,
1479        out,
1480        output,
1481        overflow_checks,
1482        overlapping_marker_traits,
1483        owned_box,
1484        packed,
1485        packed_bundled_libs,
1486        panic,
1487        panic_2015,
1488        panic_2021,
1489        panic_abort,
1490        panic_bounds_check,
1491        panic_cannot_unwind,
1492        panic_const_add_overflow,
1493        panic_const_async_fn_resumed,
1494        panic_const_async_fn_resumed_drop,
1495        panic_const_async_fn_resumed_panic,
1496        panic_const_async_gen_fn_resumed,
1497        panic_const_async_gen_fn_resumed_drop,
1498        panic_const_async_gen_fn_resumed_panic,
1499        panic_const_coroutine_resumed,
1500        panic_const_coroutine_resumed_drop,
1501        panic_const_coroutine_resumed_panic,
1502        panic_const_div_by_zero,
1503        panic_const_div_overflow,
1504        panic_const_gen_fn_none,
1505        panic_const_gen_fn_none_drop,
1506        panic_const_gen_fn_none_panic,
1507        panic_const_mul_overflow,
1508        panic_const_neg_overflow,
1509        panic_const_rem_by_zero,
1510        panic_const_rem_overflow,
1511        panic_const_shl_overflow,
1512        panic_const_shr_overflow,
1513        panic_const_sub_overflow,
1514        panic_display,
1515        panic_fmt,
1516        panic_handler,
1517        panic_impl,
1518        panic_implementation,
1519        panic_in_cleanup,
1520        panic_info,
1521        panic_invalid_enum_construction,
1522        panic_location,
1523        panic_misaligned_pointer_dereference,
1524        panic_nounwind,
1525        panic_null_pointer_dereference,
1526        panic_runtime,
1527        panic_str_2015,
1528        panic_unwind,
1529        panicking,
1530        param_attrs,
1531        parent_label,
1532        partial_cmp,
1533        partial_ord,
1534        passes,
1535        pat,
1536        pat_param,
1537        patchable_function_entry,
1538        path,
1539        pattern_complexity_limit,
1540        pattern_parentheses,
1541        pattern_type,
1542        pattern_type_range_trait,
1543        pattern_types,
1544        phantom_data,
1545        phase,
1546        pic,
1547        pie,
1548        pin,
1549        pin_drop,
1550        pin_ergonomics,
1551        pin_v2,
1552        platform_intrinsics,
1553        plugin,
1554        plugin_registrar,
1555        plugins,
1556        pointee,
1557        pointee_sized,
1558        pointee_trait,
1559        pointer,
1560        poll,
1561        post_cleanup: "post-cleanup",
1562        post_dash_lto: "post-lto",
1563        postfix_match,
1564        powerpc,
1565        powerpc64,
1566        powerpc_target_feature,
1567        powf16,
1568        powf32,
1569        powf64,
1570        powf128,
1571        powif16,
1572        powif32,
1573        powif64,
1574        powif128,
1575        pre_dash_lto: "pre-lto",
1576        precise_capturing,
1577        precise_capturing_in_traits,
1578        precise_pointer_size_matching,
1579        predicates,
1580        pref_align_of,
1581        prefetch_read_data,
1582        prefetch_read_instruction,
1583        prefetch_write_data,
1584        prefetch_write_instruction,
1585        prefix_nops,
1586        preg,
1587        prelude,
1588        prelude_import,
1589        preserves_flags,
1590        prfchw_target_feature,
1591        prid,
1592        primitive,
1593        proc_dash_macro: "proc-macro",
1594        proc_macro,
1595        proc_macro_attribute,
1596        proc_macro_derive,
1597        proc_macro_expr,
1598        proc_macro_gen,
1599        proc_macro_hygiene,
1600        proc_macro_internals,
1601        proc_macro_mod,
1602        proc_macro_non_items,
1603        proc_macro_path_invoc,
1604        profiler_runtime,
1605        ptr,
1606        ptr_cast,
1607        ptr_cast_const,
1608        ptr_cast_mut,
1609        ptr_const_is_null,
1610        ptr_copy,
1611        ptr_copy_nonoverlapping,
1612        ptr_from_ref,
1613        ptr_guaranteed_cmp,
1614        ptr_is_null,
1615        ptr_mask,
1616        ptr_metadata,
1617        ptr_null,
1618        ptr_null_mut,
1619        ptr_offset_from,
1620        ptr_offset_from_unsigned,
1621        ptr_read,
1622        ptr_read_unaligned,
1623        ptr_replace,
1624        ptr_swap,
1625        ptr_swap_nonoverlapping,
1626        ptr_write,
1627        ptr_write_bytes,
1628        ptr_write_unaligned,
1629        ptr_write_volatile,
1630        pub_macro_rules,
1631        pub_restricted,
1632        public,
1633        pure,
1634        pushpop_unsafe,
1635        qreg,
1636        qreg_low4,
1637        qreg_low8,
1638        quad_precision_float,
1639        question_mark,
1640        quote,
1641        range_inclusive_new,
1642        raw_dash_dylib: "raw-dylib",
1643        raw_dylib,
1644        raw_dylib_elf,
1645        raw_eq,
1646        raw_identifiers,
1647        raw_ref_op,
1648        re_rebalance_coherence,
1649        read_via_copy,
1650        readonly,
1651        realloc,
1652        realtime,
1653        reason,
1654        reborrow,
1655        receiver,
1656        receiver_target,
1657        recursion_limit,
1658        reexport_test_harness_main,
1659        ref_pat_eat_one_layer_2024,
1660        ref_pat_eat_one_layer_2024_structural,
1661        ref_pat_everywhere,
1662        ref_unwind_safe_trait,
1663        reference,
1664        reflect,
1665        reg,
1666        reg16,
1667        reg32,
1668        reg64,
1669        reg_abcd,
1670        reg_addr,
1671        reg_byte,
1672        reg_data,
1673        reg_iw,
1674        reg_nonzero,
1675        reg_pair,
1676        reg_ptr,
1677        reg_upper,
1678        register_attr,
1679        register_tool,
1680        relaxed_adts,
1681        relaxed_struct_unsize,
1682        relocation_model,
1683        rem,
1684        rem_assign,
1685        repr,
1686        repr128,
1687        repr_align,
1688        repr_align_enum,
1689        repr_packed,
1690        repr_simd,
1691        repr_transparent,
1692        require,
1693        reserve_x18: "reserve-x18",
1694        residual,
1695        result,
1696        result_ffi_guarantees,
1697        return_address,
1698        return_position_impl_trait_in_trait,
1699        return_type_notation,
1700        riscv32,
1701        riscv64,
1702        riscv_target_feature,
1703        rlib,
1704        ropi,
1705        ropi_rwpi: "ropi-rwpi",
1706        rotate_left,
1707        rotate_right,
1708        round_ties_even_f16,
1709        round_ties_even_f32,
1710        round_ties_even_f64,
1711        round_ties_even_f128,
1712        roundf16,
1713        roundf32,
1714        roundf64,
1715        roundf128,
1716        rtm_target_feature,
1717        runtime,
1718        rust,
1719        rust_2015,
1720        rust_2018,
1721        rust_2018_preview,
1722        rust_2021,
1723        rust_2024,
1724        rust_analyzer,
1725        rust_begin_unwind,
1726        rust_cold_cc,
1727        rust_eh_personality,
1728        rust_future,
1729        rust_logo,
1730        rust_out,
1731        rust_preserve_none_cc,
1732        rust_tail_cc,
1733        rustc,
1734        rustc_abi,
1735        // FIXME(#82232, #143834): temporary name to mitigate `#[align]` nameres ambiguity
1736        rustc_align,
1737        rustc_align_static,
1738        rustc_allocator,
1739        rustc_allocator_zeroed,
1740        rustc_allocator_zeroed_variant,
1741        rustc_allow_const_fn_unstable,
1742        rustc_allow_incoherent_impl,
1743        rustc_allowed_through_unstable_modules,
1744        rustc_as_ptr,
1745        rustc_attrs,
1746        rustc_autodiff,
1747        rustc_builtin_macro,
1748        rustc_capture_analysis,
1749        rustc_clean,
1750        rustc_coherence_is_core,
1751        rustc_coinductive,
1752        rustc_comptime,
1753        rustc_confusables,
1754        rustc_const_stable,
1755        rustc_const_stable_indirect,
1756        rustc_const_unstable,
1757        rustc_conversion_suggestion,
1758        rustc_deallocator,
1759        rustc_default_body_unstable,
1760        rustc_delayed_bug_from_inside_query,
1761        rustc_deny_explicit_impl,
1762        rustc_deprecated_safe_2024,
1763        rustc_diagnostic_item,
1764        rustc_diagnostic_macros,
1765        rustc_do_not_const_check,
1766        rustc_doc_primitive,
1767        rustc_driver,
1768        rustc_dummy,
1769        rustc_dump_def_parents,
1770        rustc_dump_def_path,
1771        rustc_dump_hidden_type_of_opaques,
1772        rustc_dump_inferred_outlives,
1773        rustc_dump_item_bounds,
1774        rustc_dump_layout,
1775        rustc_dump_object_lifetime_defaults,
1776        rustc_dump_predicates,
1777        rustc_dump_symbol_name,
1778        rustc_dump_user_args,
1779        rustc_dump_variances,
1780        rustc_dump_variances_of_opaques,
1781        rustc_dump_vtable,
1782        rustc_dyn_incompatible_trait,
1783        rustc_effective_visibility,
1784        rustc_eii_foreign_item,
1785        rustc_evaluate_where_clauses,
1786        rustc_expected_cgu_reuse,
1787        rustc_force_inline,
1788        rustc_has_incoherent_inherent_impls,
1789        rustc_if_this_changed,
1790        rustc_inherit_overflow_checks,
1791        rustc_insignificant_dtor,
1792        rustc_intrinsic,
1793        rustc_intrinsic_const_stable_indirect,
1794        rustc_legacy_const_generics,
1795        rustc_lint_opt_deny_field_access,
1796        rustc_lint_opt_ty,
1797        rustc_lint_query_instability,
1798        rustc_lint_untracked_query_information,
1799        rustc_macro_transparency,
1800        rustc_main,
1801        rustc_mir,
1802        rustc_must_implement_one_of,
1803        rustc_must_match_exhaustively,
1804        rustc_never_returns_null_ptr,
1805        rustc_never_type_options,
1806        rustc_no_implicit_autorefs,
1807        rustc_no_implicit_bounds,
1808        rustc_no_mir_inline,
1809        rustc_no_writable,
1810        rustc_non_const_trait_method,
1811        rustc_nonnull_optimization_guaranteed,
1812        rustc_nounwind,
1813        rustc_objc_class,
1814        rustc_objc_selector,
1815        rustc_offload_kernel,
1816        rustc_on_unimplemented,
1817        rustc_paren_sugar,
1818        rustc_partition_codegened,
1819        rustc_partition_reused,
1820        rustc_pass_by_value,
1821        rustc_pass_indirectly_in_non_rustic_abis,
1822        rustc_peek,
1823        rustc_peek_liveness,
1824        rustc_peek_maybe_init,
1825        rustc_peek_maybe_uninit,
1826        rustc_preserve_ub_checks,
1827        rustc_private,
1828        rustc_proc_macro_decls,
1829        rustc_promotable,
1830        rustc_pub_transparent,
1831        rustc_reallocator,
1832        rustc_regions,
1833        rustc_reservation_impl,
1834        rustc_scalable_vector,
1835        rustc_should_not_be_called_on_const_items,
1836        rustc_simd_monomorphize_lane_limit,
1837        rustc_skip_during_method_dispatch,
1838        rustc_specialization_trait,
1839        rustc_std_internal_symbol,
1840        rustc_strict_coherence,
1841        rustc_test_marker,
1842        rustc_then_this_would_need,
1843        rustc_trivial_field_reads,
1844        rustc_unsafe_specialization_marker,
1845        rustdoc,
1846        rustdoc_internals,
1847        rustdoc_missing_doc_code_examples,
1848        rustfmt,
1849        rvalue_static_promotion,
1850        rvector,
1851        rwpi,
1852        s32c1i,
1853        s390x,
1854        s390x_target_feature,
1855        s390x_target_feature_vector,
1856        safety,
1857        sanitize,
1858        sanitizer_cfi_generalize_pointers,
1859        sanitizer_cfi_normalize_integers,
1860        sanitizer_runtime,
1861        saturating_add,
1862        saturating_sub,
1863        sdylib,
1864        search_unbox,
1865        select_unpredictable,
1866        self_in_typedefs,
1867        self_struct_ctor,
1868        semiopaque,
1869        sgpr32,
1870        sgpr64,
1871        sgpr96,
1872        sgpr128,
1873        sgpr256,
1874        sgpr512,
1875        sha2,
1876        sha3,
1877        sha512_sm_x86,
1878        shadow_call_stack,
1879        shallow,
1880        shl,
1881        shl_assign,
1882        shorter_tail_lifetimes,
1883        should_panic,
1884        show,
1885        shr,
1886        shr_assign,
1887        signed,
1888        simd,
1889        simd_add,
1890        simd_and,
1891        simd_arith_offset,
1892        simd_as,
1893        simd_bitmask,
1894        simd_bitreverse,
1895        simd_bswap,
1896        simd_carryless_mul,
1897        simd_cast,
1898        simd_cast_ptr,
1899        simd_ceil,
1900        simd_ctlz,
1901        simd_ctpop,
1902        simd_cttz,
1903        simd_div,
1904        simd_eq,
1905        simd_expose_provenance,
1906        simd_extract,
1907        simd_extract_dyn,
1908        simd_fabs,
1909        simd_fcos,
1910        simd_fexp,
1911        simd_fexp2,
1912        simd_ffi,
1913        simd_flog,
1914        simd_flog2,
1915        simd_flog10,
1916        simd_floor,
1917        simd_fma,
1918        simd_fsin,
1919        simd_fsqrt,
1920        simd_funnel_shl,
1921        simd_funnel_shr,
1922        simd_gather,
1923        simd_ge,
1924        simd_gt,
1925        simd_insert,
1926        simd_insert_dyn,
1927        simd_le,
1928        simd_lt,
1929        simd_masked_load,
1930        simd_masked_store,
1931        simd_maximum_number_nsz,
1932        simd_minimum_number_nsz,
1933        simd_mul,
1934        simd_ne,
1935        simd_neg,
1936        simd_or,
1937        simd_reduce_add_ordered,
1938        simd_reduce_add_unordered,
1939        simd_reduce_all,
1940        simd_reduce_and,
1941        simd_reduce_any,
1942        simd_reduce_max,
1943        simd_reduce_min,
1944        simd_reduce_mul_ordered,
1945        simd_reduce_mul_unordered,
1946        simd_reduce_or,
1947        simd_reduce_xor,
1948        simd_relaxed_fma,
1949        simd_rem,
1950        simd_round,
1951        simd_round_ties_even,
1952        simd_saturating_add,
1953        simd_saturating_sub,
1954        simd_scatter,
1955        simd_select,
1956        simd_select_bitmask,
1957        simd_shl,
1958        simd_shr,
1959        simd_shuffle,
1960        simd_shuffle_const_generic,
1961        simd_splat,
1962        simd_sub,
1963        simd_trunc,
1964        simd_with_exposed_provenance,
1965        simd_xor,
1966        since,
1967        sinf16,
1968        sinf32,
1969        sinf64,
1970        sinf128,
1971        size,
1972        size_of,
1973        size_of_type_id,
1974        size_of_val,
1975        sized,
1976        sized_hierarchy,
1977        slice,
1978        slice_from_raw_parts,
1979        slice_from_raw_parts_mut,
1980        slice_get_unchecked,
1981        slice_len_fn,
1982        slice_patterns,
1983        slicing_syntax,
1984        soft_float: "soft-float",
1985        sparc,
1986        sparc64,
1987        sparc_target_feature,
1988        spe_acc,
1989        specialization,
1990        speed,
1991        spirv,
1992        splat,
1993        spotlight,
1994        sqrtf16,
1995        sqrtf32,
1996        sqrtf64,
1997        sqrtf128,
1998        sreg,
1999        sreg_low16,
2000        sse,
2001        sse2,
2002        sse4a_target_feature,
2003        stable,
2004        staged_api,
2005        start,
2006        state,
2007        static_align,
2008        static_in_const,
2009        static_nobundle,
2010        static_recursion,
2011        staticlib,
2012        std,
2013        std_lib_injection,
2014        std_panic,
2015        std_panic_2015_macro,
2016        std_panic_macro,
2017        stmt,
2018        stmt_expr_attributes,
2019        stop_after_dataflow,
2020        store,
2021        str,
2022        str_from_utf8,
2023        str_from_utf8_mut,
2024        str_from_utf8_unchecked,
2025        str_from_utf8_unchecked_mut,
2026        str_inherent_from_utf8,
2027        str_inherent_from_utf8_mut,
2028        str_inherent_from_utf8_unchecked,
2029        str_inherent_from_utf8_unchecked_mut,
2030        strict_provenance_lints,
2031        string_deref_patterns,
2032        stringify,
2033        struct_field_attributes,
2034        struct_inherit,
2035        struct_variant,
2036        structural_match,
2037        structural_peq,
2038        sub,
2039        sub_assign,
2040        sub_with_overflow,
2041        suggestion,
2042        super_let,
2043        supertrait_item_shadowing,
2044        sve_cast,
2045        sve_tuple_create2,
2046        sve_tuple_create3,
2047        sve_tuple_create4,
2048        sve_tuple_get,
2049        sve_tuple_set,
2050        sym,
2051        sync,
2052        synthetic,
2053        t32,
2054        target,
2055        target_abi,
2056        target_arch,
2057        target_endian,
2058        target_env,
2059        target_family,
2060        target_feature,
2061        target_feature_11,
2062        target_feature_inline_always,
2063        target_has_atomic,
2064        target_has_atomic_load_store,
2065        target_has_atomic_primitive_alignment,
2066        target_has_reliable_f16,
2067        target_has_reliable_f16_math,
2068        target_has_reliable_f128,
2069        target_has_reliable_f128_math,
2070        target_object_format,
2071        target_os,
2072        target_pointer_width,
2073        target_thread_local,
2074        target_vendor,
2075        tbm_target_feature,
2076        termination,
2077        termination_trait,
2078        termination_trait_test,
2079        test,
2080        test_2018_feature,
2081        test_accepted_feature,
2082        test_case,
2083        test_incomplete_feature,
2084        test_removed_feature,
2085        test_runner,
2086        test_unstable_lint,
2087        thread,
2088        thread_local,
2089        threadptr,
2090        three_way_compare,
2091        thumb2,
2092        thumb_mode: "thumb-mode",
2093        time,
2094        tmm_reg,
2095        to_owned_method,
2096        to_string,
2097        to_vec,
2098        tool_attributes,
2099        tool_lints,
2100        trace_macros,
2101        track_caller,
2102        trait_alias,
2103        trait_ty,
2104        trait_upcasting,
2105        transmute,
2106        transmute_generic_consts,
2107        transmute_opts,
2108        transmute_trait,
2109        transmute_unchecked,
2110        transparent,
2111        transparent_enums,
2112        transparent_unions,
2113        trivial_bounds,
2114        trivial_clone,
2115        truncf16,
2116        truncf32,
2117        truncf64,
2118        truncf128,
2119        try_blocks,
2120        try_blocks_heterogeneous,
2121        try_capture,
2122        try_from,
2123        try_into,
2124        try_trait_v2,
2125        try_trait_v2_residual,
2126        try_update,
2127        tt,
2128        tuple,
2129        tuple_indexing,
2130        tuple_trait,
2131        two_phase,
2132        ty,
2133        type_alias_enum_variants,
2134        type_alias_impl_trait,
2135        type_ascribe,
2136        type_ascription,
2137        type_changing_struct_update,
2138        type_id,
2139        type_id_eq,
2140        type_id_field_representing_type,
2141        type_id_fields,
2142        type_id_variants,
2143        type_id_vtable,
2144        type_info,
2145        type_ir,
2146        type_ir_infer_ctxt_like,
2147        type_ir_inherent,
2148        type_ir_interner,
2149        type_length_limit,
2150        type_macros,
2151        type_name,
2152        type_of,
2153        type_privacy_lints,
2154        typed_swap_nonoverlapping,
2155        u8,
2156        u8_legacy_const_max,
2157        u8_legacy_const_min,
2158        u8_legacy_fn_max_value,
2159        u8_legacy_fn_min_value,
2160        u8_legacy_mod,
2161        u16,
2162        u16_legacy_const_max,
2163        u16_legacy_const_min,
2164        u16_legacy_fn_max_value,
2165        u16_legacy_fn_min_value,
2166        u16_legacy_mod,
2167        u32,
2168        u32_legacy_const_max,
2169        u32_legacy_const_min,
2170        u32_legacy_fn_max_value,
2171        u32_legacy_fn_min_value,
2172        u32_legacy_mod,
2173        u64,
2174        u64_legacy_const_max,
2175        u64_legacy_const_min,
2176        u64_legacy_fn_max_value,
2177        u64_legacy_fn_min_value,
2178        u64_legacy_mod,
2179        u128,
2180        u128_legacy_const_max,
2181        u128_legacy_const_min,
2182        u128_legacy_fn_max_value,
2183        u128_legacy_fn_min_value,
2184        u128_legacy_mod,
2185        ub_checks,
2186        unaligned_volatile_load,
2187        unaligned_volatile_store,
2188        unboxed_closures,
2189        unchecked_add,
2190        unchecked_div,
2191        unchecked_funnel_shl,
2192        unchecked_funnel_shr,
2193        unchecked_mul,
2194        unchecked_rem,
2195        unchecked_shl,
2196        unchecked_shr,
2197        unchecked_sub,
2198        undecorated,
2199        underscore_const_names,
2200        underscore_imports,
2201        underscore_lifetimes,
2202        uniform_paths,
2203        unimplemented,
2204        unit,
2205        universal_impl_trait,
2206        unix,
2207        unlikely,
2208        unmarked_api,
2209        unnamed_enum_variants,
2210        unnamed_fields,
2211        unpin,
2212        unqualified_local_imports,
2213        unreachable,
2214        unreachable_2015,
2215        unreachable_2015_macro,
2216        unreachable_2021,
2217        unreachable_code,
2218        unreachable_display,
2219        unreachable_macro,
2220        unrestricted_attribute_tokens,
2221        unroll,
2222        unsafe_attributes,
2223        unsafe_binders,
2224        unsafe_block_in_unsafe_fn,
2225        unsafe_cell,
2226        unsafe_cell_raw_get,
2227        unsafe_eii,
2228        unsafe_extern_blocks,
2229        unsafe_fields,
2230        unsafe_no_drop_flag,
2231        unsafe_pinned,
2232        unsafe_unpin,
2233        unsafety,
2234        unsize,
2235        unsized_const_param_ty,
2236        unsized_const_params,
2237        unsized_fn_params,
2238        unsized_locals,
2239        unsized_tuple_coercion,
2240        unstable,
2241        unstable_feature_bound,
2242        unstable_location_reason_default: "this crate is being loaded from the sysroot, an \
2243                          unstable location; did you mean to load this crate \
2244                          from crates.io via `Cargo.toml` instead?",
2245        unstable_removed,
2246        untagged_unions,
2247        unused_imports,
2248        unwind,
2249        unwind_attributes,
2250        unwind_safe_trait,
2251        unwrap,
2252        unwrap_binder,
2253        unwrap_or,
2254        update,
2255        use_cloned,
2256        use_extern_macros,
2257        use_nested_groups,
2258        used,
2259        used_with_arg,
2260        using,
2261        usize,
2262        usize_legacy_const_max,
2263        usize_legacy_const_min,
2264        usize_legacy_fn_max_value,
2265        usize_legacy_fn_min_value,
2266        usize_legacy_mod,
2267        v1,
2268        v8plus,
2269        va_arg,
2270        va_arg_safe,
2271        va_copy,
2272        va_end,
2273        va_list,
2274        va_start,
2275        val,
2276        validity,
2277        value,
2278        values,
2279        var,
2280        variadic,
2281        variant_count,
2282        variants,
2283        vec,
2284        vector,
2285        verbatim,
2286        version,
2287        vfp2,
2288        vgpr16,
2289        vgpr32,
2290        vgpr64,
2291        vgpr96,
2292        vgpr128,
2293        vgpr160,
2294        vgpr192,
2295        vgpr224,
2296        vgpr256,
2297        vgpr288,
2298        vgpr320,
2299        vgpr352,
2300        vgpr384,
2301        vgpr512,
2302        vgpr1024,
2303        view_types,
2304        vis,
2305        visible_private_types,
2306        volatile,
2307        volatile_copy_memory,
2308        volatile_copy_nonoverlapping_memory,
2309        volatile_load,
2310        volatile_set_memory,
2311        volatile_store,
2312        vreg,
2313        vreg_low16,
2314        vreg_pair,
2315        vsreg,
2316        vsx,
2317        vtable_align,
2318        vtable_size,
2319        warn,
2320        wasip2,
2321        wasm,
2322        wasm32,
2323        wasm64,
2324        wasm_abi,
2325        wasm_import_module,
2326        wasm_target_feature,
2327        weak,
2328        weak_odr,
2329        where_clause_attrs,
2330        while_let,
2331        whole_dash_archive: "whole-archive",
2332        width,
2333        windowed,
2334        windows,
2335        windows_subsystem,
2336        with_negative_coherence,
2337        wrap_binder,
2338        wrapping_add,
2339        wrapping_div,
2340        wrapping_mul,
2341        wrapping_rem,
2342        wrapping_rem_euclid,
2343        wrapping_sub,
2344        wreg,
2345        write_box_via_move,
2346        write_bytes,
2347        write_fmt,
2348        write_macro,
2349        write_str,
2350        write_via_move,
2351        writeln_macro,
2352        x86,
2353        x86_64,
2354        x86_amx_intrinsics,
2355        x87_reg,
2356        x87_target_feature,
2357        xcoff,
2358        xer,
2359        xloop,
2360        xmm_reg,
2361        xop_target_feature,
2362        xtensa,
2363        xtensa_target_feature,
2364        yeet_desugar_details,
2365        yeet_expr,
2366        yes,
2367        yield_expr,
2368        ymm_reg,
2369        yreg,
2370        zca,
2371        zfh,
2372        zfhmin,
2373        zmm_reg,
2374        ztso,
2375        // tidy-alphabetical-end
2376    }
2377}
2378
2379/// Symbols for crates that are part of the stable standard library: `std`, `core`, `alloc`, and
2380/// `proc_macro`.
2381pub const STDLIB_STABLE_CRATES: &[Symbol] = &[sym::std, sym::core, sym::alloc, sym::proc_macro];
2382
2383#[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)]
2384pub struct Ident {
2385    /// `name` should never be the empty symbol. If you are considering that,
2386    /// you are probably conflating "empty identifier with "no identifier" and
2387    /// you should use `Option<Ident>` instead.
2388    /// Trying to construct an `Ident` with an empty name will trigger debug assertions.
2389    pub name: Symbol,
2390    pub span: Span,
2391}
2392
2393impl Ident {
2394    #[inline]
2395    /// Constructs a new identifier from a symbol and a span.
2396    pub fn new(name: Symbol, span: Span) -> Ident {
2397        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);
2398        Ident { name, span }
2399    }
2400
2401    /// Constructs a new identifier with a dummy span.
2402    #[inline]
2403    pub fn with_dummy_span(name: Symbol) -> Ident {
2404        Ident::new(name, DUMMY_SP)
2405    }
2406
2407    // For dummy identifiers that are never used and absolutely must be
2408    // present. Note that this does *not* use the empty symbol; `sym::dummy`
2409    // makes it clear that it's intended as a dummy value, and is more likely
2410    // to be detected if it accidentally does get used.
2411    #[inline]
2412    pub fn dummy() -> Ident {
2413        Ident::with_dummy_span(sym::dummy)
2414    }
2415
2416    /// Maps a string to an identifier with a dummy span.
2417    pub fn from_str(string: &str) -> Ident {
2418        Ident::with_dummy_span(Symbol::intern(string))
2419    }
2420
2421    /// Maps a string and a span to an identifier.
2422    pub fn from_str_and_span(string: &str, span: Span) -> Ident {
2423        Ident::new(Symbol::intern(string), span)
2424    }
2425
2426    /// Replaces `lo` and `hi` with those from `span`, but keep hygiene context.
2427    pub fn with_span_pos(self, span: Span) -> Ident {
2428        Ident::new(self.name, span.with_ctxt(self.span.ctxt()))
2429    }
2430
2431    /// Creates a new ident with the same span and name with leading quote removed, if any.
2432    /// Calling it on a `'` ident will return an empty ident, which triggers debug assertions.
2433    pub fn without_first_quote(self) -> Ident {
2434        self.as_str()
2435            .strip_prefix('\'')
2436            .map_or(self, |name| Ident::new(Symbol::intern(name), self.span))
2437    }
2438
2439    /// "Normalize" ident for use in comparisons using "item hygiene".
2440    /// Identifiers with same string value become same if they came from the same macro 2.0 macro
2441    /// (e.g., `macro` item, but not `macro_rules` item) and stay different if they came from
2442    /// different macro 2.0 macros.
2443    /// Technically, this operation strips all non-opaque marks from ident's syntactic context.
2444    pub fn normalize_to_macros_2_0(self) -> Ident {
2445        Ident::new(self.name, self.span.normalize_to_macros_2_0())
2446    }
2447
2448    /// "Normalize" ident for use in comparisons using "local variable hygiene".
2449    /// Identifiers with same string value become same if they came from the same non-transparent
2450    /// macro (e.g., `macro` or `macro_rules!` items) and stay different if they came from different
2451    /// non-transparent macros.
2452    /// Technically, this operation strips all transparent marks from ident's syntactic context.
2453    #[inline]
2454    pub fn normalize_to_macro_rules(self) -> Ident {
2455        Ident::new(self.name, self.span.normalize_to_macro_rules())
2456    }
2457
2458    /// Access the underlying string. This is a slowish operation because it
2459    /// requires locking the symbol interner.
2460    ///
2461    /// Note that the lifetime of the return value is a lie. See
2462    /// `Symbol::as_str()` for details.
2463    pub fn as_str(&self) -> &str {
2464        self.name.as_str()
2465    }
2466}
2467
2468impl PartialEq for Ident {
2469    #[inline]
2470    fn eq(&self, rhs: &Self) -> bool {
2471        self.name == rhs.name && self.span.eq_ctxt(rhs.span)
2472    }
2473}
2474
2475impl Hash for Ident {
2476    fn hash<H: Hasher>(&self, state: &mut H) {
2477        self.name.hash(state);
2478        self.span.ctxt().hash(state);
2479    }
2480}
2481
2482impl fmt::Debug for Ident {
2483    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2484        fmt::Display::fmt(self, f)?;
2485        fmt::Debug::fmt(&self.span.ctxt(), f)
2486    }
2487}
2488
2489/// This implementation is supposed to be used in error messages, so it's expected to be identical
2490/// to printing the original identifier token written in source code (`token_to_string`),
2491/// except that AST identifiers don't keep the rawness flag, so we have to guess it.
2492impl fmt::Display for Ident {
2493    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2494        fmt::Display::fmt(&IdentPrinter::new(self.name, self.guess_print_mode(), None), f)
2495    }
2496}
2497
2498pub enum IdentPrintMode {
2499    Normal,
2500    RawIdent,
2501    RawLifetime,
2502}
2503
2504/// The most general type to print identifiers.
2505///
2506/// AST pretty-printer is used as a fallback for turning AST structures into token streams for
2507/// proc macros. Additionally, proc macros may stringify their input and expect it survive the
2508/// stringification (especially true for proc macro derives written between Rust 1.15 and 1.30).
2509/// So we need to somehow pretty-print `$crate` in a way preserving at least some of its
2510/// hygiene data, most importantly name of the crate it refers to.
2511/// As a result we print `$crate` as `crate` if it refers to the local crate
2512/// and as `::other_crate_name` if it refers to some other crate.
2513/// Note, that this is only done if the ident token is printed from inside of AST pretty-printing,
2514/// but not otherwise. Pretty-printing is the only way for proc macros to discover token contents,
2515/// so we should not perform this lossy conversion if the top level call to the pretty-printer was
2516/// done for a token stream or a single token.
2517pub struct IdentPrinter {
2518    symbol: Symbol,
2519    mode: IdentPrintMode,
2520    /// Span used for retrieving the crate name to which `$crate` refers to,
2521    /// if this field is `None` then the `$crate` conversion doesn't happen.
2522    convert_dollar_crate: Option<Span>,
2523}
2524
2525impl IdentPrinter {
2526    /// The most general `IdentPrinter` constructor. Do not use this.
2527    pub fn new(
2528        symbol: Symbol,
2529        mode: IdentPrintMode,
2530        convert_dollar_crate: Option<Span>,
2531    ) -> IdentPrinter {
2532        IdentPrinter { symbol, mode, convert_dollar_crate }
2533    }
2534
2535    /// This implementation is supposed to be used when printing identifiers
2536    /// as a part of pretty-printing for larger AST pieces.
2537    /// Do not use this either.
2538    pub fn for_ast_ident(ident: Ident, mode: IdentPrintMode) -> IdentPrinter {
2539        IdentPrinter::new(ident.name, mode, Some(ident.span))
2540    }
2541}
2542
2543impl fmt::Display for IdentPrinter {
2544    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2545        let s = match self.mode {
2546            IdentPrintMode::Normal
2547                if self.symbol == kw::DollarCrate
2548                    && let Some(span) = self.convert_dollar_crate =>
2549            {
2550                let converted = span.ctxt().dollar_crate_name();
2551                if !converted.is_path_segment_keyword() {
2552                    f.write_str("::")?;
2553                }
2554                converted
2555            }
2556            IdentPrintMode::Normal => self.symbol,
2557            IdentPrintMode::RawIdent => {
2558                f.write_str("r#")?;
2559                self.symbol
2560            }
2561            IdentPrintMode::RawLifetime => {
2562                f.write_str("'r#")?;
2563                let s = self
2564                    .symbol
2565                    .as_str()
2566                    .strip_prefix("'")
2567                    .expect("only lifetime idents should be passed with RawLifetime mode");
2568                Symbol::intern(s)
2569            }
2570        };
2571        s.fmt(f)
2572    }
2573}
2574
2575/// A newtype around `Ident` that calls [Ident::normalize_to_macro_rules] on
2576/// construction for "local variable hygiene" comparisons.
2577///
2578/// Use this type when you need to compare identifiers according to macro_rules hygiene.
2579/// This ensures compile-time safety and avoids manual normalization calls.
2580#[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)]
2581pub struct MacroRulesNormalizedIdent(Ident);
2582
2583impl MacroRulesNormalizedIdent {
2584    #[inline]
2585    pub fn new(ident: Ident) -> Self {
2586        MacroRulesNormalizedIdent(ident.normalize_to_macro_rules())
2587    }
2588
2589    pub fn symbol(&self) -> Symbol {
2590        self.0.name
2591    }
2592
2593    pub fn ident(&self) -> Ident {
2594        self.0
2595    }
2596}
2597
2598impl fmt::Debug for MacroRulesNormalizedIdent {
2599    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2600        fmt::Debug::fmt(&self.0, f)
2601    }
2602}
2603
2604impl fmt::Display for MacroRulesNormalizedIdent {
2605    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2606        fmt::Display::fmt(&self.0, f)
2607    }
2608}
2609
2610/// An interned UTF-8 string.
2611///
2612/// Internally, a `Symbol` is implemented as an index, and all operations
2613/// (including hashing, equality, and ordering) operate on that index. The use
2614/// of `rustc_index::newtype_index!` means that `Option<Symbol>` only takes up 4 bytes,
2615/// because `rustc_index::newtype_index!` reserves the last 256 values for tagging purposes.
2616///
2617/// Note that `Symbol` cannot directly be a `rustc_index::newtype_index!` because it
2618/// implements `fmt::Debug`, `Encodable`, and `Decodable` in special ways.
2619#[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)]
2620pub struct Symbol(SymbolIndex);
2621
2622// Used within both `Symbol` and `ByteSymbol`.
2623impl ::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! {
2624    #[orderable]
2625    struct SymbolIndex {}
2626}
2627
2628impl Symbol {
2629    /// Avoid this except for things like deserialization of previously
2630    /// serialized symbols, and testing. Use `intern` instead.
2631    pub const fn new(n: u32) -> Self {
2632        Symbol(SymbolIndex::from_u32(n))
2633    }
2634
2635    /// Maps a string to its interned representation.
2636    #[rustc_diagnostic_item = "SymbolIntern"]
2637    pub fn intern(str: &str) -> Self {
2638        with_session_globals(|session_globals| session_globals.symbol_interner.intern_str(str))
2639    }
2640
2641    /// Access the underlying string. This is a slowish operation because it
2642    /// requires locking the symbol interner.
2643    ///
2644    /// Note that the lifetime of the return value is a lie. It's not the same
2645    /// as `&self`, but actually tied to the lifetime of the underlying
2646    /// interner. Interners are long-lived, and there are very few of them, and
2647    /// this function is typically used for short-lived things, so in practice
2648    /// it works out ok.
2649    pub fn as_str(&self) -> &str {
2650        with_session_globals(|session_globals| unsafe {
2651            std::mem::transmute::<&str, &str>(session_globals.symbol_interner.get_str(*self))
2652        })
2653    }
2654
2655    pub fn as_u32(self) -> u32 {
2656        self.0.as_u32()
2657    }
2658
2659    pub fn is_empty(self) -> bool {
2660        self == sym::empty
2661    }
2662
2663    /// This method is supposed to be used in error messages, so it's expected to be
2664    /// identical to printing the original identifier token written in source code
2665    /// (`token_to_string`, `Ident::to_string`), except that symbols don't keep the rawness flag
2666    /// or edition, so we have to guess the rawness using the global edition.
2667    pub fn to_ident_string(self) -> String {
2668        // Avoid creating an empty identifier, because that asserts in debug builds.
2669        if self == sym::empty { String::new() } else { Ident::with_dummy_span(self).to_string() }
2670    }
2671
2672    /// Checks if `self` is similar to any symbol in `candidates`.
2673    ///
2674    /// The returned boolean represents whether the candidate is the same symbol with a different
2675    /// casing.
2676    ///
2677    /// All the candidates are assumed to be lowercase.
2678    pub fn find_similar(
2679        self,
2680        candidates: &[Symbol],
2681    ) -> Option<(Symbol, /* is incorrect case */ bool)> {
2682        let lowercase = self.as_str().to_lowercase();
2683        let lowercase_sym = Symbol::intern(&lowercase);
2684        if candidates.contains(&lowercase_sym) {
2685            Some((lowercase_sym, true))
2686        } else if let Some(similar_sym) = find_best_match_for_name(candidates, self, None) {
2687            Some((similar_sym, false))
2688        } else {
2689            None
2690        }
2691    }
2692}
2693
2694impl fmt::Debug for Symbol {
2695    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2696        fmt::Debug::fmt(self.as_str(), f)
2697    }
2698}
2699
2700impl fmt::Display for Symbol {
2701    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2702        fmt::Display::fmt(self.as_str(), f)
2703    }
2704}
2705
2706impl StableHash for Symbol {
2707    #[inline]
2708    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2709        self.as_str().stable_hash(hcx, hasher);
2710    }
2711}
2712
2713impl StableCompare for Symbol {
2714    const CAN_USE_UNSTABLE_SORT: bool = true;
2715
2716    fn stable_cmp(&self, other: &Self) -> std::cmp::Ordering {
2717        self.as_str().cmp(other.as_str())
2718    }
2719}
2720
2721/// Like `Symbol`, but for byte strings. `ByteSymbol` is used less widely, so
2722/// it has fewer operations defined than `Symbol`.
2723#[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)]
2724pub struct ByteSymbol(SymbolIndex);
2725
2726impl ByteSymbol {
2727    /// Avoid this except for things like deserialization of previously
2728    /// serialized symbols, and testing. Use `intern` instead.
2729    pub const fn new(n: u32) -> Self {
2730        ByteSymbol(SymbolIndex::from_u32(n))
2731    }
2732
2733    /// Maps a string to its interned representation.
2734    pub fn intern(byte_str: &[u8]) -> Self {
2735        with_session_globals(|session_globals| {
2736            session_globals.symbol_interner.intern_byte_str(byte_str)
2737        })
2738    }
2739
2740    /// Like `Symbol::as_str`.
2741    pub fn as_byte_str(&self) -> &[u8] {
2742        with_session_globals(|session_globals| unsafe {
2743            std::mem::transmute::<&[u8], &[u8]>(session_globals.symbol_interner.get_byte_str(*self))
2744        })
2745    }
2746
2747    pub fn as_u32(self) -> u32 {
2748        self.0.as_u32()
2749    }
2750}
2751
2752impl fmt::Debug for ByteSymbol {
2753    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2754        fmt::Debug::fmt(self.as_byte_str(), f)
2755    }
2756}
2757
2758impl StableHash for ByteSymbol {
2759    #[inline]
2760    fn stable_hash<Hcx: StableHashCtxt>(&self, hcx: &mut Hcx, hasher: &mut StableHasher) {
2761        self.as_byte_str().stable_hash(hcx, hasher);
2762    }
2763}
2764
2765// Interner used for both `Symbol`s and `ByteSymbol`s. If a string and a byte
2766// string with identical contents (e.g. "foo" and b"foo") are both interned,
2767// only one copy will be stored and the resulting `Symbol` and `ByteSymbol`
2768// will have the same index.
2769pub(crate) struct Interner(Lock<InternerInner>);
2770
2771// The `&'static [u8]`s in this type actually point into the arena.
2772//
2773// This type is private to prevent accidentally constructing more than one
2774// `Interner` on the same thread, which makes it easy to mix up `Symbol`s
2775// between `Interner`s.
2776struct InternerInner {
2777    arena: DroplessArena,
2778    indices: HashTable<(&'static [u8], u32)>,
2779    byte_strs: Vec<&'static [u8]>,
2780}
2781
2782impl Interner {
2783    // These arguments are `&str`, but because of the sharing, we are
2784    // effectively pre-interning all these strings for both `Symbol` and
2785    // `ByteSymbol`.
2786    fn prefill(init: &[&'static str], extra: &[&'static str]) -> Self {
2787        let values = init.iter().copied().chain(extra.iter().copied()).map(|str| str.as_bytes());
2788        let (size_hint, _) = values.size_hint();
2789        let mut conflicting_values: Vec<&[u8]> = Vec::new();
2790
2791        let mut indices: HashTable<(&'static [u8], u32)> = HashTable::with_capacity(size_hint);
2792        let hasher = FxBuildHasher::default();
2793
2794        let mut byte_strs: Vec<&'static [u8]> = Vec::with_capacity(size_hint);
2795
2796        for v in values {
2797            match indices.entry(hasher.hash_one(&v), |&(s, _)| s == v, |&(s, _)| hasher.hash_one(s))
2798            {
2799                Entry::Occupied(v) => conflicting_values.push(v.get().0),
2800                Entry::Vacant(view) => {
2801                    view.insert((v, byte_strs.len() as u32));
2802                    byte_strs.push(v);
2803                }
2804            }
2805        }
2806
2807        if conflicting_values.len() != 0 {
2808            {
    ::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!(
2809                "duplicate symbols in the rustc symbol list and the extra symbols added by the driver: {:?}",
2810                conflicting_values
2811            )
2812        }
2813
2814        Interner(Lock::new(InternerInner { arena: Default::default(), indices, byte_strs }))
2815    }
2816
2817    fn intern_str(&self, str: &str) -> Symbol {
2818        Symbol::new(self.intern_inner(str.as_bytes()))
2819    }
2820
2821    fn intern_byte_str(&self, byte_str: &[u8]) -> ByteSymbol {
2822        ByteSymbol::new(self.intern_inner(byte_str))
2823    }
2824
2825    #[inline]
2826    fn intern_inner(&self, byte_str: &[u8]) -> u32 {
2827        let hasher = FxBuildHasher::default();
2828        let hash_of_byte_str = hasher.hash_one(byte_str);
2829
2830        self.0.with_lock(|inner| {
2831            match inner.indices.entry(
2832                hash_of_byte_str,
2833                |&(s, _)| s == byte_str,
2834                |&(s, _)| hasher.hash_one(s),
2835            ) {
2836                Entry::Occupied(v) => v.get().1,
2837                Entry::Vacant(view) => {
2838                    let byte_str: &[u8] = inner.arena.alloc_slice(byte_str);
2839
2840                    // SAFETY: we can extend the arena allocation to `'static` because we
2841                    // only access these while the arena is still alive.
2842                    let byte_str: &'static [u8] = unsafe { &*(byte_str as *const [u8]) };
2843                    let idx = inner.byte_strs.len() as u32;
2844                    view.insert((byte_str, idx));
2845                    inner.byte_strs.push(byte_str);
2846                    idx
2847                }
2848            }
2849        })
2850    }
2851
2852    /// Get the symbol as a string.
2853    ///
2854    /// [`Symbol::as_str()`] should be used in preference to this function.
2855    fn get_str(&self, symbol: Symbol) -> &str {
2856        let byte_str = self.get_inner(symbol.0.as_usize());
2857        // SAFETY: known to be a UTF8 string because it's a `Symbol`.
2858        unsafe { str::from_utf8_unchecked(byte_str) }
2859    }
2860
2861    /// Get the symbol as a string.
2862    ///
2863    /// [`ByteSymbol::as_byte_str()`] should be used in preference to this function.
2864    fn get_byte_str(&self, symbol: ByteSymbol) -> &[u8] {
2865        self.get_inner(symbol.0.as_usize())
2866    }
2867
2868    fn get_inner(&self, index: usize) -> &[u8] {
2869        self.0.with_lock(|inner| inner.byte_strs[index])
2870    }
2871}
2872
2873// This module has a very short name because it's used a lot.
2874/// This module contains all the defined keyword `Symbol`s.
2875///
2876/// Given that `kw` is imported, use them like `kw::keyword_name`.
2877/// For example `kw::Loop` or `kw::Break`.
2878pub mod kw {
2879    pub use super::kw_generated::*;
2880}
2881
2882// This module has a very short name because it's used a lot.
2883/// This module contains all the defined non-keyword `Symbol`s.
2884///
2885/// Given that `sym` is imported, use them like `sym::symbol_name`.
2886/// For example `sym::rustfmt` or `sym::u8`.
2887pub mod sym {
2888    // Used from a macro in `librustc_feature/accepted.rs`
2889    use super::Symbol;
2890    pub use super::kw::MacroRules as macro_rules;
2891    #[doc(inline)]
2892    pub use super::sym_generated::*;
2893
2894    // Used quite often in relation to C ABI.
2895    pub const C: Symbol = ascii_letter_digit('C').unwrap();
2896
2897    // RISC-V stuff
2898    #[expect(non_upper_case_globals)]
2899    pub const f: Symbol = ascii_letter_digit('f').unwrap();
2900    #[expect(non_upper_case_globals)]
2901    pub const d: Symbol = ascii_letter_digit('d').unwrap();
2902
2903    /// Get the symbol for an integer.
2904    ///
2905    /// The first few non-negative integers each have a static symbol and therefore
2906    /// are fast.
2907    pub fn integer<N: TryInto<usize> + Copy + itoa::Integer>(n: N) -> Symbol {
2908        if let Result::Ok(idx) = n.try_into() {
2909            if idx < 10 {
2910                return Symbol::new(super::SYMBOL_DIGITS_BASE + idx as u32);
2911            }
2912        }
2913        let mut buffer = itoa::Buffer::new();
2914        let printed = buffer.format(n);
2915        Symbol::intern(printed)
2916    }
2917
2918    pub const fn ascii_letter_digit(c: char) -> Option<Symbol> {
2919        let i = c as u32;
2920        Option::Some(Symbol::new(match c {
2921            '0'..='9' => super::SYMBOL_DIGITS_BASE + (i - '0' as u32),
2922            'A'..='Z' => super::SYMBOL_UPPERCASE_LETTERS_BASE + (i - 'A' as u32),
2923            'a'..='z' => super::SYMBOL_LOWERCASE_LETTERS_BASE + (i - 'a' as u32),
2924            _ => return Option::None,
2925        }))
2926    }
2927
2928    pub fn character(c: char) -> Symbol {
2929        ascii_letter_digit(c).unwrap_or_else(|| {
2930            let mut buf: [u8; char::MAX_LEN_UTF8] = Default::default();
2931            Symbol::intern(c.encode_utf8(&mut buf))
2932        })
2933    }
2934}
2935
2936impl Symbol {
2937    fn is_special(self) -> bool {
2938        self <= kw::Underscore
2939    }
2940
2941    fn is_used_keyword_always(self) -> bool {
2942        self >= kw::As && self <= kw::While
2943    }
2944
2945    fn is_unused_keyword_always(self) -> bool {
2946        self >= kw::Abstract && self <= kw::Yield
2947    }
2948
2949    fn is_used_keyword_conditional(self, edition: impl FnOnce() -> Edition) -> bool {
2950        (self >= kw::Async && self <= kw::Dyn) && edition() >= Edition::Edition2018
2951    }
2952
2953    fn is_unused_keyword_conditional(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2954        self == kw::Gen && edition().at_least_rust_2024()
2955            || self == kw::Try && edition().at_least_rust_2018()
2956    }
2957
2958    pub fn is_reserved(self, edition: impl Copy + FnOnce() -> Edition) -> bool {
2959        self.is_special()
2960            || self.is_used_keyword_always()
2961            || self.is_unused_keyword_always()
2962            || self.is_used_keyword_conditional(edition)
2963            || self.is_unused_keyword_conditional(edition)
2964    }
2965
2966    pub fn is_weak(self) -> bool {
2967        self >= kw::Auto && self <= kw::Yeet
2968    }
2969
2970    /// A keyword or reserved identifier that can be used as a path segment.
2971    pub fn is_path_segment_keyword(self) -> bool {
2972        self == kw::Super
2973            || self == kw::SelfLower
2974            || self == kw::SelfUpper
2975            || self == kw::Crate
2976            || self == kw::PathRoot
2977            || self == kw::DollarCrate
2978    }
2979
2980    /// Returns `true` if the symbol is `true` or `false`.
2981    pub fn is_bool_lit(self) -> bool {
2982        self == kw::True || self == kw::False
2983    }
2984
2985    /// Returns `true` if this symbol can be a raw identifier.
2986    pub fn can_be_raw(self) -> bool {
2987        self != sym::empty && self != kw::Underscore && !self.is_path_segment_keyword()
2988    }
2989
2990    /// Was this symbol index predefined in the compiler's `symbols!` macro?
2991    /// Note: this applies to both `Symbol`s and `ByteSymbol`s, which is why it
2992    /// takes a `u32` argument instead of a `&self` argument. Use with care.
2993    pub fn is_predefined(index: u32) -> bool {
2994        index < PREDEFINED_SYMBOLS_COUNT
2995    }
2996}
2997
2998impl Ident {
2999    /// Returns `true` for reserved identifiers used internally for elided lifetimes,
3000    /// unnamed method parameters, crate root module, error recovery etc.
3001    pub fn is_special(self) -> bool {
3002        self.name.is_special()
3003    }
3004
3005    /// Returns `true` if the token is a keyword used in the language.
3006    pub fn is_used_keyword(self) -> bool {
3007        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3008        self.name.is_used_keyword_always()
3009            || self.name.is_used_keyword_conditional(|| self.span.edition())
3010    }
3011
3012    /// Returns `true` if the token is a keyword reserved for possible future use.
3013    pub fn is_unused_keyword(self) -> bool {
3014        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3015        self.name.is_unused_keyword_always()
3016            || self.name.is_unused_keyword_conditional(|| self.span.edition())
3017    }
3018
3019    /// Returns `true` if the token is either a special identifier or a keyword.
3020    pub fn is_reserved(self) -> bool {
3021        // Note: `span.edition()` is relatively expensive, don't call it unless necessary.
3022        self.name.is_reserved(|| self.span.edition())
3023    }
3024
3025    /// A keyword or reserved identifier that can be used as a path segment.
3026    pub fn is_path_segment_keyword(self) -> bool {
3027        self.name.is_path_segment_keyword()
3028    }
3029
3030    /// We see this identifier in a normal identifier position, like variable name or a type.
3031    /// How was it written originally? Did it use the raw form? Let's try to guess.
3032    pub fn is_raw_guess(self) -> bool {
3033        self.name.can_be_raw() && self.is_reserved()
3034    }
3035
3036    /// Given the name of a lifetime without the first quote (`'`),
3037    /// returns whether the lifetime name is reserved (therefore invalid)
3038    pub fn is_reserved_lifetime(self) -> bool {
3039        self.is_reserved() && ![kw::Underscore, kw::Static].contains(&self.name)
3040    }
3041
3042    pub fn is_raw_lifetime_guess(self) -> bool {
3043        // Check that the name isn't just a single quote.
3044        // `self.without_first_quote()` would return empty ident, which triggers debug assert.
3045        if self.name.as_str() == "'" {
3046            return false;
3047        }
3048        let ident_without_apostrophe = self.without_first_quote();
3049        ident_without_apostrophe.name != self.name
3050            && ident_without_apostrophe.name.can_be_raw()
3051            && ident_without_apostrophe.is_reserved_lifetime()
3052    }
3053
3054    pub fn guess_print_mode(self) -> IdentPrintMode {
3055        if self.is_raw_lifetime_guess() {
3056            IdentPrintMode::RawLifetime
3057        } else if self.is_raw_guess() {
3058            IdentPrintMode::RawIdent
3059        } else {
3060            IdentPrintMode::Normal
3061        }
3062    }
3063
3064    /// Whether this would be the identifier for a tuple field like `self.0`, as
3065    /// opposed to a named field like `self.thing`.
3066    pub fn is_numeric(self) -> bool {
3067        self.as_str().bytes().all(|b| b.is_ascii_digit())
3068    }
3069}
3070
3071/// Collect all the keywords in a given edition into a vector.
3072///
3073/// *Note:* Please update this if a new keyword is added beyond the current
3074/// range.
3075pub fn used_keywords(edition: impl Copy + FnOnce() -> Edition) -> Vec<Symbol> {
3076    (kw::DollarCrate.as_u32()..kw::Yeet.as_u32())
3077        .filter_map(|kw| {
3078            let kw = Symbol::new(kw);
3079            if kw.is_used_keyword_always() || kw.is_used_keyword_conditional(edition) {
3080                Some(kw)
3081            } else {
3082                None
3083            }
3084        })
3085        .collect()
3086}