1use std::sync::LazyLock;
4
5use rustc_data_structures::fx::FxHashSet;
6use rustc_span::{Symbol, sym};
7
8use crate::Features;
9
10type GateFn = fn(&Features) -> bool;
11
12pub type GatedCfg = (Symbol, Symbol, GateFn);
13
14const GATED_CFGS: &[GatedCfg] = &[
16 (sym::overflow_checks, sym::cfg_overflow_checks, Features::cfg_overflow_checks),
18 (sym::ub_checks, sym::cfg_ub_checks, Features::cfg_ub_checks),
19 (sym::contract_checks, sym::cfg_contract_checks, Features::cfg_contract_checks),
20 (sym::target_thread_local, sym::cfg_target_thread_local, Features::cfg_target_thread_local),
21 (
22 sym::target_has_atomic_load_store,
23 sym::cfg_target_has_atomic,
24 Features::cfg_target_has_atomic,
25 ),
26 (sym::sanitize, sym::cfg_sanitize, Features::cfg_sanitize),
27 (sym::version, sym::cfg_version, Features::cfg_version),
28 (sym::relocation_model, sym::cfg_relocation_model, Features::cfg_relocation_model),
29 (sym::sanitizer_cfi_generalize_pointers, sym::cfg_sanitizer_cfi, Features::cfg_sanitizer_cfi),
30 (sym::sanitizer_cfi_normalize_integers, sym::cfg_sanitizer_cfi, Features::cfg_sanitizer_cfi),
31 (sym::fmt_debug, sym::fmt_debug, Features::fmt_debug),
33 (
34 sym::target_has_reliable_f16,
35 sym::cfg_target_has_reliable_f16_f128,
36 Features::cfg_target_has_reliable_f16_f128,
37 ),
38 (
39 sym::target_has_reliable_f16_math,
40 sym::cfg_target_has_reliable_f16_f128,
41 Features::cfg_target_has_reliable_f16_f128,
42 ),
43 (
44 sym::target_has_reliable_f16b,
45 sym::cfg_target_has_reliable_f16b,
46 Features::cfg_target_has_reliable_f16b,
47 ),
48 (
49 sym::target_has_reliable_f128,
50 sym::cfg_target_has_reliable_f16_f128,
51 Features::cfg_target_has_reliable_f16_f128,
52 ),
53 (
54 sym::target_has_reliable_f128_math,
55 sym::cfg_target_has_reliable_f16_f128,
56 Features::cfg_target_has_reliable_f16_f128,
57 ),
58 (sym::target_has_threads, sym::cfg_target_has_threads, Features::cfg_target_has_threads),
59 (sym::target_object_format, sym::cfg_target_object_format, Features::cfg_target_object_format),
60];
61
62pub fn find_gated_cfg(name: Symbol) -> Option<&'static GatedCfg> {
64 GATED_CFGS.iter().find(|(cfg_sym, ..)| name == *cfg_sym)
65}
66
67#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
for AttributeStability {
}
#[automatically_derived]impl ::core::clone::Clone for AttributeStability {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Symbol>;
let _: ::core::clone::AssertParamIsClone<&'static [&'static str]>;
*self
}
}Clone, #[automatically_derived]impl ::core::fmt::Debug for AttributeStability {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Unstable { gate_name: __self_0, notes: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Unstable gate_name notes", __self_0, &__self_1),
Self::Stable => ::core::fmt::Formatter::write_str(f, "Stable"),
}
}
}Debug, #[automatically_derived]impl ::core::marker::Copy for AttributeStability { }Copy)]
68pub enum AttributeStability {
69 Unstable {
71 gate_name: Symbol,
73 notes: &'static [&'static str],
76 },
77 Stable,
79}
80
81#[rustfmt::skip]
83pub static BUILTIN_ATTRIBUTES: &[Symbol] = &[
84 sym::cfg,
90 sym::cfg_attr,
91
92 sym::ignore,
94 sym::should_panic,
95
96 sym::automatically_derived,
98 sym::macro_use,
99 sym::macro_escape, sym::macro_export,
101 sym::proc_macro,
102 sym::proc_macro_derive,
103 sym::proc_macro_attribute,
104
105 sym::warn,
107 sym::allow,
108 sym::expect,
109 sym::forbid,
110 sym::deny,
111 sym::must_use,
112 sym::must_not_suspend,
113 sym::deprecated,
114
115 sym::crate_name,
117 sym::crate_type,
118
119 sym::link,
121 sym::link_name,
122 sym::no_link,
123 sym::repr,
124 sym::rustc_align,
126 sym::rustc_align_static,
127 sym::export_name,
128 sym::link_section,
129 sym::no_mangle,
130 sym::used,
131 sym::link_ordinal,
132 sym::naked,
133 sym::rustc_pass_indirectly_in_non_rustic_abis,
135
136 sym::recursion_limit,
138 sym::type_length_limit,
139 sym::move_size_limit,
140
141 sym::no_main,
143
144 sym::path,
146 sym::no_std,
147 sym::no_implicit_prelude,
148 sym::non_exhaustive,
149
150 sym::windows_subsystem,
152 sym::panic_handler, sym::inline,
156 sym::cold,
157 sym::no_builtins,
158 sym::target_feature,
159 sym::track_caller,
160 sym::instruction_set,
161 sym::force_target_feature,
162 sym::sanitize,
163 sym::coverage,
164 sym::optimize,
165
166 sym::doc,
167
168 sym::debugger_visualizer,
170 sym::collapse_debuginfo,
171
172 sym::export_stable,
178
179 sym::test_runner,
181
182 sym::reexport_test_harness_main,
183
184 sym::marker,
186 sym::thread_local,
187 sym::no_core,
188
189 sym::ffi_pure,
190 sym::ffi_const,
191 sym::register_attribute_tool,
192 sym::register_lint_tool,
193 sym::register_tool,
194 sym::cfi_encoding,
196
197 sym::coroutine,
199
200 sym::patchable_function_entry,
203
204 sym::const_continue,
209 sym::loop_match,
210
211 sym::pin_v2,
216
217 sym::rustc_splat,
222
223 sym::rustc_unroll,
229
230 sym::instrument_fn,
235
236 sym::rustc_unchecked_type_alias,
239
240 sym::feature,
245 sym::stable,
247 sym::unstable,
248 sym::unstable_feature_bound,
249 sym::unstable_removed,
250 sym::rustc_const_unstable,
251 sym::rustc_const_stable,
252 sym::rustc_default_body_unstable,
253 sym::allow_internal_unstable,
254 sym::allow_internal_unsafe,
255 sym::rustc_eii_foreign_item,
256 sym::rustc_allowed_through_unstable_modules,
257 sym::rustc_deprecated_safe_2024,
258 sym::rustc_pub_transparent,
259
260 sym::fundamental,
265 sym::may_dangle,
266
267 sym::rustc_allocator,
272 sym::rustc_nounwind,
273 sym::rustc_reallocator,
274 sym::rustc_deallocator,
275 sym::rustc_allocator_zeroed,
276 sym::rustc_allocator_zeroed_variant,
277 sym::default_lib_allocator,
278 sym::needs_allocator,
279 sym::panic_runtime,
280 sym::needs_panic_runtime,
281 sym::compiler_builtins,
282 sym::profiler_runtime,
283
284 sym::linkage,
289 sym::rustc_std_internal_symbol,
290 sym::rustc_objc_class,
291 sym::rustc_objc_selector,
292
293 sym::rustc_builtin_macro,
298 sym::rustc_proc_macro_decls,
299 sym::rustc_macro_transparency,
300 sym::rustc_autodiff,
301 sym::rustc_offload_kernel,
302
303 sym::rustc_on_unimplemented,
308 sym::rustc_confusables,
309 sym::rustc_conversion_suggestion,
311 sym::rustc_trivial_field_reads,
314 sym::rustc_lint_query_instability,
317 sym::rustc_lint_untracked_query_information,
320 sym::rustc_lint_opt_ty,
323 sym::rustc_lint_opt_deny_field_access,
326 sym::rustc_diagnostic_opaque,
327 sym::rustc_assert_variance,
328
329 sym::rustc_always_gca,
334 sym::rustc_promotable,
335 sym::rustc_legacy_const_generics,
336 sym::rustc_do_not_const_check,
338 sym::rustc_const_stable_indirect,
339 sym::rustc_intrinsic_const_stable_indirect,
340 sym::rustc_allow_const_fn_unstable,
341
342 sym::rustc_simd_monomorphize_lane_limit,
347 sym::rustc_nonnull_optimization_guaranteed,
348
349 sym::lang,
353 sym::rustc_as_ptr,
354 sym::rustc_should_not_be_called_on_const_items,
355 sym::rustc_pass_by_value,
356 sym::rustc_never_returns_null_ptr,
357 sym::rustc_no_implicit_autorefs,
358 sym::rustc_coherence_is_core,
359 sym::rustc_coinductive,
360 sym::rustc_comptime,
361 sym::rustc_allow_incoherent_impl,
362 sym::rustc_preserve_ub_checks,
363 sym::rustc_deny_explicit_impl,
364 sym::rustc_dyn_incompatible_trait,
365 sym::rustc_has_incoherent_inherent_impls,
366 sym::rustc_non_const_trait_method,
367 sym::rustc_panics_when_zero,
368
369 sym::rustc_canonical_symbol,
370 sym::rustc_diagnostic_item,
371 sym::prelude_import,
372 sym::rustc_paren_sugar,
373 sym::rustc_inherit_overflow_checks,
374 sym::rustc_test_marker,
375 sym::rustc_allow_lifetime_dependent_specialization,
376 sym::rustc_specialization_trait,
377 sym::rustc_main,
378 sym::rustc_skip_during_method_dispatch,
379 sym::rustc_must_implement_one_of,
380 sym::rustc_doc_primitive,
381 sym::rustc_intrinsic,
382 sym::rustc_no_mir_inline,
383 sym::rustc_force_inline,
384 sym::rustc_scalable_vector,
385 sym::rustc_must_match_exhaustively,
386 sym::rustc_no_writable,
387
388 sym::rustc_show_spans,
393 sym::rustc_effective_visibility,
394 sym::rustc_dump_inferred_outlives,
395 sym::rustc_capture_analysis,
396 sym::rustc_insignificant_dtor,
397 sym::rustc_no_implicit_bounds,
398 sym::rustc_strict_coherence,
399 sym::rustc_dump_variances,
400 sym::rustc_dump_variances_of_opaques,
401 sym::rustc_dump_generics,
402 sym::rustc_dump_hidden_type_of_opaques,
403 sym::rustc_dump_layout,
404 sym::rustc_abi,
405 sym::rustc_regions,
406 sym::rustc_delayed_bug_from_inside_query,
407 sym::rustc_dump_user_args,
408 sym::rustc_evaluate_where_clauses,
409 sym::rustc_if_this_changed,
410 sym::rustc_then_this_would_need,
411 sym::rustc_clean,
412 sym::rustc_partition_reused,
413 sym::rustc_partition_codegened,
414 sym::rustc_expected_cgu_reuse,
415 sym::rustc_dump_symbol_name,
416 sym::rustc_dump_def_path,
417 sym::rustc_mir,
418 sym::custom_mir,
419 sym::rustc_dump_item_bounds,
420 sym::rustc_dump_clauses,
421 sym::rustc_dump_def_parents,
422 sym::rustc_dump_object_lifetime_defaults,
423 sym::rustc_dump_vtable,
424 sym::rustc_dummy,
425 sym::pattern_complexity_limit,
426];
427
428pub fn is_builtin_attr_name(name: Symbol) -> bool {
429 BUILTIN_ATTRIBUTE_SET.contains(&name)
430}
431
432pub static BUILTIN_ATTRIBUTE_SET: LazyLock<FxHashSet<Symbol>> = LazyLock::new(|| {
433 let mut set = FxHashSet::default();
434 for attr in BUILTIN_ATTRIBUTES.iter() {
435 if !set.insert(*attr) {
436 {
::core::panicking::panic_fmt(format_args!("duplicate builtin attribute `{0}`",
attr));
};panic!("duplicate builtin attribute `{}`", attr);
437 }
438 }
439 set
440});