Rollup merge of #142183 - Kivooeo:30904-test, r=compiler-errors
Added test for 30904
Test that was deleted by mistake in this commit
564c78a698 (diff-85d65712084246fc61f287664eef63b0b25ba0a5c8b69a4a59a9454b6a3ebac4)
The original issue is still open and the problem is not solved (if this is even a problem, but the error is still here at least)
This commit is contained in:
commit
29ef4c8742
2 changed files with 53 additions and 0 deletions
39
tests/ui/unboxed-closures/fn-traits-hrtb-coercion.rs
Normal file
39
tests/ui/unboxed-closures/fn-traits-hrtb-coercion.rs
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
//! Test for issue <github.com/rust-lang/rust/issues/30904>
|
||||
//! Related to higher-ranked lifetime inference with unboxed closures and FnOnce.
|
||||
|
||||
#![feature(fn_traits, unboxed_closures)]
|
||||
|
||||
fn test<F: for<'x> FnOnce<(&'x str,)>>(_: F) {}
|
||||
|
||||
struct Compose<F, G>(F, G);
|
||||
|
||||
impl<T, F, G> FnOnce<(T,)> for Compose<F, G>
|
||||
where
|
||||
F: FnOnce<(T,)>,
|
||||
G: FnOnce<(F::Output,)>,
|
||||
{
|
||||
type Output = G::Output;
|
||||
extern "rust-call" fn call_once(self, (x,): (T,)) -> G::Output {
|
||||
(self.1)((self.0)(x))
|
||||
}
|
||||
}
|
||||
|
||||
struct Str<'a>(&'a str);
|
||||
|
||||
fn mk_str<'a>(s: &'a str) -> Str<'a> {
|
||||
Str(s)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let _: for<'a> fn(&'a str) -> Str<'a> = mk_str;
|
||||
let _: for<'a> fn(&'a str) -> Str<'a> = Str;
|
||||
//~^ ERROR: mismatched types
|
||||
|
||||
test(|_: &str| {});
|
||||
test(mk_str);
|
||||
test(Str);
|
||||
|
||||
test(Compose(|_: &str| {}, |_| {}));
|
||||
test(Compose(mk_str, |_| {}));
|
||||
test(Compose(Str, |_| {}));
|
||||
}
|
||||
14
tests/ui/unboxed-closures/fn-traits-hrtb-coercion.stderr
Normal file
14
tests/ui/unboxed-closures/fn-traits-hrtb-coercion.stderr
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
error[E0308]: mismatched types
|
||||
--> $DIR/fn-traits-hrtb-coercion.rs:29:45
|
||||
|
|
||||
LL | let _: for<'a> fn(&'a str) -> Str<'a> = Str;
|
||||
| ------------------------------ ^^^ one type is more general than the other
|
||||
| |
|
||||
| expected due to this
|
||||
|
|
||||
= note: expected fn pointer `for<'a> fn(&'a _) -> Str<'a>`
|
||||
found struct constructor `fn(&_) -> Str<'_> {Str::<'_>}`
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue