Rollup merge of #119816 - oli-obk:tait_ice_unify_obligations, r=lcnr

Define hidden types in confirmation

fixes  #111470

r? `@lcnr` or `@compiler-errors`

explanation in the newly added test
This commit is contained in:
Matthias Krüger 2024-01-16 17:55:22 +01:00 committed by GitHub
commit d4b276caa4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 1 deletions

View File

@ -2466,7 +2466,7 @@ fn confirm_param_env_candidate<'cx, 'tcx>(
debug!(?cache_projection, ?obligation_projection);
match infcx.at(cause, param_env).eq(
DefineOpaqueTypes::No,
DefineOpaqueTypes::Yes,
cache_projection,
obligation_projection,
) {

View File

@ -0,0 +1,28 @@
// check-pass
// revisions: new old
//[new] compile-flags: -Znext-solver
//! This test checks that we can successfully infer
//! the hidden type of `FooImpl` to be `Foo<i32, {closure}>`
//! and `ImplT` to be `i32`. This test used to fail, because
//! we were unable to make the connection that the closure
//! argument is the same as the first argument of `Foo`.
#![feature(type_alias_impl_trait)]
use std::fmt::Debug;
use std::marker::PhantomData;
struct Foo<T: Debug, F: FnOnce(T)> {
f: F,
_phantom: PhantomData<T>,
}
type ImplT = impl Debug;
type FooImpl = Foo<ImplT, impl FnOnce(ImplT)>;
fn bar() -> FooImpl {
Foo::<i32, _> { f: |_| (), _phantom: PhantomData }
}
fn main() {}