Skip to content

Commit

Permalink
Auto merge of #80558 - lcnr:gat-variance, r=matthewjasper
Browse files Browse the repository at this point in the history
require gat substs to be invariant

fixes #69184, fixes #80766

r? `@matthewjasper` probably
  • Loading branch information
bors committed Jan 22, 2021
2 parents 25f39fe + f32a6ac commit bbc01bb
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
19 changes: 2 additions & 17 deletions compiler/rustc_typeck/src/variance/constraints.rs
Original file line number Diff line number Diff line change
Expand Up @@ -207,27 +207,13 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
}
}

fn add_constraints_from_trait_ref(
&mut self,
current: &CurrentItem,
trait_ref: ty::TraitRef<'tcx>,
variance: VarianceTermPtr<'a>,
) {
debug!("add_constraints_from_trait_ref: trait_ref={:?} variance={:?}", trait_ref, variance);
self.add_constraints_from_invariant_substs(current, trait_ref.substs, variance);
}

#[instrument(skip(self, current))]
fn add_constraints_from_invariant_substs(
&mut self,
current: &CurrentItem,
substs: SubstsRef<'tcx>,
variance: VarianceTermPtr<'a>,
) {
debug!(
"add_constraints_from_invariant_substs: substs={:?} variance={:?}",
substs, variance
);

// Trait are always invariant so we can take advantage of that.
let variance_i = self.invariant(variance);

Expand Down Expand Up @@ -300,8 +286,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
}

ty::Projection(ref data) => {
let tcx = self.tcx();
self.add_constraints_from_trait_ref(current, data.trait_ref(tcx), variance);
self.add_constraints_from_invariant_substs(current, data.substs, variance);
}

ty::Opaque(_, substs) => {
Expand Down
24 changes: 24 additions & 0 deletions src/test/ui/generic-associated-types/variance_constraints.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// check-pass
// issue #69184
#![feature(generic_associated_types)]
#![allow(incomplete_features)]

trait A {
type B<'a>;

fn make_b<'a>(&'a self) -> Self::B<'a>;
}

struct S {}
impl A for S {
type B<'a> = &'a S;
fn make_b<'a>(&'a self) -> &'a Self {
self
}
}

enum E<'a> {
S(<S as A>::B<'a>),
}

fn main() {}

0 comments on commit bbc01bb

Please sign in to comment.