about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2024-03-12 06:29:04 +0100
committerGitHub <noreply@github.com>2024-03-12 06:29:04 +0100
commitcd2efff518699602b728678edfdf30506390640d (patch)
treeed997f4081c51fa36f43d0cdb2997693d1f6091e
parent0b127d82f3ec897996248c62589a8bcb827a4b53 (diff)
parent0b6b3307fcd9faef6d32d09c5674795600e95a35 (diff)
downloadrust-cd2efff518699602b728678edfdf30506390640d.tar.gz
rust-cd2efff518699602b728678edfdf30506390640d.zip
Rollup merge of #122319 - compiler-errors:next-solver-normalizing-self-constrains-args, r=lcnr
Don't ICE when non-self part of trait goal is constrained in new solver

Self-explanatory. See test for example when this can happen.
-rw-r--r--compiler/rustc_trait_selection/src/solve/assembly/mod.rs4
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-async-closure-in-trait.rs (renamed from tests/ui/traits/next-solver/normalize-async-closure-in-trait.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-param-env-1.rs (renamed from tests/ui/traits/next-solver/normalize-param-env-1.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-param-env-2.rs (renamed from tests/ui/traits/next-solver/normalize-param-env-2.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-param-env-2.stderr (renamed from tests/ui/traits/next-solver/normalize-param-env-2.stderr)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-param-env-3.rs (renamed from tests/ui/traits/next-solver/normalize-param-env-3.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-param-env-4.next.stderr (renamed from tests/ui/traits/next-solver/normalize-param-env-4.next.stderr)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-param-env-4.rs (renamed from tests/ui/traits/next-solver/normalize-param-env-4.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-path-for-method.rs (renamed from tests/ui/traits/next-solver/normalize-path-for-method.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-rcvr-for-inherent.rs (renamed from tests/ui/traits/next-solver/normalize-rcvr-for-inherent.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-region-obligations.rs (renamed from tests/ui/traits/next-solver/normalize-region-obligations.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.rs24
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr11
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-type-outlives-in-param-env.rs (renamed from tests/ui/traits/next-solver/normalize-type-outlives-in-param-env.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-type-outlives.rs (renamed from tests/ui/traits/next-solver/normalize-type-outlives.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalize-unsize-rhs.rs (renamed from tests/ui/traits/next-solver/normalize-unsize-rhs.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/normalized-const-built-in-op.rs (renamed from tests/ui/traits/next-solver/normalized-const-built-in-op.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/param-env-trait-candidate-1.rs (renamed from tests/ui/traits/next-solver/projection/param-env-trait-candidate-1.rs)0
-rw-r--r--tests/ui/traits/next-solver/normalize/param-env-trait-candidate-2.rs (renamed from tests/ui/traits/next-solver/projection/param-env-trait-candidate-2.rs)0
19 files changed, 38 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/solve/assembly/mod.rs b/compiler/rustc_trait_selection/src/solve/assembly/mod.rs
index 3be53a6591d..9c7fa5216d7 100644
--- a/compiler/rustc_trait_selection/src/solve/assembly/mod.rs
+++ b/compiler/rustc_trait_selection/src/solve/assembly/mod.rs
@@ -274,7 +274,9 @@ impl<'tcx> EvalCtxt<'_, 'tcx> {
 
         let goal =
             goal.with(self.tcx(), goal.predicate.with_self_ty(self.tcx(), normalized_self_ty));
-        debug_assert_eq!(goal, self.resolve_vars_if_possible(goal));
+        // Vars that show up in the rest of the goal substs may have been constrained by
+        // normalizing the self type as well, since type variables are not uniquified.
+        let goal = self.resolve_vars_if_possible(goal);
 
         let mut candidates = vec![];
 
diff --git a/tests/ui/traits/next-solver/normalize-async-closure-in-trait.rs b/tests/ui/traits/next-solver/normalize/normalize-async-closure-in-trait.rs
index 8cdde4f4d51..8cdde4f4d51 100644
--- a/tests/ui/traits/next-solver/normalize-async-closure-in-trait.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-async-closure-in-trait.rs
diff --git a/tests/ui/traits/next-solver/normalize-param-env-1.rs b/tests/ui/traits/next-solver/normalize/normalize-param-env-1.rs
index 6f5fdd561f4..6f5fdd561f4 100644
--- a/tests/ui/traits/next-solver/normalize-param-env-1.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-param-env-1.rs
diff --git a/tests/ui/traits/next-solver/normalize-param-env-2.rs b/tests/ui/traits/next-solver/normalize/normalize-param-env-2.rs
index bc387ff6d1c..bc387ff6d1c 100644
--- a/tests/ui/traits/next-solver/normalize-param-env-2.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-param-env-2.rs
diff --git a/tests/ui/traits/next-solver/normalize-param-env-2.stderr b/tests/ui/traits/next-solver/normalize/normalize-param-env-2.stderr
index 74a0a90885d..74a0a90885d 100644
--- a/tests/ui/traits/next-solver/normalize-param-env-2.stderr
+++ b/tests/ui/traits/next-solver/normalize/normalize-param-env-2.stderr
diff --git a/tests/ui/traits/next-solver/normalize-param-env-3.rs b/tests/ui/traits/next-solver/normalize/normalize-param-env-3.rs
index 9d895df5d3e..9d895df5d3e 100644
--- a/tests/ui/traits/next-solver/normalize-param-env-3.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-param-env-3.rs
diff --git a/tests/ui/traits/next-solver/normalize-param-env-4.next.stderr b/tests/ui/traits/next-solver/normalize/normalize-param-env-4.next.stderr
index e91a48f62ae..e91a48f62ae 100644
--- a/tests/ui/traits/next-solver/normalize-param-env-4.next.stderr
+++ b/tests/ui/traits/next-solver/normalize/normalize-param-env-4.next.stderr
diff --git a/tests/ui/traits/next-solver/normalize-param-env-4.rs b/tests/ui/traits/next-solver/normalize/normalize-param-env-4.rs
index ed7f6899bde..ed7f6899bde 100644
--- a/tests/ui/traits/next-solver/normalize-param-env-4.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-param-env-4.rs
diff --git a/tests/ui/traits/next-solver/normalize-path-for-method.rs b/tests/ui/traits/next-solver/normalize/normalize-path-for-method.rs
index bbb66574ea3..bbb66574ea3 100644
--- a/tests/ui/traits/next-solver/normalize-path-for-method.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-path-for-method.rs
diff --git a/tests/ui/traits/next-solver/normalize-rcvr-for-inherent.rs b/tests/ui/traits/next-solver/normalize/normalize-rcvr-for-inherent.rs
index 8e6c6866635..8e6c6866635 100644
--- a/tests/ui/traits/next-solver/normalize-rcvr-for-inherent.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-rcvr-for-inherent.rs
diff --git a/tests/ui/traits/next-solver/normalize-region-obligations.rs b/tests/ui/traits/next-solver/normalize/normalize-region-obligations.rs
index 7bf3274f9c6..7bf3274f9c6 100644
--- a/tests/ui/traits/next-solver/normalize-region-obligations.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-region-obligations.rs
diff --git a/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.rs b/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.rs
new file mode 100644
index 00000000000..0ece8f8321c
--- /dev/null
+++ b/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.rs
@@ -0,0 +1,24 @@
+//@ check-pass
+
+// This goal is also possible w/ a GAT, but lazy_type_alias
+// makes the behavior a bit more readable.
+#![feature(lazy_type_alias)]
+//~^ WARN the feature `lazy_type_alias` is incomplete
+
+struct Wr<T>(T);
+trait Foo {}
+impl Foo for Wr<i32> {}
+
+type Alias<T> = (T,)
+    where Wr<T>: Foo;
+
+fn hello<T>() where Alias<T>: Into<(T,)>, Wr<T>: Foo {}
+
+fn main() {
+    // When calling `hello`, proving `Alias<?0>: Into<(?0,)>` will require
+    // normalizing the self type of the goal. This will emit the where
+    // clause `Wr<?0>: Foo`, which constrains `?0` in both the self type
+    // *and* the non-self part of the goal. That used to trigger a debug
+    // assertion.
+    hello::<_>();
+}
diff --git a/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr b/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr
new file mode 100644
index 00000000000..5554f0ccc0a
--- /dev/null
+++ b/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr
@@ -0,0 +1,11 @@
+warning: the feature `lazy_type_alias` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/normalize-self-type-constrains-trait-args.rs:5:12
+   |
+LL | #![feature(lazy_type_alias)]
+   |            ^^^^^^^^^^^^^^^
+   |
+   = note: see issue #112792 <https://github.com/rust-lang/rust/issues/112792> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/traits/next-solver/normalize-type-outlives-in-param-env.rs b/tests/ui/traits/next-solver/normalize/normalize-type-outlives-in-param-env.rs
index 6f2756d8524..6f2756d8524 100644
--- a/tests/ui/traits/next-solver/normalize-type-outlives-in-param-env.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-type-outlives-in-param-env.rs
diff --git a/tests/ui/traits/next-solver/normalize-type-outlives.rs b/tests/ui/traits/next-solver/normalize/normalize-type-outlives.rs
index 6c633b58aed..6c633b58aed 100644
--- a/tests/ui/traits/next-solver/normalize-type-outlives.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-type-outlives.rs
diff --git a/tests/ui/traits/next-solver/normalize-unsize-rhs.rs b/tests/ui/traits/next-solver/normalize/normalize-unsize-rhs.rs
index dc5912b123a..dc5912b123a 100644
--- a/tests/ui/traits/next-solver/normalize-unsize-rhs.rs
+++ b/tests/ui/traits/next-solver/normalize/normalize-unsize-rhs.rs
diff --git a/tests/ui/traits/next-solver/normalized-const-built-in-op.rs b/tests/ui/traits/next-solver/normalize/normalized-const-built-in-op.rs
index d82e0b8d43f..d82e0b8d43f 100644
--- a/tests/ui/traits/next-solver/normalized-const-built-in-op.rs
+++ b/tests/ui/traits/next-solver/normalize/normalized-const-built-in-op.rs
diff --git a/tests/ui/traits/next-solver/projection/param-env-trait-candidate-1.rs b/tests/ui/traits/next-solver/normalize/param-env-trait-candidate-1.rs
index 6ca8982c4fa..6ca8982c4fa 100644
--- a/tests/ui/traits/next-solver/projection/param-env-trait-candidate-1.rs
+++ b/tests/ui/traits/next-solver/normalize/param-env-trait-candidate-1.rs
diff --git a/tests/ui/traits/next-solver/projection/param-env-trait-candidate-2.rs b/tests/ui/traits/next-solver/normalize/param-env-trait-candidate-2.rs
index 874372918de..874372918de 100644
--- a/tests/ui/traits/next-solver/projection/param-env-trait-candidate-2.rs
+++ b/tests/ui/traits/next-solver/normalize/param-env-trait-candidate-2.rs