diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2024-03-12 06:29:04 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-12 06:29:04 +0100 |
| commit | cd2efff518699602b728678edfdf30506390640d (patch) | |
| tree | ed997f4081c51fa36f43d0cdb2997693d1f6091e | |
| parent | 0b127d82f3ec897996248c62589a8bcb827a4b53 (diff) | |
| parent | 0b6b3307fcd9faef6d32d09c5674795600e95a35 (diff) | |
| download | rust-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.rs | 4 | ||||
| -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.rs | 24 | ||||
| -rw-r--r-- | tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr | 11 | ||||
| -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 |
