rust/compiler/rustc_hir_analysis/src/bounds.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

86 lines
2.6 KiB
Rust
Raw Normal View History

//! Bounds are restrictions applied to some types after they've been converted into the
//! `ty` form from the HIR.
2022-12-26 04:19:27 +00:00
use rustc_hir::LangItem;
2023-06-17 07:59:56 +00:00
use rustc_middle::ty::Binder;
use rustc_middle::ty::{self, ToPredicate, Ty, TyCtxt};
use rustc_span::Span;
/// Collects together a list of type bounds. These lists of bounds occur in many places
/// in Rust's syntax:
///
/// ```text
/// trait Foo: Bar + Baz { }
/// ^^^^^^^^^ supertrait list bounding the `Self` type parameter
///
/// fn foo<T: Bar + Baz>() { }
/// ^^^^^^^^^ bounding the type parameter `T`
///
/// impl dyn Bar + Baz
2022-12-26 04:19:27 +00:00
/// ^^^^^^^^^ bounding the type-erased dynamic type
/// ```
///
/// Our representation is a bit mixed here -- in some cases, we
/// include the self type (e.g., `trait_bounds`) but in others we do not
#[derive(Default, PartialEq, Eq, Clone, Debug)]
pub struct Bounds<'tcx> {
2023-06-16 05:59:42 +00:00
pub predicates: Vec<(Binder<'tcx, ty::ClauseKind<'tcx>>, Span)>,
}
impl<'tcx> Bounds<'tcx> {
2022-12-26 04:19:27 +00:00
pub fn push_region_bound(
&mut self,
2023-06-17 07:59:56 +00:00
_tcx: TyCtxt<'tcx>,
2022-12-26 04:19:27 +00:00
region: ty::PolyTypeOutlivesPredicate<'tcx>,
span: Span,
) {
2023-06-16 05:59:42 +00:00
self.predicates.push((region.map_bound(|p| ty::ClauseKind::TypeOutlives(p)), span));
2022-12-26 04:19:27 +00:00
}
2022-12-26 04:19:27 +00:00
pub fn push_trait_bound(
&mut self,
2023-06-17 07:59:56 +00:00
_tcx: TyCtxt<'tcx>,
2022-12-26 04:19:27 +00:00
trait_ref: ty::PolyTraitRef<'tcx>,
span: Span,
constness: ty::BoundConstness,
2023-04-25 05:15:50 +00:00
polarity: ty::ImplPolarity,
2022-12-26 04:19:27 +00:00
) {
2023-04-25 05:15:50 +00:00
self.predicates.push((
2023-06-17 07:59:56 +00:00
trait_ref.map_bound(|trait_ref| {
2023-06-16 05:59:42 +00:00
ty::ClauseKind::Trait(ty::TraitPredicate { trait_ref, constness, polarity })
2023-06-17 07:59:56 +00:00
}),
2023-04-25 05:15:50 +00:00
span,
));
2022-12-26 04:19:27 +00:00
}
pub fn push_projection_bound(
&mut self,
2023-06-17 07:59:56 +00:00
_tcx: TyCtxt<'tcx>,
2022-12-26 04:19:27 +00:00
projection: ty::PolyProjectionPredicate<'tcx>,
span: Span,
) {
2023-06-16 05:59:42 +00:00
self.predicates.push((projection.map_bound(|proj| ty::ClauseKind::Projection(proj)), span));
2022-12-26 04:19:27 +00:00
}
pub fn push_sized(&mut self, tcx: TyCtxt<'tcx>, ty: Ty<'tcx>, span: Span) {
let sized_def_id = tcx.require_lang_item(LangItem::Sized, Some(span));
let trait_ref = ty::TraitRef::new(tcx, sized_def_id, [ty]);
2023-04-10 20:02:52 +00:00
// Preferable to put this obligation first, since we report better errors for sized ambiguity.
2023-06-17 07:59:56 +00:00
self.predicates.insert(
0,
(
2023-06-16 05:59:42 +00:00
ty::Binder::dummy(ty::ClauseKind::Trait(
trait_ref.without_const().to_predicate(tcx),
)),
2023-06-17 07:59:56 +00:00
span,
),
);
2022-12-26 04:19:27 +00:00
}
2023-06-16 05:59:42 +00:00
pub fn predicates(
&self,
) -> impl Iterator<Item = (Binder<'tcx, ty::ClauseKind<'tcx>>, Span)> + '_ {
2022-12-26 04:19:27 +00:00
self.predicates.iter().cloned()
}
}