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