rustc_interface/
limits.rs1use rustc_hir::attrs::AttributeKind;
12use rustc_hir::limit::Limit;
13use rustc_hir::{Attribute, find_attr};
14use rustc_middle::query::Providers;
15use rustc_session::Limits;
16
17pub(crate) fn provide(providers: &mut Providers) {
18 providers.limits = |tcx, ()| {
19 let attrs = tcx.hir_krate_attrs();
20 Limits {
21 recursion_limit: get_recursion_limit(tcx.hir_krate_attrs()),
22 move_size_limit:
23 find_attr!(attrs, AttributeKind::MoveSizeLimit { limit, .. } => *limit)
24 .unwrap_or(Limit::new(tcx.sess.opts.unstable_opts.move_size_limit.unwrap_or(0))),
25 type_length_limit:
26 find_attr!(attrs, AttributeKind::TypeLengthLimit { limit, .. } => *limit)
27 .unwrap_or(Limit::new(2usize.pow(24))),
28 pattern_complexity_limit:
29 find_attr!(attrs, AttributeKind::PatternComplexityLimit { limit, .. } => *limit)
30 .unwrap_or(Limit::unlimited()),
31 }
32 }
33}
34
35pub(crate) fn get_recursion_limit(attrs: &[Attribute]) -> Limit {
37 find_attr!(attrs, AttributeKind::RecursionLimit { limit, .. } => *limit)
38 .unwrap_or(Limit::new(128))
39}