Rollup merge of #120056 - oli-obk:arg_mismatch_ice, r=compiler-errors

Use FnOnceOutput instead of FnOnce where expected

fixes #119847
This commit is contained in:
Matthias Krüger 2024-01-17 20:21:24 +01:00 committed by GitHub
commit 99a8b6aa67
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 100 additions and 1 deletions

View File

@ -1013,7 +1013,7 @@ fn pretty_print_opaque_impl_type(
.extend( .extend(
// Group the return ty with its def id, if we had one. // Group the return ty with its def id, if we had one.
entry.return_ty.map(|ty| { 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`.