Skip to content

Commit 5dc3fd7

Browse files
Include relation direction in AliasEq predicate
1 parent 439292b commit 5dc3fd7

File tree

16 files changed

+175
-36
lines changed

16 files changed

+175
-36
lines changed

compiler/rustc_infer/src/infer/combine.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,7 @@ pub trait ObligationEmittingRelation<'tcx>: TypeRelation<'tcx> {
842842
let (a, b) = if self.a_is_expected() { (a, b) } else { (b, a) };
843843

844844
self.register_predicates([ty::Binder::dummy(if self.tcx().trait_solver_next() {
845-
ty::PredicateKind::AliasEq(a.into(), b.into())
845+
ty::PredicateKind::AliasEq(a.into(), b.into(), ty::AliasRelationDirection::Equate)
846846
} else {
847847
ty::PredicateKind::ConstEquate(a, b)
848848
})]);
@@ -852,13 +852,15 @@ pub trait ObligationEmittingRelation<'tcx>: TypeRelation<'tcx> {
852852
///
853853
/// If they aren't equal then the relation doesn't hold.
854854
fn register_type_equate_obligation(&mut self, a: Ty<'tcx>, b: Ty<'tcx>) {
855-
let (a, b) = if self.a_is_expected() { (a, b) } else { (b, a) };
856-
857855
self.register_predicates([ty::Binder::dummy(ty::PredicateKind::AliasEq(
858856
a.into(),
859857
b.into(),
858+
self.alias_relate_direction(),
860859
))]);
861860
}
861+
862+
/// Relation direction emitted for `AliasEq` predicates
863+
fn alias_relate_direction(&self) -> ty::AliasRelationDirection;
862864
}
863865

864866
fn int_unification_error<'tcx>(

compiler/rustc_infer/src/infer/equate.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,4 +210,8 @@ impl<'tcx> ObligationEmittingRelation<'tcx> for Equate<'_, '_, 'tcx> {
210210
fn register_obligations(&mut self, obligations: PredicateObligations<'tcx>) {
211211
self.fields.register_obligations(obligations);
212212
}
213+
214+
fn alias_relate_direction(&self) -> ty::AliasRelationDirection {
215+
ty::AliasRelationDirection::Equate
216+
}
213217
}

compiler/rustc_infer/src/infer/glb.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,9 @@ impl<'tcx> ObligationEmittingRelation<'tcx> for Glb<'_, '_, 'tcx> {
155155
fn register_obligations(&mut self, obligations: PredicateObligations<'tcx>) {
156156
self.fields.register_obligations(obligations);
157157
}
158+
159+
fn alias_relate_direction(&self) -> ty::AliasRelationDirection {
160+
// FIXME(deferred_projection_equality): This isn't right, I think?
161+
ty::AliasRelationDirection::Equate
162+
}
158163
}

compiler/rustc_infer/src/infer/lub.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,4 +155,9 @@ impl<'tcx> ObligationEmittingRelation<'tcx> for Lub<'_, '_, 'tcx> {
155155
fn register_obligations(&mut self, obligations: PredicateObligations<'tcx>) {
156156
self.fields.register_obligations(obligations)
157157
}
158+
159+
fn alias_relate_direction(&self) -> ty::AliasRelationDirection {
160+
// FIXME(deferred_projection_equality): This isn't right, I think?
161+
ty::AliasRelationDirection::Equate
162+
}
158163
}

compiler/rustc_infer/src/infer/nll_relate/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,16 @@ where
777777
fn register_obligations(&mut self, obligations: PredicateObligations<'tcx>) {
778778
self.delegate.register_obligations(obligations);
779779
}
780+
781+
fn alias_relate_direction(&self) -> ty::AliasRelationDirection {
782+
match self.ambient_variance {
783+
ty::Variance::Covariant => ty::AliasRelationDirection::Subtype,
784+
ty::Variance::Contravariant => ty::AliasRelationDirection::Supertype,
785+
ty::Variance::Invariant => ty::AliasRelationDirection::Equate,
786+
// FIXME(deferred_projection_equality): Implement this when we trigger it
787+
ty::Variance::Bivariant => unreachable!(),
788+
}
789+
}
780790
}
781791

782792
/// When we encounter a binder like `for<..> fn(..)`, we actually have

