}
}
Err(e) => {
- span_bug!(
- obligation.cause.span,
- "Failed to unify obligation `{:?}` \
- with poly_projection `{:?}`: {:?}",
+ let msg = format!(
+ "Failed to unify obligation `{:?}` with poly_projection `{:?}`: {:?}",
obligation,
poly_cache_entry,
- e);
+ e,
+ );
+ debug!("confirm_param_env_candidate: {}", msg);
+ infcx.tcx.sess.delay_span_bug(obligation.cause.span, &msg);
+ Progress {
+ ty: infcx.tcx.types.err,
+ obligations: vec![],
+ }
}
}
}
--- /dev/null
+pub trait Trait<'a> {
+ type Item;
+}
+
+impl<'a> Trait<'a> for () {
+ type Item = ();
+}
+
+pub fn foo<T, F>(_: T, _: F)
+where T: for<'a> Trait<'a>,
+ F: for<'a> FnMut(<T as Trait<'a>>::Item) {}
+
+fn main() {
+ foo((), drop)
+ //~^ ERROR type mismatch in function arguments
+ //~| ERROR type mismatch resolving
+}
--- /dev/null
+error[E0631]: type mismatch in function arguments
+ --> $DIR/issue-60283.rs:14:5
+ |
+LL | foo((), drop)
+ | ^^^
+ | |
+ | expected signature of `for<'a> fn(<() as Trait<'a>>::Item) -> _`
+ | found signature of `fn(_) -> _`
+ |
+note: required by `foo`
+ --> $DIR/issue-60283.rs:9:1
+ |
+LL | / pub fn foo<T, F>(_: T, _: F)
+LL | | where T: for<'a> Trait<'a>,
+LL | | F: for<'a> FnMut(<T as Trait<'a>>::Item) {}
+ | |_________________________________________________^
+
+error[E0271]: type mismatch resolving `for<'a> <fn(_) {std::mem::drop::<_>} as std::ops::FnOnce<(<() as Trait<'a>>::Item,)>>::Output == ()`
+ --> $DIR/issue-60283.rs:14:5
+ |
+LL | foo((), drop)
+ | ^^^ expected bound lifetime parameter 'a, found concrete lifetime
+ |
+note: required by `foo`
+ --> $DIR/issue-60283.rs:9:1
+ |
+LL | / pub fn foo<T, F>(_: T, _: F)
+LL | | where T: for<'a> Trait<'a>,
+LL | | F: for<'a> FnMut(<T as Trait<'a>>::Item) {}
+ | |_________________________________________________^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0271`.