about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBastian Kauschke <bastian_kauschke@hotmail.de>2020-12-31 15:35:21 +0100
committerBastian Kauschke <bastian_kauschke@hotmail.de>2021-01-21 17:35:44 +0100
commitf32a6acdab446d7fd018bb2a975769ae995aa4c7 (patch)
treed30acc8e09bf1282a77844a5dfb99a9247182831
parent339e19697a39a78f4d669c217b7d21109215de41 (diff)
downloadrust-f32a6acdab446d7fd018bb2a975769ae995aa4c7.tar.gz
rust-f32a6acdab446d7fd018bb2a975769ae995aa4c7.zip
require gat substs to be invariant
-rw-r--r--compiler/rustc_typeck/src/variance/constraints.rs19
-rw-r--r--src/test/ui/generic-associated-types/variance_constraints.rs24
2 files changed, 26 insertions, 17 deletions
diff --git a/compiler/rustc_typeck/src/variance/constraints.rs b/compiler/rustc_typeck/src/variance/constraints.rs
index a8fbdfb7c65..339eb5f9afc 100644
--- a/compiler/rustc_typeck/src/variance/constraints.rs
+++ b/compiler/rustc_typeck/src/variance/constraints.rs
@@ -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);
 
@@ -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) => {
diff --git a/src/test/ui/generic-associated-types/variance_constraints.rs b/src/test/ui/generic-associated-types/variance_constraints.rs
new file mode 100644
index 00000000000..36db80706b4
--- /dev/null
+++ b/src/test/ui/generic-associated-types/variance_constraints.rs
@@ -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() {}