compiler/rustc_infer/src/infer/sub.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,4 +236,8 @@ impl<'tcx> ObligationEmittingRelation<'tcx> for Sub<'_, '_, 'tcx> {
236236
fn register_obligations(&mut self, obligations: PredicateObligations<'tcx>) {
237237
self.fields.register_obligations(obligations);
238238
}
239+
240+
fn alias_relate_direction(&self) -> ty::AliasRelationDirection {
241+
ty::AliasRelationDirection::Subtype
242+
}
239243
}

compiler/rustc_middle/src/ty/flags.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ impl FlagComputation {
288288
self.add_ty(ty);
289289
}
290290
ty::PredicateKind::Ambiguous => {}
291-
ty::PredicateKind::AliasEq(t1, t2) => {
291+
ty::PredicateKind::AliasEq(t1, t2, _) => {
292292
self.add_term(t1);
293293
self.add_term(t2);
294294
}

compiler/rustc_middle/src/ty/mod.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,25 @@ pub enum PredicateKind<'tcx> {
640640
/// This predicate requires two terms to be equal to eachother.
641641
///
642642
/// Only used for new solver
643-
AliasEq(Term<'tcx>, Term<'tcx>),
643+
AliasEq(Term<'tcx>, Term<'tcx>, AliasRelationDirection),
644+
}
645+
646+
#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable)]
647+
#[derive(HashStable, Debug)]
648+
pub enum AliasRelationDirection {
649+
Equate,
650+
Subtype,
651+
Supertype,
652+
}
653+
654+
impl AliasRelationDirection {
655+
pub fn invert(self) -> Self {
656+
match self {
657+
AliasRelationDirection::Equate => AliasRelationDirection::Equate,
658+
AliasRelationDirection::Subtype => AliasRelationDirection::Supertype,
659+
AliasRelationDirection::Supertype => AliasRelationDirection::Subtype,
660+
}
661+
}
644662
}
645663

646664
/// The crate outlives map is computed during typeck and contains the
@@ -976,11 +994,11 @@ impl<'tcx> Term<'tcx> {
976994
}
977995
}
978996

979-
/// This function returns `None` for `AliasKind::Opaque`.
997+
/// This function returns the inner `AliasTy` if this term is a projection.
980998
///
981999
/// FIXME: rename `AliasTy` to `AliasTerm` and make sure we correctly
9821000
/// deal with constants.
983-
pub fn to_alias_term_no_opaque(&self, tcx: TyCtxt<'tcx>) -> Option<AliasTy<'tcx>> {
1001+
pub fn to_projection_term(&self, tcx: TyCtxt<'tcx>) -> Option<AliasTy<'tcx>> {
9841002
match self.unpack() {
9851003
TermKind::Ty(ty) => match ty.kind() {
9861004
ty::Alias(kind, alias_ty) => match kind {

compiler/rustc_middle/src/ty/print/pretty.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2847,7 +2847,8 @@ define_print_and_forward_display! {
28472847
p!("the type `", print(ty), "` is found in the environment")
28482848
}
28492849
ty::PredicateKind::Ambiguous => p!("ambiguous"),
2850-
ty::PredicateKind::AliasEq(t1, t2) => p!(print(t1), " == ", print(t2)),
2850+
// TODO
2851+
ty::PredicateKind::AliasEq(t1, t2, _) => p!(print(t1), " == ", print(t2)),
28512852
}
28522853
}
28532854

compiler/rustc_middle/src/ty/structural_impls.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,8 @@ impl<'tcx> fmt::Debug for ty::PredicateKind<'tcx> {
177177
write!(f, "TypeWellFormedFromEnv({:?})", ty)
178178
}
179179
ty::PredicateKind::Ambiguous => write!(f, "Ambiguous"),
180-
ty::PredicateKind::AliasEq(t1, t2) => write!(f, "AliasEq({t1:?}, {t2:?})"),
180+
// TODO
181+
ty::PredicateKind::AliasEq(t1, t2, _) => write!(f, "AliasEq({t1:?}, {t2:?})"),
181182
}
182183
}
183184
}
@@ -250,6 +251,7 @@ TrivialTypeTraversalAndLiftImpls! {
250251
crate::ty::AssocItem,
251252
crate::ty::AssocKind,
252253
crate::ty::AliasKind,
254+
crate::ty::AliasRelationDirection,
253255
crate::ty::Placeholder<crate::ty::BoundRegionKind>,
254256
crate::ty::Placeholder<crate::ty::BoundTyKind>,
255257
crate::ty::ClosureKind,

0 commit comments

Comments
 (0)