about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_trait_selection/src/traits/project.rs2
-rw-r--r--tests/ui/type-alias-impl-trait/nested_inference_failure.rs26
2 files changed, 27 insertions, 1 deletions
diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs
index dd4e69efe37..abbc2066eac 100644
--- a/compiler/rustc_trait_selection/src/traits/project.rs
+++ b/compiler/rustc_trait_selection/src/traits/project.rs
@@ -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,
     ) {
diff --git a/tests/ui/type-alias-impl-trait/nested_inference_failure.rs b/tests/ui/type-alias-impl-trait/nested_inference_failure.rs
new file mode 100644
index 00000000000..16b78f18aa3
--- /dev/null
+++ b/tests/ui/type-alias-impl-trait/nested_inference_failure.rs
@@ -0,0 +1,26 @@
+// check-pass
+
+//! 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() {}