diff --git a/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs b/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs index 9822e8cdef8b2..16d576d66f840 100644 --- a/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs +++ b/compiler/rustc_trait_selection/src/error_reporting/infer/mod.rs @@ -2261,6 +2261,7 @@ impl<'a, 'tcx> TypeErrCtxt<'a, 'tcx> { /// Float types, respectively). When comparing two ADTs, these rules apply recursively. pub fn same_type_modulo_infer>>(&self, a: T, b: T) -> bool { let (a, b) = self.resolve_vars_if_possible((a, b)); + let (a, b) = ty::set_aliases_to_non_rigid(self.tcx, (a, b)).skip_norm_wip(); SameTypeModuloInfer(self).relate(a, b).is_ok() } } diff --git a/tests/ui/traits/next-solver/rigid-alias-in-same-type-modulo-infer-158773.rs b/tests/ui/traits/next-solver/rigid-alias-in-same-type-modulo-infer-158773.rs new file mode 100644 index 0000000000000..d1d7f3b127352 --- /dev/null +++ b/tests/ui/traits/next-solver/rigid-alias-in-same-type-modulo-infer-158773.rs @@ -0,0 +1,17 @@ +// Regression test for #158773. +// This test is cited from #158773. +//@ compile-flags: -Znext-solver=globally + +trait HasLifetime { + type AtLifetime<'a>; +} + +pub struct ExistentialLifetime(S::AtLifetime<'static>); + +impl ExistentialLifetime { + fn new() -> ExistentialLifetime { + ExistentialLifetime(ExistentialLifetime(())) //~ ERROR: type mismatch resolving `::AtLifetime<'static> == ExistentialLifetime<_>` [E0271] + } +} + +fn main() {} diff --git a/tests/ui/traits/next-solver/rigid-alias-in-same-type-modulo-infer-158773.stderr b/tests/ui/traits/next-solver/rigid-alias-in-same-type-modulo-infer-158773.stderr new file mode 100644 index 0000000000000..3c770a66cb734 --- /dev/null +++ b/tests/ui/traits/next-solver/rigid-alias-in-same-type-modulo-infer-158773.stderr @@ -0,0 +1,16 @@ +error[E0271]: type mismatch resolving `::AtLifetime<'static> == ExistentialLifetime<_>` + --> $DIR/rigid-alias-in-same-type-modulo-infer-158773.rs:13:9 + | +LL | ... ExistentialLifetime(ExistentialLifetime(())) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `ExistentialLifetime<_>`, found associated type + | + = note: expected struct `ExistentialLifetime<_>` + found associated type `::AtLifetime<'static>` +help: consider constraining the associated type `::AtLifetime<'static>` to `ExistentialLifetime<_>` + | +LL | impl = ExistentialLifetime<_>>> ExistentialLifetime { + | ++++++++++++++++++++++++++++++++++++++++++++++ + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0271`.