Skip to content

Commit

Permalink
Rollup merge of rust-lang#120056 - oli-obk:arg_mismatch_ice, r=compil…
Browse files Browse the repository at this point in the history
…er-errors

Use FnOnceOutput instead of FnOnce where expected

fixes rust-lang#119847
  • Loading branch information
matthiaskrgr authored Jan 17, 2024
2 parents a2eefd2 + d6b99b9 commit 99a8b6a
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 1 deletion.
2 changes: 1 addition & 1 deletion compiler/rustc_middle/src/ty/print/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}),
);
}
Expand Down
21 changes: 21 additions & 0 deletions tests/ui/impl-trait/opaque-used-in-extraneous-argument.rs
Original file line number Diff line number Diff line change
@@ -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
}
78 changes: 78 additions & 0 deletions tests/ui/impl-trait/opaque-used-in-extraneous-argument.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 99a8b6a

Please sign in to comment.