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