Skip to main content

rustc_span/
symbol.rs

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