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