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