From 2a1d4dd6e3204e24467143d228107058032b2962 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sun, 10 Mar 2024 22:32:55 -0400 Subject: [PATCH 1/2] Don't ICE when non-self part of trait goal is constrained in new solver --- .../src/solve/assembly/mod.rs | 4 +++- ...rmalize-self-type-constrains-trait-args.rs | 24 +++++++++++++++++++ ...ize-self-type-constrains-trait-args.stderr | 11 +++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.rs create mode 100644 tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.stderr diff --git a/compiler/rustc_trait_selection/src/solve/assembly/mod.rs b/compiler/rustc_trait_selection/src/solve/assembly/mod.rs index 3be53a6591dc6..9c7fa5216d766 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-self-type-constrains-trait-args.rs b/tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.rs new file mode 100644 index 0000000000000..0ece8f8321ce6 --- /dev/null +++ b/tests/ui/traits/next-solver/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); +trait Foo {} +impl Foo for Wr {} + +type Alias = (T,) + where Wr: Foo; + +fn hello() where Alias: Into<(T,)>, Wr: Foo {} + +fn main() { + // When calling `hello`, proving `Alias: Into<(?0,)>` will require + // normalizing the self type of the goal. This will emit the where + // clause `Wr: 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-self-type-constrains-trait-args.stderr b/tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.stderr new file mode 100644 index 0000000000000..5554f0ccc0aa7 --- /dev/null +++ b/tests/ui/traits/next-solver/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 for more information + = note: `#[warn(incomplete_features)]` on by default + +warning: 1 warning emitted + From 0b6b3307fcd9faef6d32d09c5674795600e95a35 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Mon, 11 Mar 2024 19:09:25 +0000 Subject: [PATCH 2/2] Move project -> normalize, move normalize tests --- .../{ => normalize}/normalize-async-closure-in-trait.rs | 0 .../traits/next-solver/{ => normalize}/normalize-param-env-1.rs | 0 .../traits/next-solver/{ => normalize}/normalize-param-env-2.rs | 0 .../next-solver/{ => normalize}/normalize-param-env-2.stderr | 0 .../traits/next-solver/{ => normalize}/normalize-param-env-3.rs | 0 .../next-solver/{ => normalize}/normalize-param-env-4.next.stderr | 0 .../traits/next-solver/{ => normalize}/normalize-param-env-4.rs | 0 .../next-solver/{ => normalize}/normalize-path-for-method.rs | 0 .../next-solver/{ => normalize}/normalize-rcvr-for-inherent.rs | 0 .../next-solver/{ => normalize}/normalize-region-obligations.rs | 0 .../{ => normalize}/normalize-self-type-constrains-trait-args.rs | 0 .../normalize-self-type-constrains-trait-args.stderr | 0 .../{ => normalize}/normalize-type-outlives-in-param-env.rs | 0 .../traits/next-solver/{ => normalize}/normalize-type-outlives.rs | 0 .../ui/traits/next-solver/{ => normalize}/normalize-unsize-rhs.rs | 0 .../next-solver/{ => normalize}/normalized-const-built-in-op.rs | 0 .../{projection => normalize}/param-env-trait-candidate-1.rs | 0 .../{projection => normalize}/param-env-trait-candidate-2.rs | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename tests/ui/traits/next-solver/{ => normalize}/normalize-async-closure-in-trait.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-param-env-1.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-param-env-2.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-param-env-2.stderr (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-param-env-3.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-param-env-4.next.stderr (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-param-env-4.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-path-for-method.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-rcvr-for-inherent.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-region-obligations.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-self-type-constrains-trait-args.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-self-type-constrains-trait-args.stderr (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-type-outlives-in-param-env.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-type-outlives.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalize-unsize-rhs.rs (100%) rename tests/ui/traits/next-solver/{ => normalize}/normalized-const-built-in-op.rs (100%) rename tests/ui/traits/next-solver/{projection => normalize}/param-env-trait-candidate-1.rs (100%) rename tests/ui/traits/next-solver/{projection => normalize}/param-env-trait-candidate-2.rs (100%) 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-async-closure-in-trait.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-param-env-1.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-param-env-2.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-param-env-2.stderr rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-param-env-3.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-param-env-4.next.stderr rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-param-env-4.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-path-for-method.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-rcvr-for-inherent.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-region-obligations.rs rename to tests/ui/traits/next-solver/normalize/normalize-region-obligations.rs diff --git a/tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.rs b/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.rs similarity index 100% rename from tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.rs rename to tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.rs diff --git a/tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.stderr b/tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr similarity index 100% rename from tests/ui/traits/next-solver/normalize-self-type-constrains-trait-args.stderr rename to tests/ui/traits/next-solver/normalize/normalize-self-type-constrains-trait-args.stderr 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-type-outlives-in-param-env.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-type-outlives.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalize-unsize-rhs.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/normalized-const-built-in-op.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/projection/param-env-trait-candidate-1.rs rename to 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 similarity index 100% rename from tests/ui/traits/next-solver/projection/param-env-trait-candidate-2.rs rename to tests/ui/traits/next-solver/normalize/param-env-trait-candidate-2.rs