Use FnOnceOutput instead of FnOnce where expected

This commit is contained in:
Oli Scherer 2024-01-17 14:23:41 +00:00
parent 25b706cde3
commit d6b99b9c92
3 changed files with 100 additions and 1 deletions

View File

@ -1013,7 +1013,7 @@ pub trait PrettyPrinter<'tcx>: Printer<'tcx> + fmt::Write {
.extend(
// Group the return ty with its def id, if we had one.
entry.return_ty.map(|ty| {
(tcx.require_lang_item(LangItem::FnOnce, None), ty)
(tcx.require_lang_item(LangItem::FnOnceOutput, None), ty)
}),
);
}

View File

@ -0,0 +1,21 @@
//! This is a regression test to avoid an ICE in diagnostics code.
//! A typo in the compiler used to get the DefId of FnOnce, and
//! use it where an associated item was expected.
fn frob() -> impl Fn<P, Output = T> + '_ {}
//~^ ERROR missing lifetime specifier
//~| ERROR cannot find type `P`
//~| ERROR cannot find type `T`
//~| ERROR `Fn`-family traits' type parameters is subject to change
fn open_parent<'path>() {
todo!()
}
fn main() {
let old_path = frob("hello");
//~^ ERROR function takes 0 arguments
open_parent(&old_path)
//~^ ERROR function takes 0 arguments
}

View File

@ -0,0 +1,78 @@
error[E0106]: missing lifetime specifier
--> $DIR/opaque-used-in-extraneous-argument.rs:5:39
|
LL | fn frob() -> impl Fn<P, Output = T> + '_ {}
| ^^ expected named lifetime parameter
|
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
help: consider using the `'static` lifetime, but this is uncommon unless you're returning a borrowed value from a `const` or a `static`, or if you will only have owned values
|
LL | fn frob() -> impl Fn<P, Output = T> + 'static {}
| ~~~~~~~
error[E0412]: cannot find type `P` in this scope
--> $DIR/opaque-used-in-extraneous-argument.rs:5:22
|
LL | fn frob() -> impl Fn<P, Output = T> + '_ {}
| ^ not found in this scope
|
help: you might be missing a type parameter
|
LL | fn frob<P>() -> impl Fn<P, Output = T> + '_ {}
| +++
error[E0412]: cannot find type `T` in this scope
--> $DIR/opaque-used-in-extraneous-argument.rs:5:34
|
LL | fn frob() -> impl Fn<P, Output = T> + '_ {}
| ^ not found in this scope
|
help: you might be missing a type parameter
|
LL | fn frob<T>() -> impl Fn<P, Output = T> + '_ {}
| +++
error[E0658]: the precise format of `Fn`-family traits' type parameters is subject to change
--> $DIR/opaque-used-in-extraneous-argument.rs:5:19
|
LL | fn frob() -> impl Fn<P, Output = T> + '_ {}
| ^^^^^^^^^^^^^^^^^ help: use parenthetical notation instead: `Fn(P) -> T`
|
= note: see issue #29625 <https://github.com/rust-lang/rust/issues/29625> for more information
= help: add `#![feature(unboxed_closures)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
error[E0061]: this function takes 0 arguments but 1 argument was supplied
--> $DIR/opaque-used-in-extraneous-argument.rs:16:20
|
LL | let old_path = frob("hello");
| ^^^^ -------
| |
| unexpected argument of type `&'static str`
| help: remove the extra argument
|
note: function defined here
--> $DIR/opaque-used-in-extraneous-argument.rs:5:4
|
LL | fn frob() -> impl Fn<P, Output = T> + '_ {}
| ^^^^
error[E0061]: this function takes 0 arguments but 1 argument was supplied
--> $DIR/opaque-used-in-extraneous-argument.rs:19:5
|
LL | open_parent(&old_path)
| ^^^^^^^^^^^ ---------
| |
| unexpected argument of type `&impl FnOnce<{type error}, Output = {type error}> + Fn<{type error}> + 'static`
| help: remove the extra argument
|
note: function defined here
--> $DIR/opaque-used-in-extraneous-argument.rs:11:4
|
LL | fn open_parent<'path>() {
| ^^^^^^^^^^^
error: aborting due to 6 previous errors
Some errors have detailed explanations: E0061, E0106, E0412, E0658.
For more information about an error, try `rustc --explain E0061`.